有或没有令牌JWT + PASSPORT的路线可用

我希望我可以使用或不使用令牌来访问路由器。 如果用户有一个令牌,比给我req.user

喜欢这个:

 router.get('/profile', function(req, res) { if(req.user) { // or if (req.isAuthenticated()) res.send('logged') } else { res.send('not loggedIn') } }); 

我的应用:

 var JwtStrategy = require('passport-jwt').Strategy, ExtractJwt = require('passport-jwt').ExtractJwt; var opts = {} opts.jwtFromRequest = ExtractJwt.fromAuthHeader(); opts.secretOrKey = 'sh'; passport.use(new JwtStrategy(opts, function(jwt_payload, done) { User.findOne({id: jwt_payload.sub}, function(err, user) { if (err) { return done(err, false); } if (user) { done(null, user); } else { done(null, false); // or you could create a new account } }); })); 

如果我尝试访问/profile没有令牌,工作正常。 但是,当试图访问/profile头中的令牌给我not loggedIn

我想要访问它,即使没有令牌,如果我提供了一个托克,给我的用户。

ps:已经在路由中使用passport.authenticate('jwt')进行了testing并工作。 如果我给令牌让我访问,如果不给我擅自。

改变你的路由器如下

 router.get('/profile', authenticateUser(), profile()); function authenticateUser(req, res, next) { // your strategy here... if (authenticated) { req.user = user; next(); } else { return res.status(401).send("Not authenticated"); } } function profile(req, res, next) { var userId = req.user.id; User.findById(userId, function(err, user) { if (err) { return res.status(500).json(err); } return res.json(user); }) } 

你应该使用下面的一个访问请求数据

 if (req.params.user) {do something...} 

要么

 if (req.body.user) {do something...} 

请求对象没有用户属性。

这是我如何做到这一点:

 const passport = require('passport'); const optionalJwt = function (req, res, next) { if (req.headers['authorization']) { return passport.authenticate('jwt', { session: false })(req, res, next); } return next(); }; app.get('/my/route', optionalJwt, function (req, res, next) { if (req.isAuthenticated()) { res.send('My name is ' + req.user.name); } else { res.send('I\'m not authenticated :('); } }); 

如果包含auth头文件但令牌已过期或无效,它仍然会失败,但它可能是有用的。 对我来说呢。