针对特定路由的特殊Passport身份验证

问题描述 投票:0回答:1

我正在使用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/)内的其他路线的情况下实现这一目标?

node.js rest express passport.js restful-authentication
1个回答
1
投票

这可以通过调用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)
© www.soinside.com 2019 - 2024. All rights reserved.