security - OpenID Connect - 在这种情况下是否应该将 id token 发送到 protected 资源?

标签 security oauth-2.0 single-sign-on openid-connect

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

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

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

最佳答案

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

访问 token 的目的不是验证,而是授权(Delegated Authorization)。如果出于某种原因,资源服务器想了解用户,它可以调用 user-info 端点。

token 交换的安全性/有效性可以通过多种方式进行验证:

  • 使用带有公钥/私钥模型的加密/签名,其中授权服务器使用其私钥加密/签署访问 token ,资源服务器使用公钥解密/验证。
  • 使用 token 自省(introspection)端点来验证声明、 token 的有效性等。

  • AUD、AZP 等其他属性有助于验证已发布的访问 token 。

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

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

    关于security - OpenID Connect - 在这种情况下是否应该将 id token 发送到 protected 资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45745176/

    相关文章:

    java - 在 WIndows 上的 Java 中,如何检测文件是否具有 'Read Only' 属性

    rest - Keycloak 返回未经授权的 401

    oauth - Instagram API : do scopes work with OAuth2 implicit authentication flow?

    authentication - 当 2-legged 效果很好时,为什么会有 3-legged OAuth2?

    java - ADFS 注销响应中的 “urn:oasis:names:tc:SAML:2.0:status:Requester”

    database - PostgreSQL - 保护数据库和隐藏结构

    jsp - 基本身份验证 : Is it possible to setRemoteUser like getRemoteUser()

    c# - ASP.NET:权限/身份验证体系结构

    java - Kerberos 与 Java

    java - IDP 在现有应用程序中启动了 SSO 实现