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

Posted

技术标签:

【中文标题】Passport-jwt 不同的令牌相同的结果【英文标题】:Passport-jwt different tokens same result 【发布时间】:2017-02-15 18:07:20 【问题描述】:

我在使用护照和 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 sn-p

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);
);

【问题讨论】:

【参考方案1】:

您需要检查生成 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

【讨论】:

【参考方案2】:

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

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, ...

【讨论】:

【参考方案3】:

在passport中间件中,编辑JwtStrategy这一行:

发件人:

id: jwt_payload.sub

收件人:

_id: jwt_payload._doc._id

【讨论】:

以上是关于Passport-jwt 不同的令牌相同的结果的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 passport-jwt 正确检查令牌有效负载?

NodeJs Express passport-jwt 从令牌中获取错误的用户

如何使用passport-jwt在nodejs中发送/提取JWT令牌?

我在我的 nestJS 应用程序(使用 authGuard)中使用了 passport-jwt 身份验证策略,如何访问我的控制器中的令牌有效负载?

使用 passport-jwt 进行 JWT 身份验证不考虑到期日期

混合护照-facebook和passport-jwt的最佳方法是什么?