凤凰城会话标识符

时间:2017-10-02 13:48:58

标签: elixir phoenix-framework

我正在创建一个应用程序,该应用程序将对用户进行身份验证并将其转发到传递给第一个get请求的重定向URL。

流程如下: 1.用户单击未在应用程序中托管的静态URL。 2.验证请求(GET)(params =重定向URL)
3.(用户提交表格) - > (验证)(POST)(params =重定向URL& user& pass) 4. Auth在服务器上发生,并将它们转发到重定向,或转储到无效的登录页面。

我的问题是这样的: 如果用户在N倍时间内成功通过身份验证,我不想显示登录页面。我可以用genserver处理那个逻辑没问题。但有没有办法在我点击POST之前创建一个独特的会话存储,这将在我显示表单之前挂在用户身上?

在ASP.NET中,会话容器在用户之间已经是唯一的,所以我希望看看是否有类似凤凰的东西。

感谢您的帮助。

1 个答案:

答案 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)