【问题标题】:passport.js with multiple authentication providers?具有多个身份验证提供程序的 passport.js?
【发布时间】:2014-01-11 18:36:57
【问题描述】:

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

例如(来自护照指南)我可以在下面的示例路线上使用本地和 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);
  });

【问题讨论】:

  • 在将多种策略混合到一条路线后,您会期望什么?

标签: node.js passport-facebook passport.js


【解决方案1】:

Passport 的中间件的构建方式允许您在一次 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 文件中确认此信息:

Authenticate using either basic or digest in multi-auth example.

Passport's authenticate.js definition

【讨论】:

  • 太棒了!感谢您的帮助,这正是我想要的!
  • 我如何知道最终使用哪种身份验证策略对用户进行身份验证?当然,我可以为每个策略设置不同的端点,但我试图避免它。
  • @asafam 据我所知, req.user 持有登录策略使用的信息。必须检查一下......会话(之后)中使用的大部分信息都保存在 req 对象中
  • 我不知道这有什么用。每个请求都需要执行基本策略,至少要使用 curl 之类的东西。而本地策略将为浏览器保留会话。因此,如果我想拥有一个通过登录为浏览器会话的 API,但 BasicAuth 通过 curl 为每个请求提供凭据,我似乎无法做到这一点。这可能吗?
  • 我仍然缺少的一件事是序列化/反序列化应该如何工作,因为它对于所有策略都是相同的。我们是否应该保证所有策略都返回相同的 userModel?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-28
  • 2012-02-18
  • 2020-08-21
  • 2014-08-12
  • 2023-03-15
  • 2017-12-25
相关资源
最近更新 更多