【发布时间】:2017-04-24 13:29:02
【问题描述】:
我正在尝试使用 Openmaize 进行用户身份验证,并且在用户登录时无法让 phoenix 传递令牌。似乎没有分配令牌并将其传递给客户端,因此 Phoenix.Token.verify 失败。
UserSocket.connect 中的IO.inspect(socket) 返回这个。
Phoenix.Socket{assigns: %{}, channel: nil, channel_pid: nil,
endpoint: SeatSaver.Endpoint, handler: SeatSaver.UserSocket, id: nil,
joined: false, pubsub_server: SeatSaver.PubSub, ref: nil,
serializer: Phoenix.Transports.WebSocketSerializer, topic: nil,
transport: Phoenix.Transports.WebSocket, transport_name: :websocket,
transport_pid: #PID<0.2098.0>}
我在 authenticate.ex 控制器中定义了 set_current_user(user, conn) 函数,看起来像
defp set_current_user(user, conn) do
token = Phoenix.Token.sign(conn, "user socket", user.id)
conn
|> assign(:current_user, user)
|> assign(:user_token, token)
在app.html.eex中,添加了以下内容。
<script> window.userToken = “<%= assigns[:user_token] %>” </script>
<script src = “<%= static_path(@conn, “/js/app.js”) %>”></script>
在app.js,
let socket = new Socket(”/socket”, {
params: {token: window.userToken},
…
})
最后,user_socket.ex 有
def connect(%{"token" => token}, socket) do
case Phoenix.Token.verify(socket, "user socket",
token, max_age: @max_age) do
{:ok, user_id} ->
IO.inspect(user_id)
{:ok, assign(socket, :user_id, user_id)}
{:error, _reason} ->
:error # this errors out because token is nil
end
end
【问题讨论】:
-
window.userToken 设置是否正确?您可以在您的模板中使用
@user_token,如果它在分配时不存在,则会引发。 -
谢谢。它给了我一个错误。 "分配 @user_token 在 eex 模板中不可用"
-
你确定要调用 set_user_token 吗?你能发布剩下的功能吗?
-
正如您所怀疑的,它没有被调用。我将代码移至 router.ex,它现在可以工作了。我仍然不知道为什么是 Openmaize。验证插件没有调用该函数。谢谢。
标签: authentication elixir phoenix-framework