我已经在 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/