Jas*_* O. 6 token elixir phoenix-framework
我需要在定义用户身份验证令牌SessionController为处于可用layout/app.html.eex.
我的SessionController定义了一个令牌并将其分配给一个令牌conn.
token = Phoenix.Token.sign(conn, "user socket", user)
assign(conn, :user_token, token)
Run Code Online (Sandbox Code Playgroud)
然后,当我尝试app.html.eex像下面这样使用令牌时,
<script>window.userToken = "<%= assigns[:user_token] %>"</script>
or
<script>window.userToken = "<%= @user_token %>"</script>
Run Code Online (Sandbox Code Playgroud)
我收到此错误: (ArgumentError) assign @user_token not available in eex template.
conn.assigns每次请求都会重置.如果您想要存储某些内容SessionController并在将来的请求中使用它,您可以使用put_session;
在SessionController中:
token = Phoenix.Token.sign(conn, "user socket", user)
conn
|> put_session(:user_token, token)
|> render(...)
Run Code Online (Sandbox Code Playgroud)
然后,要在其他控制器中访问它,您可以使用:
token = get_session(conn, :user_token)
Run Code Online (Sandbox Code Playgroud)
要在多个模板中访问它,您可以将插件添加到路由器中的相应管道:
pipeline :browser do
...
plug :fetch_user_token
end
...
def fetch_user_token(conn, _) do
conn
|> assign(:user_token, get_session(conn, :user_token))
end
Run Code Online (Sandbox Code Playgroud)
现在,您可以使用@user_token(或assigns[:user_token]或assigns.user_token或@conn.assigns[:user_token]或@conn.assigns.user_token所有将在此处给出相同结果)访问任何模板中的令牌.