passport.authenticate 不在路线上执行

passport.authenticate does not execute on a route

我在 express 项目中使用 Passport-jwt 策略进行身份验证,

这里是这个目录中的 mt passport-jwt 配置:/config/passport.js

var JwtStrategy = require('passport-jwt')
 .Strategy,
 ExtractJwt = require('passport-jwt')
 .ExtractJwt;

var User = require(__dirname + '/../models/user');
var config = require(__dirname+ '/database');

module.exports = function(passport) {
    console.log("here: passport-jwt");
 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);
   }
  });
 }));
};

在 /routes/account.js 目录中的帐户路由中,我这样称呼它:

var passport = require('passport');
require(__dirname + '/../config/passport')(passport);

router.post('/', passport.authenticate('jwt', {
session: false
}), function(req, res) { ... }

但问题是用于身份验证的护照功能未执行。 "here: passport-jwt" 没有显示。

问题出在哪里?

也许你可以试试这个:

router.get('/', function(req, res) { 
    passport.authenticate('jwt', 
       {
       session: false
       });
});  

首先在app.js中,路由必须这样声明:

添加这些行后:

var passport = require('passport');  
app.use(passport.initialize());

您应该添加这些行:

var account = require(__dirname + '/routes/account')(app, express, passport);
app.use('/account', account);

在路线本身:

module.exports = function(app, express, passport) {

    var router = express.Router();

    router.post('/', function(req, res) {

        passport.authenticate('jwt', function(err, user) {
        if (err) {
                res.sendStatus(406);
            } else {
                if (!user) {
                    res.sendStatus(400);
                } else {...}
            }
       });
        }

    }
}

我的错误是将 console.log("here: passport-jwt"); 放在模块的第一行,但实际上 passport.use(..) 部分每次都执行!

最后是护照配置中的findOne部分,passport.use(...)部分,当你想在MongoDB中使用本机id时,你应该查询_id而不是 id!

所以,正确的代码是:

User.findOne({
            _id: jwt_payload.id
        }, function(err, user) {
              ...
           });