我正在创建一个基于django-oidc-provider的 OpenID Connect (OIDC) Provider 。我一直在阅读 OpenID Connect Spec,但我无法弄清楚访问令牌对于某个应用程序是如何唯一的。
考虑以下用户 Bob 的示例:
Bob 想要登录到应用程序 A,因此他转到其界面并被重定向到 OIDC 提供程序。身份验证后,他被重定向(隐式流)返回到应用程序 A,并带有一个 ID 令牌和一个访问令牌。然后,他使用他的访问令牌在“/image/1”向 A 的 API 发出请求。API 使用访问令牌与 OIDC 提供者联系,以断言用户作为 Bob 的身份。然后,假设信息存在,API 会在“/image/1”处为用户 Bob 返回数据。Bob 继续将他的访问令牌发送到 A 的 API 以处理任何后续请求。
然后,Bob 决定他想要访问应用程序 B 的 API。他向 B 的 API 发送与 A 的 API 相同的访问令牌。B 的 API 使用令牌与 OIDC 提供者联系,并断言用户的身份为 Bob。B 的 API 然后返回 Bob 请求的信息。
是什么阻止了这种情况的发生?我看到至少有两种可能的解决方案:
- 当访问Google 的令牌验证端点时,会返回“aud”参数。应用程序 B 的 API 必须检查此参数以确定令牌对于它自己的 API 无效?
- 当请求特定于资源提供者的令牌时,必须添加一个额外的范围,比如“app-A-api”。然后,当 API 验证令牌时,API 将确保令牌包含所需的范围。
哪些方法或其他方法符合 OIDC 规范?如果应该使用上述之一,我是否正确假设我应该添加一个返回范围或 aud 的新 /tokeninfo 端点,而不是将该信息添加到 /userinfo 端点返回的信息中?
任何输入表示赞赏。我认为我的很多困惑来自于在任何 OIDC 示例中没有看到用于委托对资源提供者的访问的“范围”参数。