使用 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 是空的的主要内容,如果未能解决你的问题,请参考以下文章

Passport-jwt 不同的令牌相同的结果

混合护照-facebook和passport-jwt的最佳方法是什么?

如何使用 passport-jwt 验证路由?

NodeJs Express passport-jwt 从令牌中获取错误的用户

Passport-jwt 令牌过期

在获取用户时使用 Passport-jwt 时 req.user 未定义