在 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'
})
}
所以问题是
是否可以创建将 req.params 用作 passport.authenticate() 中的字符串以选择要使用的策略的功能?
我们能否将其扩展到将 req.params 变量解析为 passport.authenticate(),也许作为一个选项?,到我们从字典加载正确设置的策略,或其他特定于 api?
为了了解一些背景信息,我们从 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)
}
我们正在构建一个消耗多个 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'
})
}
所以问题是
是否可以创建将 req.params 用作 passport.authenticate() 中的字符串以选择要使用的策略的功能?
我们能否将其扩展到将 req.params 变量解析为 passport.authenticate(),也许作为一个选项?,到我们从字典加载正确设置的策略,或其他特定于 api?
为了了解一些背景信息,我们从 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)
}