OpenID Connect 如何处理服务链?

Posted

技术标签:

【中文标题】OpenID Connect 如何处理服务链?【英文标题】:How does OpenID Connect deal with service chains? 【发布时间】:2021-01-09 02:54:04 【问题描述】:

背景

假设我有一个创建货件的应用程序。用户坐在该应用程序前面并加载页面。然后将它们重定向到 IDP 以登录。我使用的流程是授权码流程。这涉及到客户端 ID 和客户端密码。 IDP 可以将这些值与用户凭据一起获取并进行登录。

登录后,应用程序会收到一个id_token,让应用程序知道用户是谁(身份验证)。

然后应用程序需要调用一个服务(我们可以称之为服务 1)。应用程序可以将id_token 作为 JWT 不记名令牌传递给服务 1。

服务 1 获取 JWT 并可以使用其上的签名(使用 IDP 的公钥)来验证 JWT 实际上来自它信任的 IDP。

问题

这一切都很好,而且效果很好。但是现在 Service 1 需要调用 Service 2 来完成 Shipment Application 的请求。

这就是让我感到困惑的地方。服务 1 有自己的客户端 ID 和客户端密钥。它可以获得一个“客户端凭据”令牌。但是服务 2 需要知道发出请求的用户,并且客户端凭据令牌中没有任何用户信息。

Authorization: Bearer 标头只允许一个令牌。但我需要两个空间:

如果我只传递用户的 JWT,我的 JWT 看起来就像是直接从 Shipment Application 调用到服务 2。(可能甚至不应该直接从 Shipment Application 调用 Service 2。) 但如果我只传递服务 1 的客户端凭据令牌,那么服务 2 将不会获取用户的信息。

无论哪种方式,服务 2 都不会高兴。

问题

OpenID Connect 是否可以合并两个令牌?还是其他方式让服务调用链发挥作用?

注意:我目前都通过了。一个在Authorization: Bearer 标头中,一个在自定义标头中。但由于这不是 OpenID Connect 协议的一部分,因此在使用 3rd 方工具(如 OpenAPI(又名 Swagger))时会出现问题。

【问题讨论】:

【参考方案1】:

您可以查看委托令牌模式来为 Service1 与 Service 通信颁发新令牌。

见:

https://auth0.com/docs/tokens/delegation-tokens https://www.scottbrady91.com/OAuth/Delegation-Patterns-for-OAuth-20

【讨论】:

以上是关于OpenID Connect 如何处理服务链?的主要内容,如果未能解决你的问题,请参考以下文章

OpenID Connect 最终会取代 SAML 成为 SSO 的主导协议吗?

Mysql连接报错:1130-host ... is not allowed to connect to this MySql server如何处理

如何处理 Kafka Connect Sink 中的背压?

如何处理 JSON 响应

如何处理错误然后立即脱离承诺链?

我应该如何处理 DXGI 中的多个交换链?