REST API不会根据标头中的Passport JWT令牌更改用户?

所以我有一个用Node.JS,MongoDB和Express编写的REST API。 我正在使用护照和passport-jwt使用JSON Web令牌进行身份validation,但是当我为不同的用户帐户使用不同的令牌时,请求每次都保存相同的用户。

这里是routes.js中的身份validation端点:

// Authenticate the user and get a JSON Web Token to include in the header of future requests. apiRoutes.post('/authenticate', function(req, res) { User.findOne({ email: req.body.email }, function(err, user) { if (err) throw err; if (!user) { res.send({ success: false, message: 'Authentication failed. User not found.' }); } else { // Check if password matches user.comparePassword(req.body.password, function(err, isMatch) { if (isMatch && !err) { // Create token if the password matched and no error was thrown var token = jwt.sign(user, config.secret, { //expiresIn: 10080 // in seconds }); res.json({ success: true, token: 'JWT ' + token, _id: user._id }); } else { res.send({ success: false, message: 'Authentication failed. Passwords did not match.' }); } }); } }); }); 

所以,如果用户凭证在数据库中匹配,它将创build一个新的令牌并将其返回。 然后我把这个标记放到这个端点的头部:

 // GET user apiRoutes.get('/users', passport.authenticate('jwt', { session: false }), function(req, res) { res.json(req.user); }); 

我可以每次validation一个新用户,并且每次都得到一个不同的令牌,但是/ users端点总是返回同一个用户。 其他的东西都在API中工作,数据库在注册新用户时会得到更新,而其他的东西都被返回,但即使是不同的令牌,同一个用户也会从护照中返回。 我知道,我正在邮递员头上正确地使用授权的密钥和JWT前面的令牌的价值,但我不明白为什么会发生这种情况。

这是我的passport.js,如果它很重要:

 var JwtStrategy = require('passport-jwt').Strategy; var ExtractJwt = require('passport-jwt').ExtractJwt; var User = require('../models/user'); var config = require('./main'); // Setup work and export for the JWT passport strategy module.exports = function(passport) { var opts = {}; opts.jwtFromRequest = ExtractJwt.fromAuthHeader(); opts.secretOrKey = config.secret; passport.use(new JwtStrategy(opts, function(jwt_payload, done) { User.findOne({id: jwt_payload.id}, function(err, user) { if (err) { return done(err, false); } if (user) { done(null, user); } else { done(null, false); } }); })); }; 

有任何想法吗?

Mongo在文档ID之前使用“_”。 而不是有User.findOne({id:jwt_payload.id}你应该有User.findOne({_ id:jwt_payload._id},并应该解决这个问题。

 var JwtStrategy = require('passport-jwt').Strategy; var ExtractJwt = require('passport-jwt').ExtractJwt; var User = require('../models/user'); var config = require('./main'); // Setup work and export for the JWT passport strategy module.exports = function(passport) { var opts = {}; opts.jwtFromRequest = ExtractJwt.fromAuthHeader(); opts.secretOrKey = config.secret; passport.use(new JwtStrategy(opts, function(jwt_payload, done) { User.findOne({_id: jwt_payload._id}, function(err, user) { if (err) { return done(err, false); } if (user) { done(null, user); } else { done(null, false); } }); })); }; 

所以我发现它显示的是用户文档中的第一个条目,因为JWT太大了。 所以我改变了authentication路线,使JWT脱离了用户的用户名和用户名,如下所示:

 apiRoutes.post('/authenticate', function(req, res) { User.findOne({ email: req.body.email }, function(err, user) { if (err) throw err; if (!user) { res.send({ success: false, response: 'Authentication failed. User not found.' }); } else { // Check if password matches user.comparePassword(req.body.password, function(err, isMatch) { if (isMatch && !err) { // Create token if the password matched and no error was thrown var token = jwt.sign({id: user._id, username: user.username }, config.secret, { expiresIn: 10080 // in seconds }); res.json({ success: true, response: 'Authentication succeeded! User found.', token: 'JWT ' + token}); } else { res.send({ success: false, response: 'Authentication failed. Passwords did not match.' }); } }); } }); }); 

Payload在版本5.5.4中的jwt.sign之后有更多的数据,现在_id是_doc在有效负载下的一部分。

正如上面提到的“SamuelDuke”是正确的,只需转到jwt_payload._doc._id。 看下面更新的代码。

 var JwtStrategy = require('passport-jwt').Strategy; var ExtractJwt = require('passport-jwt').ExtractJwt; var User = require('../models/user'); var config = require('./main'); // Setup work and export for the JWT passport strategy module.exports = function(passport) { var opts = {}; opts.jwtFromRequest = ExtractJwt.fromAuthHeader(); opts.secretOrKey = config.secret; passport.use(new JwtStrategy(opts, function(jwt_payload, done) { User.findOne({_id: jwt_payload._doc._id}, function(err, user) { if (err) { return done(err, false); } if (user) { done(null, user); } else { done(null, false); } }); })); };