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

./app.js

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

./config/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 token 的路由。当我调用 /user/me 端点时,我将 JWT token 附加到 header 中,例如:
Authorization: JWT eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MX0.M9z3iWNdjAu4THyCYp3Oi3GOWfRJNCYNUcXOw1Gd1Mo

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

预先感谢您的帮助!

最佳答案

您的路由定义似乎是错误的: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);
    });

关于javascript - 使用 PassportJS、SequelizeJS 和 JWT token 时 req.user 未定义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41677366/

10-11 23:29
查看更多