我正在尝试使用新名称更新我的用户会话,这是我认为的一项简单任务。
我是登录用户并且点击了“更新”路线,我已经定义了自己的中间件来更新会话:
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会话对象。它正确记录了上一个会话,然后记录了更新的会话,但是当我在初始响应后导航到新页面时,用户对象完全丢失,只返回{}。
有什么想法吗?
答案 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表单变量,因此它不能包含id
将passport.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);
}