我正在使用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)