使用 passport-jwt 和结语,我的 req.user 是空的
Using passport-jwt and epilogue, my req.user is empty
我的中间件代码是:
exports.isAuthenticated = (req, res, context) => {
return new Promise((resolve, reject) => {
return passport.authenticate('jwt',{session: false}, (err, user, info) => {
if(err) {
res.status(500).send({message: 'Internal Server Error'})
return resolve(context.stop);
}
if(user) {
return resolve(context.continue);
} else {
res.status(401).send({message: 'Unauthorized'})
return resolve(context.stop)
}
})(req, res);
});
}
我的结语代码是:
// Data plan REST API
const dataplan = epilogue.resource({
model: global.db.DataPlan,
endpoints: ['/api/dataplan', '/api/dataplan/:id']
});
dataplan.all.auth(middleware.isAuthenticated)
dataplan.use(require('./epilogue/dataplan.js'))
我的 dataplan.js
是:
module.exports = {
list: {
auth: async function (req, res, context) {
console.log(req.user)
return context.continue
},
send: {
....
但是我的 req.user
在我的 list.auth
中是空的。我做错了什么?
TL;DR
如果您向它提供回调,passport.authenticate
不会设置 req.user
。必须自己设置。
解决方案
我能够重现您的案例,并且该行为符合预期。
为了修复它,我不得不像这样更新你的授权中间件:
exports.isAuthenticated = (req, res, context) => {
return new Promise((resolve, reject) => {
return passport.authenticate('jwt',{session: false}, (err, user, info) => {
if(err) {
res.status(500).send({message: 'Internal Server Error'})
return resolve(context.stop);
}
if(user) {
req.user = user; // Manually set the user in req
return resolve(context.continue);
} else {
res.status(401).send({message: 'Unauthorized'})
return resolve(context.stop)
}
})(req, res);
});
}
我在认证成功时手动将user
分配给req.user
。这正确地解决了这个问题。
为什么会这样?
通过查看 passport source code,我注意到如果用户自己提供回调,passport.authenticate
函数将自身短路。
这意味着您必须自己设置该值。
我的中间件代码是:
exports.isAuthenticated = (req, res, context) => {
return new Promise((resolve, reject) => {
return passport.authenticate('jwt',{session: false}, (err, user, info) => {
if(err) {
res.status(500).send({message: 'Internal Server Error'})
return resolve(context.stop);
}
if(user) {
return resolve(context.continue);
} else {
res.status(401).send({message: 'Unauthorized'})
return resolve(context.stop)
}
})(req, res);
});
}
我的结语代码是:
// Data plan REST API
const dataplan = epilogue.resource({
model: global.db.DataPlan,
endpoints: ['/api/dataplan', '/api/dataplan/:id']
});
dataplan.all.auth(middleware.isAuthenticated)
dataplan.use(require('./epilogue/dataplan.js'))
我的 dataplan.js
是:
module.exports = {
list: {
auth: async function (req, res, context) {
console.log(req.user)
return context.continue
},
send: {
....
但是我的 req.user
在我的 list.auth
中是空的。我做错了什么?
TL;DR
如果您向它提供回调,passport.authenticate
不会设置 req.user
。必须自己设置。
解决方案
我能够重现您的案例,并且该行为符合预期。
为了修复它,我不得不像这样更新你的授权中间件:
exports.isAuthenticated = (req, res, context) => {
return new Promise((resolve, reject) => {
return passport.authenticate('jwt',{session: false}, (err, user, info) => {
if(err) {
res.status(500).send({message: 'Internal Server Error'})
return resolve(context.stop);
}
if(user) {
req.user = user; // Manually set the user in req
return resolve(context.continue);
} else {
res.status(401).send({message: 'Unauthorized'})
return resolve(context.stop)
}
})(req, res);
});
}
我在认证成功时手动将user
分配给req.user
。这正确地解决了这个问题。
为什么会这样?
通过查看 passport source code,我注意到如果用户自己提供回调,passport.authenticate
函数将自身短路。
这意味着您必须自己设置该值。