使用passport.js同时支持多个认证提供商?

66

使用Passport.js,我是否可以为同一路由指定多个认证提供程序?

例如(来自passport的指南),我可以在下面的示例路由上同时使用本地、Facebook和Twitter策略吗?

app.post('/login',
  passport.authenticate('local'), /* how can I add other strategies here? */
  function(req, res) {
    // If this function gets called, authentication was successful.
    // `req.user` contains the authenticated user.
    res.redirect('/users/' + req.user.username);
  });

将多个策略混合到一个路由中后,您期望得到什么结果? - damphat
1个回答

122
passport.authenticate(...) 能够支持在同一次调用中使用多个认证策略,但是它的内部实现采用了 OR 的逻辑。也就是说,只要其中一个认证策略成功,整个认证过程就会成功。以下是示例用法:
app.post('/login',
  passport.authenticate(['local', 'basic', 'passport-google-oauth']), /* this is how */
     function(req, res) {
       // If this function gets called, authentication was successful.
       // `req.user` contains the authenticated user.
       res.redirect('/users/' + req.user.username);
});
换言之,使用它的方法是传递一个包含您希望用户进行身份验证的策略名称的数组。
此外,请不要忘记事先设置您想要实现的策略。
您可以在以下 Github 文件中确认此信息: 在多重身份验证示例中使用基本身份验证或摘要身份验证。 Passport 的 authenticate.js 定义。

1
我怎样才能知道最终用来认证用户的身份验证策略是哪个?当然,我可以为每种策略使用不同的端点,但我正在尝试避免这种情况。 - asaf am
4
我无法理解这个有什么用。每个请求都需要进行基本策略,至少要与 curl 之类的东西一起使用。而本地策略会保持浏览器的会话。因此,如果我想要一个 API,通过登录对浏览器进行分组,但每个请求都需要使用 BasicAuth 和凭据,以便通过 curl 访问,我似乎做不到。这可能吗? - jeremykentbgross
1
我仍然不清楚序列化/反序列化应该如何工作,因为对于所有策略来说都是相同的。我们是否应该保证所有策略都返回相同的userModel? - shabunc
我也有同样的问题。我的应用程序有两个用户模型:用户和设备。设备使用令牌策略,而用户使用本地策略。这里有什么最佳实践? - Jim B.
@JimBaldwin 我猜你可以设置不同的端点,并通过 req.users 指定选择两个用户模型之一的逻辑。也许是指向用户或设备模型的 userType。 - Danilo Ramirez
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接