护照更新会话不持久

Passport update session isn't persisting

我正在尝试使用新名称更新我的用户会话,我认为这是一项简单的任务。

我是登录用户,正在访问 'update' 路由,我定义了自己的中间件来更新会话:

module.exports = function(req, res, next) {
    console.log(req.user);
    req.login(req.body.user, function(err) {
       if (err) return next(new Error('Error updating user profile'));
       console.log('USER UPDATED *******', req.user);
       next();
    });
};

挖掘上面的代码花了一些时间,它应该只是更新 Passport 会话对象。它正确地记录了前一个会话,然后是更新后的会话,但是当我在初始响应后导航到新页面时,用户对象完全丢失,只有 returns {}。

有什么想法吗?

source

要登录用户并将其保存到会话中,passport 使用通常将 user.id 存储为 cookie 的 serialize 函数和检索该 cookie 并执行操作的 deserialize 函数User.findById 数据库调用以查找关联的用户,如果找到一个,那就是存储在 req.user 中的用户对象。

req.login 将您传递给它的任何内容作为第一个参数直接传递给 passport.serialize,否则它通常来自一个策略,该策略本身会从数据库中检索用户对象调用,或创建一个。

因此,当您使用 req.login 时,您需要将 passport.serialize 实际收到的用户对象传递给它,以便它可以将 id 存储在 cookie 中。

在你的情况下,你正在做 req.login(req.body.user, ...,因为 req.body.user 来自 POST 表单变量,它不能有 idpassport.serialize会存储在 cookie 中。

您应该改用 req.body.user 的新值并更新 req.user 本身,然后执行 req.login(req.user, ...

var  _ = require('lodash');
module.exports = function(req, res, next) {

    //using lodash merge the updated user into the cached user
    _.merge(req.user, req.body.user);

    req.login(req.user, function(err) {
       if (err) return next(new Error('Error updating user profile'));
       console.log('USER UPDATED *******', req.user);
       next();
    });
};