【问题标题】:Using req.params as input for passport.authenticate() in passport.js (using Express 4.0)在 passport.js 中使用 req.params 作为 passport.authenticate() 的输入(使用 Express 4.0)
【发布时间】:2016-02-27 21:10:53
【问题描述】:

我们正在构建一个使用多个 API 的 API(以使学生和其他研究人员更容易下载数据),并且随着事情的进展,路由器和策略的数量正在增加。为了避免重复使用相同的代码和更改链接中的一个名称,我们认为使用 req.params 来制作一个通用 authenticationRouter 来处理通过 Oauth2 授予我们访问其信息的用户的一般身份验证。我们遇到的问题是如何将 req.params 解析为 passport.authenticate 函数以使用特定的策略。理想情况下,我们希望通过将特定于 API 的设置加载到策略中来使策略具有通用性。

对于特定于 API 的路由器,我们使用以下内容,以 fitbit 作为示例 API:(省略其他路由)

fitbitRouter.get('/fitbit/auth', passport.authenticate('fitbit'))

fitbitRouter.get('/fitbit/auth/callback, passport.authenticate('fitbit', {
    successRedirect: '/fitbit/success',
    failureRedirect: '/fitbit/failure'
}

我们想要得到的是:

authRouter.get('/:provider/auth', passport.authenticate(req.params.provider))

authRouter.get('/:provider/auth/callback, passport.authenticate(req.params.provider, {
    successRedirect: '/fitbit/success',
    failureRedirect: '/fitbit/failure'
}

我知道 req 不可用于对 passport.authenticate() 的回调,但以下内容也不起作用:

authRouter.get('/:provider/auth', getProvider)

authRouter.get('/:provider/auth/callback', getProviderandRedirect)

function getProvider(req, res){
    var provider = req.params.provider
    passport.authenticate(provider)
}

function getProviderandRedirect(req, res){
  var provider = req.params.provider
  passport.authenticate(provider, {
    successRedirect: '/'+provider+'/success',
    failureRedirect: '/'+provider+'/failure'
 })
}

所以问题是

  • 是否可以在 passport.authenticate() 中创建使用 req.params 作为字符串来选择使用什么策略的功能?

  • 我们是否可以将其扩展到将 req.params 变量解析为 passport.authenticate(),也许作为一个选项?,到我们从字典或其他特定内容加载正确设置的策略api?

对于一些上下文,我们从 3 个 API 开始,但现在我们已经接近 20 个,我们希望在有人请求包含另一个 API 时增加这个。任何见解都值得赞赏!

【问题讨论】:

    标签: node.js api authentication express passport.js


    【解决方案1】:

    passport.authenticate 返回一个中间件函数。如果您想在自己的中间件中使用它(并使您的函数也成为中间件),则必须调用它。

    authRouter.get('/:provider/auth', getProvider)
    
    authRouter.get('/:provider/auth/callback', getProviderandRedirect)
    
    function getProvider(req, res, next){
        var provider = req.params.provider
        passport.authenticate(provider)(req, res, next)
    }
    
    function getProviderandRedirect(req, res, next){
      var provider = req.params.provider
      passport.authenticate(provider, {
        successRedirect: '/'+provider+'/success',
        failureRedirect: '/'+provider+'/failure'
     })(req, res, next)
    }
    

    【讨论】:

    • 谢谢!这行得通。几个小时以来一直对此感到困惑。我想是时候阅读中间件了。对第二个问题有什么想法吗?该护照策略调用一个单一的统一策略,该策略采用 req.params 并加载必要的设置?
    • @martwetzels:我不确定你想说什么。你能详细说明一下吗?你可以在两个表达式之间做任何你想做的事情。这包括加载一些选项,或验证提供者。
    • 因此,使用与上述相同的 authRouter,而是使用 req.params 将 passport.authenticate 定向到特定策略,我希望它定向到“通用”策略;例如在 apiStrategy.js 文件中将其称为 apiStrategy。所有 Oauth2 特定的设置都放在每个 API 的 settings.js 文件中。使用 passport.authenticate 时,我想在 apiStrategy 文件中提供 req.params(或本例中的提供程序变量),以从 settings.js 加载特定于提供程序的设置。这将带走另一堆近乎重复的代码。
    • 我会就此提出一个新问题。抱歉,我对护照没有那么深入了。
    猜你喜欢
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 2019-09-01
    • 2015-03-26
    • 2016-11-02
    • 2021-10-02
    • 2015-09-21
    • 2021-01-23
    相关资源
    最近更新 更多