【发布时间】:2014-03-04 18:15:17
【问题描述】:
我目前处于以下情况:
我使用以下技术创建了一个用户身份验证系统:
expressjs(使用会话和 cookie)
mysql(保留用户名和密码)
用于持久会话存储的 mongodb
目的是创建一个系统,将用户 ID 存储在 cookie 中,并基于该系统是否允许访问。
第一个问题。如果我正确理解会话是如何工作的,那么每次用户访问我的网站(登录或未登录)时,她/他将使用将存储在 req.sessionID 中的快速会话机制创建一个新的会话 ID。
现在的问题。在登录页面:
用户输入用户名/密码。
我向 mysql 服务器发出请求,确认用户名/密码。现在,根据我在网上找到的示例,进行简单用户身份验证的解决方案是执行以下操作:
req.session.user=用户名
然后稍后检查是否设置了 req.session.user,并在此基础上允许访问用户等。
但是,对于我的网站,用户的用户名是用户的电子邮件。将用户详细信息以纯文本形式存储在 cookie 值中是否安全,即使是出于身份验证目的?
还有哪些其他可用选项?我可以在使用 bcrypt 存储到数据库之前加密用户名并使用它吗?
提前致谢。
一个
【问题讨论】:
-
生成您分配给 cookie 的会话 ID。在后端,您可以跟踪会话 ID 并随时将其过期。如果会话 ID 与您的后端存储的内容不匹配,则不会对其进行身份验证。如果您只是继续使用用户名或电子邮件,那么有什么办法可以防止某人使用其他人的用户名制作会话响应并且现在已通过他们的身份验证?您的服务器不知道什么是有效的,什么是无效的
-
你的问题太宽泛了,但是看看 passeport.js 和 local-strategy,它会比你更好地为你处理这些东西。
-
@mpm - 我看过护照,但我发现自己实现一些更简单的东西更好,这也有助于我理解某些概念。
-
@devshorts - 好的,我明白了。还有一件事。我需要将生成的 sessionID 与后端的每个用户相关联吗?因此,在每个请求中,我都验证 sessionID 是否只是一个有效的,或者我是否需要一个包含用户名 - sessionID 的键值存储。
-
您应该有一个键值存储,其中键是 sessionID,值是您想要该用户的任何相关元数据。