我正在创建一个应用程序,该应用程序将对用户进行身份验证并将其转发到传递给第一个get请求的重定向URL。
流程如下:
1.用户单击未在应用程序中托管的静态URL。
2.验证请求(GET)(params =重定向URL)
3.(用户提交表格) - > (验证)(POST)(params =重定向URL& user& pass)
4. Auth在服务器上发生,并将它们转发到重定向,或转储到无效的登录页面。
我的问题是这样的: 如果用户在N倍时间内成功通过身份验证,我不想显示登录页面。我可以用genserver处理那个逻辑没问题。但有没有办法在我点击POST之前创建一个独特的会话存储,这将在我显示表单之前挂在用户身上?
在ASP.NET中,会话容器在用户之间已经是唯一的,所以我希望看看是否有类似凤凰的东西。
感谢您的帮助。
答案 0 :(得分:0)
您可以创建一个随机 ID 并使用插件将其保存到会话中。
defmodule App.Plugs.SessionId do
@behaviour Plug
import Plug.Conn
@impl true
def init(default), do: default
@impl true
def call(conn, _config) do
case get_session(conn, :session_id) do
nil ->
session_id = unique_session_id()
put_session(conn, :session_id, session_id)
session_id ->
conn
end
end
defp unique_session_id() do
:crypto.strong_rand_bytes(16) |> Base.encode16()
end
end
但请注意,如果系统的熵较低,:crypto.strong_rand_bytes
会返回错误。
并且在文件 router.ex
的管道中,您需要像这样在 fetch_session
插件之后添加它
...
plug(:fetch_session)
plug(App.Plugs.SessionId)
....
然后你可以在你的控制器中检索会话 ID,比如
session_id = get_session(conn, :session_id)