同时使用多个 oAuth 身份服务

信息安全 oauth 身份管理
2021-08-12 01:17:28

这个问题在本质上有点学术。在通过承载令牌为我正在开发的后端服务,特别是关于 oAuth2 的安全性主题进行自我教育时,我想到了几个问题:

  1. 如果您要外包身份提供者/授权服务,您将创建对该服务提供者的依赖。迁移到新的 oAuth2 服务提供商会有多痛苦?
  2. 如果服务提供商“失败”(从互联网上消失或他们的系统受到损害或以与您的要求不兼容的方式更改他们的政策等)怎么办?

作为减少依赖性的一种方式,我想到我可以配置资源服务器来检查每个请求是否有两个令牌,来自两个不同的服务提供商,例如 SP-A 和 SP-B。

为此,您的 [client's] 用户必须在 SP-A 和 SP-B “注册”。这意味着在注册过程中,用户详细信息将提交给 SP-A 和 SP-B 并在其创建记录。

客户端开发人员将受到影响,因为他们需要开发他们的应用程序以向两个 oAuth 提供程序注册用户,并且必须从两个提供程序获取授权码。对于最终用户,影响可能会降到最低,但如果客户想要使用用户现有的 OpenID IdP 来实现初始注册和登录身份验证,则用户必须授权两次访问他们的数据。

一个直接的好处是,您可以在后端为每个 SP-A 和 SP-B 设置一个全局标志,以便在需要时忽略/绕过该提供程序。

您还可以使用不同的策略,例如需要来自所有 oAuth 提供者或至少一个 oAuth 提供者等的有效令牌,具体取决于您的要求。

当然,仍然需要检查授权提供者的凭据、跟踪记录等,并尝试评估风险。

2个回答

我不确定你是什么意思。以下是我的两个最佳猜测:

  • OAuth授权

    OAuth 允许第三方(您)在通过授权服务器(OAuth 提供者)获得授权后,从资源服务器(可能是 API)访问用户的受保护资源。

    OAuth 提供者很可能是运行资源服务器的同一组织。如果该组织从互联网上消失,那么让不同的提供商获得对不存在资源的授权确实没有意义。

  • 用于身份验证的OAuth

    您也有可能指的是使用第三方身份服务来验证网站用户

    如果是这种情况,您不需要绑定到特定服务,只需使用 OpenID Connect 并让您的用户选择他们喜欢的任何提供商。

    您可以为最常见的提供商提供快速通道按钮,但您并不依赖它们。

    啊,联合服务的乐趣 :-)

如果我完全误解了这个问题,请告诉我。

客户端开发人员将受到影响,因为他们需要开发他们的应用程序以向两个 oAuth 提供程序注册用户,并且必须从两个提供程序获取授权码。[...]

正如 GnP 已经说过的那样,向多个 oAuth 提供者注册用户并从多个 oAuth 提供者处获取授权代码在理论上不是问题,因为 Open ID Connect 为您提供了标准协议,甚至为 api 端点提供了标准发现方法。您编写代码以获取授权代码并将其交换为 id 和访问令牌一次,然后针对每个兼容的提供程序运行它(您的里程可能会有所不同 - 我成功地将我的代码部署到 Google 和 Microsoft Azure 的 Open ID Connect 实现中,但是当我尝试雅虎时,雅虎并没有按照规范行事,也没有给出它不这样做的原因......

忽略这个警告,支持多个身份提供者而不仅仅是一个身份提供者基本上只是在用户数据库中使用 1:1 关系和 1:n 关系之间的区别 - 例如,而不是将单个 Open ID Connect 主题标识符附加到每个您的用户实体,设计您的数据库后端以允许附加任意数量的它们,并且每次您想要支持新的身份提供者时,基本上您所要做的(如果它的行为符合规范)就是给您申请 IDP 的发现文档所在的域名。

但如果客户想要使用用户现有的 OpenID IdP 来实现初始注册和登录身份验证,则用户必须授权两次访问他们的数据。

我发现授权是更难解决的问题,但不是因为你给出的原因,我拥有它只是因为我有一个预先存在的用户群,具有一组明确定义的访问权限。我的问题是:基本上,每个 Open ID 提供者都会给你一个随机字符串来标识一个用户,但是你如何将这些字符串与你的用户实体(以及他们的授权)相匹配?您从 IDP 获得的主题字符串看起来完全是随机的,您无法提前知道它们,因此如果您有一个已知的用户群并为其定义了多个访问权限,您如何匹配一个您无法预测的 ID授权框架中的给定用户实体?

(我解决这个问题的方法是使用 IdP 给我的电子邮件地址作为 id 令牌的一部分作为唯一的已知标识符,以便在我第一次看到新用户身份验证时将 IdP 的主题标识符链接到我的用户实体,但为了让它发挥作用,您必须相信 IdP 正确地验证了电子邮件地址 - 我不愿意为每个 IdP 打赌)。

所以是的,允许多个身份提供者确实会产生一些额外的工作,但主要是为不同的 IdP 设置不同的信任模型。在我的情况下,我隐式信任来自我的主要 IdP 的 id 令牌,并且我只接受一小部分其他 IdP,我不相信他们会向我提供身份令牌主题标识符之外的经过验证的信息,所以对于这些,我需要第二个解决方案来解决我上面列出的匹配/授权问题。

如果您没有使用预先存在的用户群,解决匹配问题的方法是允许用户通过将其全部链接到同一个用户帐户来合并他的多个身份。您可以通过让他使用一个用户帐户进行身份验证来做到这一点,然后在他通过身份验证时告诉他使用其他身份提供者进行身份验证。然后,您的应用程序可以将所有这些身份链接在一起,因为它们属于数据库中的同一个人/用户实体。