在 phoenix 中实现 remember-me

Implementing remember-me in phoenix

一开始我选择使用put_session来存储用户id,因为session hash是不可篡改的。但是,会话 cookie 似乎只在浏览器会话期间持续存在。当用户重新打开浏览器时,它就消失了,用户必须重新登录。

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

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

我正在我的网站上实施 "Remember me"。使用 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,因此 "Remember me" 无法在 IE 上运行。

默认 cookie "max-age" 直到关闭浏览器。 你应该给 cookie 一个非常高的 "max_age" 值: http://hexdocs.pm/plug/Plug.Conn.html#put_resp_cookie/4


另一种方式设置"max_age",我在official文档中找不到它,但它有效:

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