Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 使用req.params作为passport.js中passport.authenticate()的输入(使用Express 4.0)_Node.js_Api_Authentication_Express_Passport.js - Fatal编程技术网

Node.js 使用req.params作为passport.js中passport.authenticate()的输入(使用Express 4.0)

Node.js 使用req.params作为passport.js中passport.authenticate()的输入(使用Express 4.0),node.js,api,authentication,express,passport.js,Node.js,Api,Authentication,Express,Passport.js,我们正在构建一个使用多个API的API(使学生和研究员更容易下载数据),随着事情的发展,路由器和策略的数量也在不断增加。为了避免重复使用相同的代码和更改链接中的一个名称,我们考虑使用req.params创建一个通用身份验证路由器,通过Oauth2处理授予我们访问其信息的用户的一般身份验证。我们遇到的问题是如何将req.params解析为passport.authenticate函数以使用特定策略。理想情况下,我们希望通过将特定于API的设置加载到策略中,该策略也具有通用性 对于特定于API的路由

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

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

我们希望得到的是:

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时增加这个API。任何洞察都将不胜感激

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


谢谢这起作用了。我对这件事困惑了好几个小时。我想是时候了解一下中间件了。对第二个问题有什么想法吗?passport策略调用一个单一的统一策略,该策略接受req.params并加载必要的设置?@martwetzels:我不知道你想说什么。你能详细说明一下吗?在这两个表达式之间,你可以做任何你想做的事情。这包括加载一些选项,或验证提供程序。因此,使用与上述相同的authRouter,而是使用req.params将passport.authenticate指向特定策略,我希望它指向“通用”策略;例如,在apitrantegy.js文件中调用它。根据API,所有Oauth2特定的设置都放在settings.js文件中。在使用passport.authenticate时,我希望在apiStrategy文件中提供req.params(在本例中是provider变量),以便从settings.js加载特定于提供程序的设置。这会带走另一堆几乎重复的代码。我会问一个新问题。对不起,我对护照已经不那么感兴趣了。
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'
 })
}
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)
}