【问题标题】:passport.authenticate does not execute on a routepassport.authenticate 不在路由上执行
【发布时间】:2016-12-16 11:25:36
【问题描述】:

我在 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) { ... }

但问题是用于身份验证的护照功能不执行。并且“这里:passport-jwt”没有显示。

问题出在哪里?

【问题讨论】:

    标签: node.js express jwt passport.js


    【解决方案1】:

    也许你可以试试这个:

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

    【讨论】:

    • 我试过了,但问题仍然存在。并且路线的方法是post(可能是有所不同)。
    【解决方案2】:

    首先在 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) {
                  ...
               });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-18
      • 1970-01-01
      • 2019-01-31
      • 2020-02-21
      • 1970-01-01
      • 2017-10-20
      • 1970-01-01
      相关资源
      最近更新 更多