使用passport jwt和尾声,我的req.user为空

使用passport jwt和尾声,我的req.user为空,jwt,passport.js,epilogue,passport-jwt,Jwt,Passport.js,Epilogue,Passport Jwt,我的中间件代码是: 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: '

我的中间件代码是:

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'))
我的结束语代码是:

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
在我的
列表.auth中为空。我做错了什么?

TL;博士
passport.authenticate
不会设置
req.user
,如果您向其提供回调。你必须自己设置

解决方案 我能够重现你的案例,行为如预期般出现

为了修复它,我必须更新您的auth中间件,如下所示:

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.authenticate
函数将自身短路。

这意味着您必须自己设置值。

我认为您不能在这里使用
async
函数,因为它似乎是基于express的,express期望正常的函数是中间件,使用这个包可以让您在express函数中使用异步:您是否尝试过在您的中间件中打印一些东西,以确保在您期望的时候调用它?