1

我正在寻找有关使用护照本地策略时的最佳实践的一些信息。我浏览了使用 authToken 的本地策略示例,用于登录持久性,在 github 上找到。在与同事交谈时,他们提出了一个问题,如何将此令牌存储在会话 cookie 中比存储密码更安全,因为它本质上是您在服务器上经过身份验证的身份。那么我该如何回答这个问题呢?这是一个绿色问题,我承认我没有完全理解整个生命周期。那么,当像示例一样与 bccrypt 和 mongo 集成时,这是一个安全的解决方案。如果这只是一个示例,并不一定是为了展示一个强大的解决方案,那么有哪些最佳实践可以保证我们的用户和我们的应用程序的安全?

https://github.com/jaredhanson/passport-local/tree/master/examples/express3-mongoose-rememberme

4

1 回答 1

2

你的同事没有错,实现不是很安全(事实上它可能被认为不太安全,因为 sessionId 可以在没有加密的情况下按原样使用)。

只有在 30 天内才能使用它才更安全,而用户名/密码可以一直使用,直到用户将其删除。(它也更有用,因为您可以在不更改密码的情况下删除 sessionId)。

然而,这不是实现记住我的安全方式,请参阅基于表单的网站身份验证的权威指南,了解有关实现记住我的好方法的信息。

基本上你需要更改 github 代码来执行以下操作:

  1. 保持 cookie 在会话结束时结束(用户关闭浏览器时的 IE)
  2. 如果用户在使用用户名/密码登录时请求记住我,则使用 accessToken(httpOnly cookie)发送一个新的 cookie。
  3. 当客户端使用 accessToken cookie 而不是 sessionId cookie 发送请求时,您使用 accessToken 登录用户,然后将 accessToken 更改为新的 accessToken(在客户端的 cookie 和 db 用户中)

另外,在使用用户名密码登录时始终使用 https(至少)

编辑:我已经把我现在个人使用的一个例子放在一个要点中:https ://gist.github.com/Illniyar/5432646 也许它会帮助你相处(虽然它有点混乱)。令牌像宣传的那样工作,但我还没有使用护照,不过将它移植到护照应该不会太难。还要注意如何保存用户的密码(为每个用户使用不同的盐来保护),以及如何执行注销。

于 2013-04-21T22:35:20.170 回答