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 不同的令牌相同的结果的主要内容,如果未能解决你的问题,请参考以下文章
NodeJs Express passport-jwt 从令牌中获取错误的用户
如何使用passport-jwt在nodejs中发送/提取JWT令牌?
我在我的 nestJS 应用程序(使用 authGuard)中使用了 passport-jwt 身份验证策略,如何访问我的控制器中的令牌有效负载?