如何解决使用Cookie的JWT身份验证中的意外行为
我正在学习Node.js并开始我的第一个项目。我在项目上使用JWT进行用户身份验证。我正在使用cookie发送JWT,并且在服务器端可以提取cookie并正确获取预期的有效负载。但是我遇到了意外的行为,因为在身份验证功能中,我总是被一个特定的用户注册。
登录路线:
usersRouter.route('/login')
.post(passport.authenticate('local'),(req,res) => {
console.log('Generating token for: ',req.user._id);
var token = authenticate.getToken({_id: req.user._id});
res.statusCode = 200;
res.cookie('jwt',token,{signed: true});
res.redirect('/');
})
验证码:
exports.getToken = function(user){
return jwt.sign(user,config.secretKey,{
expiresIn: 3600
});
};
var extractFromCookie = function (req)
{
var token = null;
if(req && req.signedCookies)
token = req.signedCookies.jwt;
return token;
}
var opts = {};
opts.jwtFromRequest = extractFromCookie;
opts.secretOrKey = config.secretKey;
exports.jwtPassport = passport.use(new JwtStrategy(opts,(jwt_payload,done) => {
console.log("Jwt Payload: ",jwt_payload);
User.findOne({id: jwt_payload.sub},(err,user) => {
if(err){
return done(err,false);
}
else if(user){
console.log('Found user is: ',user);
return done(null,user);
}
else
return done(null,false);
});
}));
exports.verifyUser = passport.authenticate('jwt',{session:false});
在控制台中打印
Jwt Payload: { _id: '5f49430180e4092eac7962be',iat: 1599066593,exp: 1599070193 }
Found user is:
{
_id: 5f4904d106efe130084808a4,.
.
. other details
.
}
搜索如何导致具有不同ID的用户?我不知道为什么会这样。请帮忙!
编辑:getToken是从登录路由器发送的用户ID生成令牌的功能。
解决方法
您意外访问了sub
中未定义的属性jwt_payload
,因此您实际上将undefined
作为值发送给了findOne
函数。
这应该有效。
User.findById(jwt_payload._id,(err,user) => {
,
毕竟这只是一些小错误。
唯一需要更改的内容如下:
User.findOne({id: jwt_payload.sub},user) =>
正如@Michael指出的那样,jwt_payload中没有字段名称子,我们需要添加_id。另外,在用户架构中,它是_id字段而不是id字段。
进行这些更改,然后中提琴!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。