使用PassportJS,SequelizeJS和JWT令牌时,req.user未定义

时间:2017-01-16 13:20:10

标签: javascript node.js express sequelize.js passport.js

我已经在Stackoverflow上检查了多个答案,并且还完成了文档,但我仍然无法找出可能存在的问题。在我的应用程序中,我使用SequelizeJS访问我的mySQL数据库,现在我尝试使用JWT策略使用PassportJS保护我的REST API端点。

./ app.js

// ...
// passport
app.use(passport.initialize());
require('./config/passport')(passport);
// ...

./配置/ passport.js

var passport     = require('passport');
var passportJwt  = require('passport-jwt');
var models       = require('../models');
var config       = require('./config');

var ExtractJwt = passportJwt.ExtractJwt;
var Strategy   = passportJwt.Strategy;

module.exports = function(passport) {
    var params = {
        secretOrKey: config.jwt.secret,
        jwtFromRequest: ExtractJwt.fromAuthHeader()
    };

    passport.use(new Strategy(params, function(jwt_payload, done) {
        models.User.findOne({
            where: {
                id: jwt_payload.id
            }
        }).then(
            function(user) {
                if (user) {
                    done(null, user);
                } else {
                    done(null, false);
                }
            },
            function(err) {
                return done(err, false);
            }
        );
    }));
};

我试图从这条简单路线的请求中获取用户实体:

var router    = express.Router();
// ...
router.route('/user/me', passport.authenticate('jwt', {  session: false }))
    .get(function(req, res) {
        console.log(req.user);
        res.json(req.user);
    });

我已经创建了另一条路由,它根据提供的用户名和密码返回一个JWT令牌。当我调用/user/me端点时,我将JWT标记附加到标题中,例如:

Authorization: JWT eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MX0.M9z3iWNdjAu4THyCYp3Oi3GOWfRJNCYNUcXOw1Gd1Mo 

所以,我的问题是,当我用一个令牌调用/user/me端点时,req.user将是未定义的,我无法弄清楚是什么原因。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

您的路由定义似乎有误:router.route在第二个参数中不接受中间件,因此根本不会进行身份验证。

应该像是

var router    = express.Router();
// ...
router.route('/user/me')
    .all(passport.authenticate('jwt', {  session: false }))
    .get(function(req, res) {
        console.log(req.user);
        res.json(req.user);
    });