在凤凰中实现记住我

时间:2016-01-03 15:26:19

标签: elixir phoenix-framework

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

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

因此,问题是如何以安全的方式在会话中持久保存用户ID?或者其他方式是什么?

2 个答案:

答案 0 :(得分:7)

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

另一种方式" max_age",我无法在official doc中找到它,但它有效:


<bindings>
   <basicHttpBinding>
      <binding maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" transferMode="Streamed">
         <readerQuotas maxDepth="2000" maxStringContentLength="8192000" maxArrayLength="10000000" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      </binding>
   </basicHttpBinding>
</bindings>
<client>
     <endpoint address="http://localhost:8756/SchedulerService/" binding="basicHttpBinding" contract="Interfaces.WcfServicesInterfaces.ISchedulerWcfService" name="SchedulerService" />
</client>

答案 1 :(得分: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。