I need a user authentication token defined in the SessionController
to be available in layout/app.html.eex
.
My SessionController defines a token and assigns it to a conn
.
token = Phoenix.Token.sign(conn, "user socket", user)
assign(conn, :user_token, token)
Then when I try to use the token in app.html.eex
like the following,
<script>window.userToken = "<%= assigns[:user_token] %>"</script>
or
<script>window.userToken = "<%= @user_token %>"</script>
I get this error: (ArgumentError) assign @user_token not available in eex template.
conn.assigns
are reset on every request. If you want to store something in SessionController
and have it available in future requests, you can use put_session
;
In your SessionController:
token = Phoenix.Token.sign(conn, "user socket", user)
conn
|> put_session(:user_token, token)
|> render(...)
Then, to access it in other controllers, you can use:
token = get_session(conn, :user_token)
To access it in multiple templates, you can then add a plug to the appropriate pipeline(s) in your Router:
pipeline :browser do
...
plug :fetch_user_token
end
...
def fetch_user_token(conn, _) do
conn
|> assign(:user_token, get_session(conn, :user_token))
end
Now you can access the token in any template with @user_token
(or assigns[:user_token]
or assigns.user_token
or @conn.assigns[:user_token]
or @conn.assigns.user_token
; all will give the same result here).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With