1

我不明白为什么我需要(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

我试过了,但我不知道如何使用这种类型的功能:(

4

1 回答 1

1

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)
    }

我希望这会对你有所帮助

于 2019-06-24T05:59:13.137 回答