OpenID Connect - 在这种情况下是否应该将 id 令牌发送到受保护的资源?

OpenID Connect - should the id token be sent to the protected resource in this case?

假设我有一个网络 API,本机应用程序需要向其发出请求。 API 需要验证通过本机应用程序发出这些请求的用户是谁。 OpenID Connect 似乎是正确的选择,因为它是关于身份验证而不是 OAuth 授权。

本机应用程序将用户凭据发送到 IDP 并取回访问令牌(用于授权)和 ID 令牌(用于身份验证)。据我对 OIDC 的了解,访问令牌将发送到 API,但 id 令牌仅适用于本机客户端应用程序。这对我来说没有意义,因为 API 关心用户是谁,而不是本机应用程序。

那么为什么不将 id 令牌也传递给受保护的资源(又名 API)?如果您不将 id 令牌传递给 API,如何保证访问令牌是安全的并且可用于对用户进行身份验证?否则它似乎失去了使用 OIDC 而不是 OAuth 的好处。

OIDC 规范的设计方式是 ID 令牌始终用于客户端(本机应用程序),访问令牌用于资源(APIs)。 ID 令牌始终是 JWT 令牌,但访问令牌可以是不同的类型。

Access token 的作用不是认证而是授权(Delegated Authorization)。如果出于某种原因,资源服务器想要了解用户,它可以调用用户信息端点。

令牌交换的 security/validity 可以通过多种方式验证:

  • 使用 encryption/signature 和 Public/Private 密钥模型,其中授权服务器使用其私钥加密/签署访问令牌,资源服务器使用 public 解密/验证钥匙。

  • 使用令牌自省端点来验证声明、令牌的有效性等。

AUD、AZP 等其他属性有助于验证颁发的访问令牌。

一些 OIDC 提供商使用 ID_Tokens 访问 API - 这与 OIDC 规范建议的模型不同

这篇article对这些场景有详细的解释。