diff --git a/lib/chess_web/channels/user_socket.ex b/lib/chess_web/channels/user_socket.ex
index a85d1ad..86f2883 100644
--- a/lib/chess_web/channels/user_socket.ex
+++ b/lib/chess_web/channels/user_socket.ex
@@ -1,6 +1,8 @@
defmodule ChessWeb.UserSocket do
use Phoenix.Socket
+ alias Phoenix.Token
+
## Channels
channel "game:*", ChessWeb.GameChannel
@@ -19,8 +21,13 @@ defmodule ChessWeb.UserSocket do
#
# See `Phoenix.Token` documentation for examples in
# performing token verification on connect.
- def connect(_params, socket) do
- {:ok, socket}
+ def connect(%{"token" => token}, socket) do
+ case Token.verify(socket, "game socket", token, max_age: 1209600) do
+ {:ok, user_id} ->
+ {:ok, assign(socket, :current_user, user_id)}
+ {:error, _reason} ->
+ :error
+ end
end
# Socket id's are topics that allow you to identify all sockets for a given user:
diff --git a/lib/chess_web/router.ex b/lib/chess_web/router.ex
index 80c9f71..69c1f30 100644
--- a/lib/chess_web/router.ex
+++ b/lib/chess_web/router.ex
@@ -1,6 +1,8 @@
defmodule ChessWeb.Router do
use ChessWeb, :router
+ alias Phoenix.Token
+
pipeline :browser do
plug :accepts, ["html"]
plug :fetch_session
@@ -15,6 +17,7 @@ defmodule ChessWeb.Router do
pipeline :ensure_auth do
plug Guardian.Plug.EnsureAuthenticated
+ plug :put_user_token
end
pipeline :api do
@@ -45,4 +48,13 @@ defmodule ChessWeb.Router do
resources "/games", ChessWeb.Api.GameController, only: [:show, :update]
end
+
+ defp put_user_token(conn, _) do
+ if current_user = Guardian.Plug.current_resource(conn) do
+ token = Token.sign(conn, "game socket", current_user.id)
+ assign(conn, :user_token, token)
+ else
+ conn
+ end
+ end
end
diff --git a/lib/chess_web/templates/layout/app.html.eex b/lib/chess_web/templates/layout/app.html.eex
index 9a68c20..6fd8065 100644
--- a/lib/chess_web/templates/layout/app.html.eex
+++ b/lib/chess_web/templates/layout/app.html.eex
@@ -41,6 +41,7 @@
+