【问题标题】:Accepting tokens from multiple authorization servers接受来自多个授权服务器的令牌
【发布时间】:2020-05-09 10:36:09
【问题描述】:

在自学 OpenID Connect 时,以下场景引发了一些问题。大多数关于 OIDC/OAuth 的在线文档都假定资源服务器只能从同一“授权领域”内的客户端访问,这意味着客户端和所有资源服务器都受到同一 OIDC 提供程序 (OP) 的保护。

在给定的场景中,客户端受 OP A 保护,并要求用户 A 登录 OP A 才能使用客户端。通过这样做,客户端还从 OP A 接收访问令牌,使其能够代表用户访问资源服务器 A。到目前为止一切顺利。

用户A在Authorization Realm B中也有一个账号,客户端需要访问受OP B保护的资源服务器B。

此资源服务器 B 是一个 API,它调用同一授权领域 B 内的其他 API。所有这些 API/资源服务器对自己的授权领域 B 之外的 OIDC 提供者一无所知。资源服务器 B 不仅可以从来自领域 A 的客户端,也来自来自各个授权领域的 N 个客户端。以我目前的理解,领域 B 中的所有资源服务器都必须接受来自各种 OP 的令牌。

这意味着:

  • 所有 API 中的大量配置
  • 每次添加或删除新领域时,都必须更新所有 API 的配置

我了解客户端 A 可以获得两个访问令牌。一个来自 OP A,一个来自 OP B。通用授权库不支持开箱即用,这会增加客户端必须处理的复杂性(管理/刷新多个令牌/将正确的令牌发送到正确的端点)。此外,我不清楚在使用来自两个 OP 的两个令牌时 OIDC 流程会是什么样子。

  1. 客户端会将用户重定向到 OP A 进行身份验证(因为客户端本身受 OP A 保护)。
  2. 在收到 ID 和 Access Token 后,允许用户使用客户端,并且客户端拥有 API A 所需的令牌。
  3. 客户端还将向 OP B 请求访问令牌,这意味着用户必须在 OP B 进行身份验证
  4. 用户要么必须在 OP B 提供用户名/密码,或者,如果我们使用身份联合,OP B 将重定向到用户已经有会话的 OP A,从而产生来自 OP B 的用于 API B 的访问令牌
  5. 客户端将使用令牌 B 调用 API B,使用令牌 A 调用 API A

是否有其他解决方案可以接受来自使用 OAuth/OIDC 的另一个 OP 保护的客户端的请求?很明显,这两个领域之间必须存在某种信任设置。但是如何在不影响领域 B 中的所有资源服务器的情况下实现这一点呢?

【问题讨论】:

    标签: oauth oauth-2.0 openid openid-connect


    【解决方案1】:

    最简单的选择往往涉及联合身份验证:

    • 领域 A 中的用户使用领域 B 拥有的 UI
    • UI 重定向到 Realm B OIDC 提供者
    • UI 进一步重定向到 Realm A 的 OIDC 提供程序
    • 用户使用 Realm A 凭据进行身份验证
    • 领域 A 令牌已发布到领域 B OIDC 提供程序
    • 领域 B 令牌返回到 UI
    • UI 将 Realm B 令牌发送到 Realm B API

    这本身具有相当昂贵的先决条件,包括在领域 A 和领域 B OIDC 提供商之间配置的信任。完成后,UI 和 API 中的代码非常简单,并且职责在正确的位置。

    其他选项,例如允许在领域 A 中登录,然后在领域 A 和领域 B 中调用 API,在实践中通常无法以好的方式实现。

    不过,很多人都想做这种事情——也许JWT Bearer Token Exchange 等新兴标准将在未来几年内有所帮助。

    【讨论】:

    • 是否有任何 RFC 可以读取 wrt Identity Federation ?
    猜你喜欢
    • 2020-04-08
    • 2022-08-21
    • 2019-10-08
    • 2020-02-22
    • 2014-07-09
    • 1970-01-01
    • 2022-10-23
    • 2021-10-12
    • 2021-02-18
    相关资源
    最近更新 更多