Используя паспорт-jwt и epilogue, мой 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) {
        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. Что я делаю неправильно?

Ответ 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.authenticate будет замыкаться сама, если пользователь сам выполняет обратный вызов.
Это означает, что вы должны сами установить значение.