我在使用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);
});
答案 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
)