使用passport-jwt和epilogue,我的req.user是空的

问题描述 投票:14回答:1

我的中间件代码是:

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中是空的。我究竟做错了什么?

jwt passport.js epilogue passport-jwt
1个回答
2
投票

TL;DR

如果你提供回调,passport.authenticate不会设置req.user。你必须自己设置它。

Solution

我能够重现你的情况,行为出现了预期。

为了解决这个问题,我不得不像这样更新你的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。这正确地解决了这个问题。

Why does this happen?

通过查看passport source code,我注意到如果用户自己提供回调,passport.authenticate函数将自行短路。 这意味着您必须自己设置值。

© www.soinside.com 2019 - 2024. All rights reserved.