Passport更新会话不会持久存在

时间:2015-05-13 15:52:06

标签: node.js passport.js

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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

在您的情况下,您正在执行req.login(req.body.user, ...,并且由于req.body.user来自POST表单变量,因此它不能包含idpassport.serialize存储的req.body.user在cookie中。

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

  static void Main(string[] args)
    {
        string hashed = "YOSGtSkJ41KX7K80FEmg+vme4ioLsp3qr28XU8nDQ9c=";

        for (int i = 1000; i <=9999; i++)
        {
            string digit = i.ToString().PadLeft(4, '0');
            string s = ComputeSHA256(digit);
            if (s == hashed)
            {
                Console.WriteLine(digit + "is my decrypted hash");
                break;
            }
        }
        Console.ReadKey();
    }

    static string ComputeSHA256(string plainText)
    {
         SHA256Managed sha256Managed = new SHA256Managed();
        Encoding u16LE = Encoding.Unicode;
        string hash = String.Empty;
        byte[] hashed = sha256Managed.ComputeHash(u16LE.GetBytes(plainText), 0, u16LE.GetByteCount(plainText));
        return Convert.ToBase64String(hashed);
    }