首先,我没有找到任何有用的类似问题或材料。如果我错过了什么,我很抱歉!
其次,我对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));
这种方法的明显缺点是附加集合(即mongodb)或key =>哈希的值(即redis)存储=> userid还需要一些程序来清理旧的会话哈希(计划的task \ cron将运行并删除旧的过期哈希)。
类似于#2的另一种解决方案,而不是使用3-d party collection / key =>值存储,将散列存储为MongoDB中的部分User对象。但是,此方法会消除额外的collection / redis键值,但仍需要计划任务来清除旧的过期会话。并且由于过期会话可能会由“过期日期”属性定义,因此更容易维护活动会话的3-d方集合,而不是将会话相关数据放入MongoDB中的User对象(从而使User对象变得庞大)。
我是Node-js的新手,这就是我要问的原因。我也明白,可能没有正确答案,或者可能与个人偏好有关。
谢谢!
答案 0 :(得分:2)
与传统框架(如PHP / ASP /等)相比,Node / Express中的会话并没有什么特别之处。用户在PHP中登录会怎么做?
只需将用户ID存储在会话中。需要时从Mongo中提取用户数据。
会话数据是安全的(因为客户端无法像使用cookie那样摆弄它),因此您可以依赖会话的用户ID指向已经过正确身份验证的用户数据。