使用 Guardian 在 Phoenix 中记住我的功能

Remember me functionality in Phoenix using Guardian

我正在为使用 Guardian 处理身份验证的 Web 应用程序开发登录系统。 在我的 Guardian 配置中,我有

ttl: {30, :days}

用户的令牌通过调用存储在 cookie 中:

defp login(conn, user) do
  conn
  |> Guardian.Plug.sign_in(user)
end

像这样,令牌的有效期为 30 天,即使浏览器关闭也会保留(cookie 的预期行为)。 但是,用户应该能够选择在登录期间是否被记住。 如果不是,则必须在关闭浏览器时从 cookie 中删除令牌 window。 我试过设置

ttl: {0, :days}

它似乎完成了所需的行为。表示:

  1. ttl: {0, :days} 是否是在浏览器 window 关闭之前验证用户身份的正确方法?如果是这样,如何在调用 Guardian.Plug.sign_in(conn, user) 之前以编程方式更改管道中的 ttl 值?
  2. Guardian 是否能够根据用户选择将令牌存储在 cookie 或会话存储中? (选定的 cookie 记住我,如果没有则存储会话)

也许检查 Guardian.Plug.remember_me/4 function. There's an example on Guardian's GitHub.

# Set a "refresh" token directly on a cookie.
# Can be used in conjunction with `Guardian.Plug.VerifyCookie`
conn = MyApp.Guardian.Plug.remember_me(conn, resource)

在这里更改 TTL 非常危险,因为这意味着在登录后您的令牌已过期,因此如果您授权 every 单个 API 路由将不起作用基于令牌的请求。

Guardian 能够同时存储会话和令牌,因此您可能需要根据需要自定义身份验证系统。