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

时间:2017-12-12 09:42:52

标签: node.js rest express passport.js restful-authentication

我正在使用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/)的情况下实现此目标?

1 个答案:

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