【问题标题】:Implementing remember-me in phoenix在phoenix中实现remember-me
【发布时间】:2016-11-23 19:09:56
【问题描述】:

起初我选择使用put_session 来存储用户ID,因为会话哈希不能被篡改。但是,似乎会话 cookie 仅在浏览器会话期间持续存在。当用户重新打开浏览器时,它就消失了,用户必须重新登录。

我读到另一种选择可能是为每个用户生成一个安全的随机令牌并将其存储在数据库中,并将其放入具有高过期日期的常规 cookie 中。但是,鉴于此 cookie 没有防篡改保护 AFAIK(但我可能错了)并且连接并不总是 https,我猜任何在用户和服务器之间监听 http 的人都能够劫持用户会话.

因此问题是如何以安全的方式在会话中保留用户 ID?或者还有什么其他方法?

【问题讨论】:

  • 我无法给出详细的答案,但我可以给出正确的方向。您可以使用Phoenix.Token (hexdocs.pm/phoenix/Phoenix.Token.html) 生成一个令牌,您将使用put_resp_cookie (hexdocs.pm/plug/Plug.Conn.html#put_resp_cookie/4) 将其存储为cookie。一旦有请求且用户未登录,请使用conn.cookies["remember_me"] 查看带有令牌的记住我 cookie 是否可用并尝试验证它。
  • 感谢您的解释,看来 Phoenix.Token 非常适合这种情况!

标签: elixir phoenix-framework


【解决方案1】:

默认的 cookie “max-age” 是直到关闭 borwser。 您应该给 cookie 一个非常高的“max_age”值: http://hexdocs.pm/plug/Plug.Conn.html#put_resp_cookie/4


另一种方式设置“max_age”,我在official doc 中找不到,但它有效:

defmodule HelloPhoenix.Endpoint do
  use Phoenix.Endpoint, otp_app: :hello_phoenix
. . .
  plug Plug.Session,
    store: :cookie,
    key: "_hello_phoenix_key",
    signing_salt: "Jk7pxAMf",
    max_age: 2592000 # 60*60*24*30
. . .
end

【讨论】:

【解决方案2】:

我正在我的网站上实施“记住我”。使用 Phoenix.Token,cookie 可以被客户端读取。所以我使用 MessageEncryptor (https://github.com/elixir-lang/plug/blob/master/lib/plug/crypto/message_encryptor.ex) 对票证进行加密和签名。然后我使用具有高 max-age 的 put_resp_cookie 将加密的票证放入 cookie。请注意,IE 不支持 max-age,因此“记住我”在 IE 上不起作用。

【讨论】:

    猜你喜欢
    • 2014-05-17
    • 2012-04-21
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 2018-04-14
    • 2012-04-29
    • 2014-02-03
    • 2011-04-14
    相关资源
    最近更新 更多