【问题标题】:Passport update session isn't persisting护照更新会话没有持续
【发布时间】:2015-07-25 00:48:16
【问题描述】:

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

我是一个登录用户并点击“更新”路线,我已经定义了自己的中间件来更新会话:

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 会话对象。它正确记录了上一个会话,然后是更新的会话,但是当我在初始响应后导航到新页面时,用户对象完全丢失并且只返回 {}。

有什么想法吗?

source

【问题讨论】:

  • @laggingreflex 这可能是什么。我只在 req.body.user 中传递我想更新的字段。据我了解它是如何工作的......我会尝试将新的合并到旧的并将其传递进去。
  • @laggingreflex 有效。您能否将您的评论复制到答案中,我将奖励积分

标签: node.js passport.js


【解决方案1】:

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

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

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

在您的情况下,您正在执行 req.login(req.body.user, ... 并且由于 req.body.user 来自 POST Form 变量,因此它不能具有 passport.serialize 将存储在 cookie 中的 id

您应该改用来自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();
    });
};

【讨论】:

    猜你喜欢
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    • 2016-07-28
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多