I’m trying out Phoenix 1.7 rc-0
I used the generator to create mix phx.gen.channel Space
, then added token verification to the UserSocket and assigned the verified user_id to the socket by returning {:ok, assign(socket, user_id: user_id}
However in the Channel, in the join
function, when I inspect the socket.assigns it is still an empty map instead of having the :user_id
in it.
Is this a change in behavior, or user error? Thanks
Link to repo: GitHub - homanchou/thexr
The issue that you’re facing is pretty common for those who have just started their Elixir journey from other languages and runtimes; you’re using the old socket, not the new one that was given the assign
call. Take a look at this part here: thexr/user_socket.ex at main · homanchou/thexr · GitHub
In your case
expression, you’ve done all your work and when that expression evaluates, it’s either going to return :error
or {:ok, socket}
. However, the line I’ve highlighted effectively throws your new result away. Instead, what we want to do is just return the evaluated case
expression like so:
def connect(%{"token" => token}, socket, _connect_info) do
case Phoenix.Token.verify(socket, "salt", token, max_age: 1_209_600) do
{:ok, member_id} ->
socket = assign(socket, member_id: member_id)
{:ok, socket}
{:error, reason} ->
Logger.error("#{__MODULE__} connect error #{inspect(reason)}")
:error
end
end
omgerg, how did i miss that. thank u!