Node.js 使用Cookie的JWT身份验证中的意外行为

Node.js 使用Cookie的JWT身份验证中的意外行为,node.js,mongoose,jwt,passport.js,passport-local,Node.js,Mongoose,Jwt,Passport.js,Passport Local,我正在学习Node.js并制作我的第一个项目。我正在使用JWT对项目进行用户身份验证。我使用cookies发送JWT,在服务器端我能够提取cookie并正确获得预期的负载。然而,我面临着一个意想不到的行为,因为在身份验证功能中,我总是被一个特定的用户注册 登录路径: usersRouter.route('/login') .post(passport.authenticate('local'), (req,res) => { console.log('Generating token

我正在学习Node.js并制作我的第一个项目。我正在使用JWT对项目进行用户身份验证。我使用cookies发送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生成令牌的函数。

您意外地访问了
jwt\U有效负载中的未定义属性
sub
,因此实际上将
未定义的
作为值发送到
findOne
函数

这应该行得通

User.findById(jwt_payload._id, (err,user) => {

毕竟这只是一些小错误

唯一需要改变的是:
User.findOne({id:jwt\u payload.sub},(err,User)=>

正如@Michael指出的,jwt_负载中没有字段名sub,我们需要将_id改为。此外,在用户模式中,它是_id字段,而不是id字段


进行了这些更改,viola!

什么是
身份验证。getToken
?@WiktorZychla getToken是一个使用用户id生成令牌的函数。我编辑了帖子。我尝试过这样做,但user.findOne函数甚至没有执行。它只是发送未经授权的用户。调用
findOne
回调函数吗?什么是错误的
err
/
user
?调用findOne回调,但由于无法找到“id”字段,因此出现错误(状态401)。我编辑了我的答案,我认为这是正确的答案:)