【发布时间】: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))时会出现问题。
【问题讨论】:
标签: security jwt openid-connect