【发布时间】: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