Passport.authenticate导出-> passport.authenticate(一些东西)(要求,要求,下一步)?

时间:2019-06-12 21:04:18

标签: node.js express authentication passport.js passport-jwt

我不明白为什么在(req, res, next)函数之后需要passport.authenticate

将其与express结合使用时,我遵循了一个教程,并没有很好地解释这段话

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 个答案:

答案 0 :(得分: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)
    }

我希望这会对您有所帮助