特定路线专用护照认证

Special Passport Authentication for Specific Route

我正在使用 Express.js 开发 RESTful API 并且我正在使用 Passport.js 进行身份验证。
这是我如何在路线中使用护照的示例:

const beerRoutes = require('./beerRoutes')     // an instance of express router
let authenticateRoute = passport.authenticate('jwt', { session: false })

router.use('/beer', authenticateRoute, beerRoutes)

内部 beerRoutes.js :

const router = require('express').Router()

router.post('/', (req, res) => {})
router.get('/', (req, res) => {})
router.patch('/', (req, res) => {})
router.delete('/', (req, res) => {})

问题是,我希望未经身份验证的客户端能够创建新用户(即 POST /beer/)。 但我也想在向同一端点发送请求时向经过身份验证的客户端授予额外权限。

如何在不让未经身份验证的客户端访问 beerRoutes(例如 PATCH /beer/)内的其他路由的情况下实现此目的?

这可以通过调用 Passport.js 中间件的自定义中间件来解决。

const authenticationWhiteList = [
  'POST /beer'
]


function Authenticate (request, response, next) {
  let route = `${request.method} ${request.baseUrl}`

  if (_.indexOf(authenticationWhiteList, route) !== -1) {
    next()
  } else {
    passport.authenticate('jwt', { session: false })(request, response, next)
  }
}

然后把验证码改成这个:

const beerRoutes = require('./beerRoutes')     // an instance of express router

// let authenticateRoute = passport.authenticate('jwt', { session: false })
let authenticateRoute = Authenticate


router.use('/beer', authenticateRoute, beerRoutes)