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

Using req.params as input for passport.authenticate() in passport.js (using Express 4.0)

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

对于 API-specific 路由器,我们使用以下,以 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'
}

我知道请求不适用于 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'
 })
}

所以问题是

为了了解一些背景信息,我们从 3 个 API 开始,但现在我们已经接近 20 个了,每当有人请求包含另一个 API 时,我们都想增加这个数量。感谢任何见解!

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

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)
}