【问题标题】:Special Passport Authentication for Specific Route特定路线的特殊护照认证
【发布时间】:2018-05-25 22:49:12
【问题描述】:

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

    这可以通过调用 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-13
      • 2015-01-26
      • 1970-01-01
      • 1970-01-01
      • 2022-08-05
      • 2017-07-03
      • 2022-11-28
      • 2015-09-23
      相关资源
      最近更新 更多