Dmi*_*sev 5 authentication session node.js
首先,我没有找到任何有用的类似问题或材料.如果我错过了什么,我很抱歉!
其次,我对node-passport或connect-auth或everyauth这样的现成解决方案不感兴趣
现在回答这个问题.我正在使用Redis存储快速会话.我的问题是,当用户进行身份验证时(即在发布了用户名和密码的帖子并且在集合中找到了这样的用户之后)我应该在会话中存储什么?
我可以存储整个用户对象(例如,它来自MongoDB的方式).我看到的一个缺点是,当用户在DB中被修改(他编辑了他的个人资料)时,我必须在会话中"重新设置"用户对象.如果例如管理员更改了用户的配置文件,则会变得更加复杂 - 在这种情况下,会话不知道用户已被修改并且其数据需要从数据库刷新,因此会话当前持有过时的用户对象仅在用户下次登录时更新.
创建"hash => userid"的集合,并仅在会话中存储哈希.然后每个请求调用一个将检查的中间件(下面的伪代码,省略了对非现有哈希的检查,在这种情况下,用户可能被认为自会话过期后未登录):
if(userqsh in req.session)res.local.user = db.users.findById(db.sessions.findUserIdByHash(req.session.userhash));
这个方法明显的缺点是hash => userid的附加集合(即mongodb)或key => value(即redis)存储,这也需要一些程序来清理旧的会话哈希(将运行的计划任务\ cron和删除旧的过期哈希).
类似于#2的另一种解决方案,而不是使用3-d party collection/key => value storage,将散列存储为MongoDB中的部分User对象.但是,此方法会消除额外的collection/redis键值,但仍需要计划任务来清除旧的过期会话.并且由于过期会话可能会由"过期日期"属性定义,因此更容易维护活动会话的3-d方集合,而不是将会话相关数据放入MongoDB中的User对象(从而使User对象变得庞大).
我是Node-js的新手,这就是我要问的原因.我也明白,可能没有正确答案,或者可能与个人偏好有关.
谢谢!
与传统框架(如 PHP/ASP/其他框架)相比,Node/Express 中的会话确实没有什么特别之处。您将如何处理 PHP 中的用户登录?
只需将用户 ID 存储在会话中即可。需要时从 Mongo 中提取用户数据。
会话数据是安全的(因为客户端无法像使用 cookie 那样修改它),因此您可以依赖会话的用户 ID 指向已正确验证的用户数据。