接受来自多个授权服务器的令牌

Accepting tokens from multiple authorization servers

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

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

用户A在Authorization Realm B也有一个账号,Client需要访问受OP B保护的Resource Server B。

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

这意味着:

据我所知,客户端 A 可以获得两个访问令牌。一个来自 OP A,一个来自 OP B。常见的授权库不支持开箱即用,这会增加客户端必须处理的复杂性(managing/refreshing 多个 tokens/sending 右边的正确令牌端点)。此外,我不清楚在使用来自两个 OP 的两个令牌时 OIDC 流程会是什么样子。

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

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

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

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

这本身就有相当昂贵的先决条件,包括要在领域 A 和领域 B OIDC 提供商之间配置信任。一旦完成 UIs 和 APIs 中的代码就非常简单并且责任在正确的地方。

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

尽管如此,很多人都想做这种事情 - 也许 JWT Bearer Token Exchange 等新兴标准会在未来几年有所帮助。