护照JWT req.user在我的一个路由中是未定义的

我有一个绝对的噩梦试图与我的快速应用程序设置智威汤逊! 认为我现在主要工作,我有一个注册路线和login路线,这两个工作正常,并生成有效的令牌,我有我的'/用户'路线中的另一个路线,我testing身份validation,这一切都很好。 但是我有另外一个包含'/ api'path的文件,这个文件的身份validation实际上非常重要,我有一条类似的testing路线,试图访问req.user(就像我在其他路线中那样),但是它看起来像req。用户未定义。 通过一些debugging它看起来像用户在req.account这是非常奇怪的,我不明白为什么它不在req.user

我在/config/passport.js中定义了我的jwt策略

'use strict'; const User = require('../models/user'), config = require('./main'), JwtStrategy = require('passport-jwt').Strategy, ExtractJwt = require('passport-jwt').ExtractJwt; //exported to be used by passport in server set up module.exports = function (passport) { const jwtOptions = { // Telling Passport to check authorization headers for JWT jwtFromRequest: ExtractJwt.fromAuthHeader(), // Telling Passport where to find the secret secretOrKey: config.secret }; const jwtLogin = new JwtStrategy(jwtOptions, function(payload, done) { User.findById(payload._id, function(err, user) { if (err) { return done(err, false); } if (user) { done(null, user); } else { done(null, false); } }); }); passport.use(jwtLogin); } 

护照作为parameter passing给主文件,然后在主文件中初始化

这里是/用户路由文件,这工作正常。 发送GET请求到/ users / isAuth与授权标题和'JWT'工作正常,我得到我的用户名发回给我

 "use strict"; const express = require('express'), router = express.Router(), jwt = require('jsonwebtoken'), User = require('../models/user'), config = require('../config/main'), passport = require ('passport'); function generateToken(user) { return jwt.sign({_id: user._id}, config.secret, { expiresIn: 10080 }); } . . Here are routes for login and register they perform as expected . and work fine . /* ================================== Test Authentication Route ================================== */ router.get('/isAuth', passport.authenticate('jwt', { session: false }), function(req, res) { console.log(req.user); res.json({username: req.user.username}); }); module.exports = router; 

在这个文件中,对于发送GET / api / testAuth请求的api路由,与以前完全一样,使用相同的标记和相同的头文件,返回no req.user,并在控制台中看到req.user未定义。 但是在控制台里,好像是req.account这样的用户对象呢? 我不明白这里发生了什么希望有人可以帮助!

 "use strict"; const express = require('express'), router = express.Router(), jwt = require('jsonwebtoken'), Server = require('../models/server'), passport = require('passport'); // Test route to see if logged in user is matt router.get('/testAuth', passport.authorize('jwt', { session: false }), function(req, res) { console.log(req.user); if (req.user) { if(req.user.username == "matt") { res.send("You are matt!"); } else { res.send("You are not matt!"); } } else { res.send("no req.user"); } }) module.exports = router; 

您在testAuth路由中使用passport.authorize ,这是针对已经login并具有会话信息的用户。 由于您没有使用会话存储,因此您没有持久的req.user对象,因此应该在所有路由上使用passport.authenticate

http://passportjs.org/docs/authorize