Passport-jwt不同令牌的结果相同

时间:2016-10-06 20:52:12

标签: node.js authentication express jwt passport.js

我在使用passport和jwt设置我的第一个项目时遇到了问题。使用Postman我尝试使用不同的帐户登录,但如果我尝试返回req.user对象,则会返回相同用户的信息。否则,如果我尝试记录jwt_payload它是正确的(不同用户的信息)。谁能解释我为什么? (我插入选项session: false

我的jwt策略功能:

var confStrategy = function(passport) {
  passport.use( new JwtStrategy( opts, function(jwt_payload,done) {
      User.findOne({id: jwt_payload.sub},function(err,user) {

          if(err) return done(err,none);
          if(user) {
            done(null,user);
          } else {
            done(null,false);
          }
      });
  }));
};

app.js代码段

app.use(passport.initialize());
passConf.confStrategy(passport);

app.get('/api/:name',passport.authenticate('jwt', { session: false }),function(req,res) {
  console.log(req.user);
  res.send('Hello ' + req.user.email);
});

3 个答案:

答案 0 :(得分:0)

在护照中间件中,编辑JwtStrategy

的行

自:

{id: jwt_payload.sub}

要:

{_id: jwt_payload._doc._id}

答案 1 :(得分:0)

我遇到了同样的问题!下面的代码对我有用。

module.exports = function(passport) {  ;
passport.use(new JwtStrategy(opts, function(jwt_payload, done) {
 User.findById(jwt_payload._id, function(err, user) {
  if (err) {
    return done(err, false);
  }
    if (user) {
      done(null, user);
    } else {
      done(null, false);
    }
  });
 }));
};

问题在于User.findOne({id:jwt_payload.sub},...

答案 2 :(得分:0)

您需要检查生成JWT令牌的代码,无论您在JWT生成时间设置的有效负载如何。当JWTStrategy对其进行解码时,您将获得具有相同名称的相同Payload。 (因为你每次都得到同一个用户,检查它是否是硬编码的)

以下行生成JWT令牌

var token = jwt.sign({uid: user.id}, secretOrKey, {expiresIn: 6000});

以下是JWT战略代码。

passport.use(new JwtStrategy(jwtOptions, function(_payload, _next) {
  var done = false;
  if((_payload.uid)) {
   //Do something 
  }
}));

您需要保持名称相同(在上述情况下为uid