Passport.authenticate экспорт -> passport.authenticate (некоторые вещи) (req, res, следующий)? - PullRequest
1 голос
/ 13 июня 2019

Я не понимаю, зачем мне (req, res, next) после passport.authenticate функции

Используя это с экспрессом, я следовал учебному пособию, не очень хорошо объяснил этот отрывок

PS: все работает нормально, я просто не понимаю, зачем это нужно

const passport = require('passport')

module.exports = (req, res, next) => {
  passport.authenticate('jwt', (err, user) => {
    if (err || !user || user.isAdmin !== true) {
      res.status(403).send({
        message: 'Request blocked, only administrators'
      })
    } else {
      req.user = user
      next()
    }
  })(req, res, next)
}

Вызов функции в качестве промежуточного программного обеспечения

app.get('/admin', isAdmin, (req, res) => {
    res.send({
      message: 'You are an admin'
    })
  })

Конфигурация паспортного уровня

passport.use(
    jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
    secretOrKey: config.jwtSecret
  }, async (jwtPayload, done) => {
    try {
      const user = await User.findOne({
        where: {
          id: jwtPayload.id
        }
      })
      if (!user) {
        return done(new Error(), false)
      }
      return done(null, user)
    } catch (err) {
      return done(new Error(), false)
    }
  })
)

PSS: мне нужно было создать еще один файл с именем isUser.js для аутентификации пользователей. Как это сделать, если я хочу поместить их обоих в один файл и требовать их, как

const Auth = require('./Auth')
Auth.isUser
Auth.isAdmin

Я пытался, но яне могу понять, как это сделать с помощью функции такого типа: (

1 Ответ

1 голос
/ 24 июня 2019

Express Route's next() вызывает следующий обработчик маршрута или промежуточное программное обеспечение, которое должно обрабатывать запрос после его обработки в текущем методе / промежуточном программном обеспечении.

Так же, как выкод (см. мои комментарии внутри кода):

const passport = require('passport')

module.exports = (req, res, next) => {
  passport.authenticate('jwt', (err, user) => {
    if (err || !user || user.isAdmin !== true) {
      res.status(403).send({
        message: 'Request blocked, only administrators'
      })
    } else {
      req.user = user // THE user OBJECT IS ADDED TO THE req OBJECT SO THE NEXT ROUTE HANDLING METHOD/MIDDLEWARE MAY GET ACCESS TO THIS ADDED user OBJECT AND MAY USE IT
      next() // THIS CALL THE NEXT ROUTE METHOD/MIDDLEWARE
    }
  })(req, res, next)
}

Таким образом, после выполнения next() запрос передается для обработки другому промежуточному программному обеспечению с именем isAdmin, которое проверяет, еслитекущий пользователь - обычный пользователь или пользователь-администратор на основе добавленного пользовательского объекта, полученного из запроса, который был добавлен предыдущим промежуточным ПО как req.user = user

Так что если вы хотите избежать создания отдельного файла для isAdmin тогда вы можете что-то вроде:

const passport = require('passport')
// INCLUDE YOUR AUTH MIDDLEWARE FILE HERE
const isAdmin = require('./PATH/TO/isAdmin')

    module.exports = (req, res, next) => {
      passport.authenticate('jwt', (err, user) => {
        if (err || !user || user.isAdmin !== true) {
          res.status(403).send({
            message: 'Request blocked, only administrators'
          })
        } else {
          req.user = user
          // COMMENT OUT BELOW LINE
          // next()
          // IMPLEMENT THE AUTH LOGIC HERE, SOMETHING LIKE BELOW
          if (user.isAdmin()) {
          }
        }
      })(req, res, next)
    }

Я надеюсь, это поможет вам

...