使用 passport-jwt 和结语,我的 req.user 是空的
Posted
技术标签:
【中文标题】使用 passport-jwt 和结语,我的 req.user 是空的【英文标题】:Using passport-jwt and epilogue, my req.user is empty 【发布时间】:2018-10-27 21:32:25 【问题描述】:我的中间件代码是:
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
中是空的。我做错了什么?
【问题讨论】:
我不认为你可以在这里使用async
函数,因为它似乎基于express,它期望普通函数是中间件
尝试使用这个包,它可以让你在你的快速函数中使用异步:npmjs.com/package/express-async-errors
您是否尝试过在中间件中打印一些内容以确保在您期望的时候调用它?
【参考方案1】:
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
函数将自行短路。
这意味着您必须自己设置值。
【讨论】:
以上是关于使用 passport-jwt 和结语,我的 req.user 是空的的主要内容,如果未能解决你的问题,请参考以下文章
混合护照-facebook和passport-jwt的最佳方法是什么?