【问题标题】:Phoenix Session IdentifierPhoenix 会话标识符
【发布时间】:2021-02-24 18:01:42
【问题描述】:

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

流程是这样的: 1. 用户点击不在应用程序中托管的静态 URL。 2. 验证请求 (GET)(参数 = 重定向 URL)
3. (用户提交表单) -> (Authenticate) (POST) (params = redirect URL & user & pass) 4. 身份验证发生在服务器上并将它们转发到重定向,或者转储到无效的登录页面。

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

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

感谢您的帮助。

【问题讨论】:

  • 你看过Plug.Session / Plug.Conn.put_session/Plug.Conn.get_session (hexdocs.pm/plug)吗?
  • 是的,我有。我看到的所有示例都是在会话用户之间使用唯一键。喜欢用户名。在我知道谁是谁之前,我需要唯一的会话容器。

标签: elixir phoenix-framework


【解决方案1】:

您可以创建一个随机 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-29
    • 2017-10-09
    • 2010-10-17
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    相关资源
    最近更新 更多