Here is the solution for you. In your router .ex. You put a user token, for example:
defp put_user_token(conn, _) do current_user = get_session(:current_user) user_id_token = Phoenix.Token.sign(conn, "user_id", current_user.id) conn |> assign(:user_id, user_id_token) end
and then you can connect your pipeline:
pipeline :browser do ... plug :put_user_token end
and make sure you put the user token in your app.html.eex:
<script>window.userToken = "<%= assigns[:user_id] %>"</script>
Now you can check your socket in socket.js:
let socket = new Socket("/socket", {params: {token: window.userToken}})
and in your user_socket.ex. You can assign your token using a socket:
def connect(%{"token" => user_id_token}, socket) do case Phoenix.Token.verify(socket, "user_id", user_id_token, max_age: 1209600) do {:ok, id} -> {:ok, assign(socket, :user_id, id)} {:error, reason} -> reason end end
Finally, in your channel:
def handle_info(:after_join, socket) do push socket, "user_joined", %{message: "User #{socket.assigns.user_id} has joined" {:noreply, socket} end