Skip to content

OAuth 2.0 和 OIDC 是什么关系? ​

  • 标签:Spring Security、认证授权、后端

🏛 业务架构师 ​

OAuth 2.0 与 OIDC 的关系——一句话:OIDC 是 OAuth 2.0 之上的身份认证层(Identity Layer)。

为什么需要它(关键认知):OAuth 2.0 本质是授权协议——解决"第三方能不能访问我的资源"(让 App 读我的通讯录),它不是认证协议——没有定义"用户是谁、如何登录"。一个经典误区:拿 OAuth 拿到 Access Token 就当"用户登录了"——但 OAuth 流程里客户端根本不知道用户身份信息(Token 是给资源服务器用的,不是给客户端的身份证明)。把 OAuth 当登录用,会产生各种安全漏洞(令牌混淆、登录伪造)。

OIDC 补了什么:在 OAuth 2.0 授权码流程之上增加:

  1. ID Token:一个 JWT 格式的身份令牌,包含用户身份声明(sub 用户唯一标识、姓名、邮箱、签发者、过期时间)并带签名——客户端验签后即可确认"用户是谁、确实登录了";
  2. 标准化端点与发现机制:/.well-known/openid-configuration 自动发现配置;
  3. UserInfo 端点:获取更完整的用户资料;
  4. 标准 Scopes:openid/profile/email。

业务视角:企业做 SSO(单点登录)、对接第三方登录(微信/GitHub/Google)、建设统一身份平台——选型语言就是 OIDC(协议实现如 Keycloak、Authing、阿里云 IDaaS 都是 OIDC Provider)。记忆口诀:OAuth 管"授权"(借权访问),OIDC 管"认证"(你是谁)——两者常一起用(OIDC 登录 + OAuth 拿权限),但职责分开。

🏗 系统架构师 ​

关系:OIDC 建立在 OAuth 2.0 之上,补齐"认证"层,是 OAuth 2.0 的身份层扩展(identity layer)。

OAuth 2.0 本质是"授权"协议:解决"第三方应用获得对资源的受限访问权"——它只发 access_token,令牌对第三方是不透明的(第三方不知道"用户是谁",只知道"能访问")。经典误区:拿 OAuth 2.0 做登录("用 access_token 换到的东西"当用户身份)——Google 曾明确警告 OAuth ≠ 登录(伪造 email 声明的攻击)。

OIDC = OAuth 2.0 + 认证语义,三块增量:

  • ID Token(核心):签名的 JWT,含用户身份声明(sub、email、name)——由授权服务器签名背书的"用户是谁"证明,客户端验签即完成认证(OAuth 没有 analogous 物);
  • 标准化端点与发现:/.well-known/openid-configuration 一站式发现(授权/令牌/JWKS 端点、支持的 scope)——接入新 IdP 零硬编码;
  • UserInfo 端点 + 标准 scope(openid/profile/email)与 session 管理(登出、front/back-channel)。

架构师视角的实用区分:

  • 做 "Login with X"(认证用户身份)→ OIDC(OAuth2 的授权码流程 + openid scope + 验 ID Token);
  • 做 "让应用访问用户数据"(授权)→ 纯 OAuth2(access_token 调资源 API);
  • 企业 SSO 标准 = OIDC(配合 SAML 的存量整合);微服务内部令牌体系也常对齐 OIDC 语义(JWT claims 标准化)。

一句话记忆:OAuth 2.0 管"能不能访问",OIDC 管"你是谁"——OIDC 是协议族(授权码+PKCE 是它当前的唯一推荐流程),OAuth 2.0 是它的传输底座。

💻 全栈开发专家 ​

OIDC(OpenID Connect)是构建在 OAuth 2.0 之上的身份认证层协议——OAuth 2.0 本身只管「授权」( delegated access:能不能拿资源),不管「登录/认证」(你是谁)。OIDC = OAuth 2.0 + 认证语义 + 标准化的用户信息格式。

关系拆解:

  • OAuth 2.0:access_token 换「访问资源的权限」,资源服务器看 token 调 API——没有标准答案告诉你「这个 token 是谁、怎么登录的」;
  • OIDC 在授权码流程上追加:签发 ID Token(一个 JWT),标准 claims(sub 用户唯一标识、iss/aud/exp、email、name 等)直接说明「谁登录了」;并提供 UserInfo 端点(拿完整资料)、Discovery(/.well-known/openid-configuration 一份 JSON 描述全部端点与能力)、JWKS(/jwks 公钥集,资源服务器自动验签)。

类比记忆:OAuth 2.0 是「代客泊车授权」(把钥匙给 Valet),OIDC 是「出示驾照证明你是车主」(认证)。

工程落地(Spring 生态):

yaml
spring:
  security:
    oauth2:
      client:
        provider:
          my-idp:
            issuer-uri: https://sso.example.com   # Discovery 自动拉配置
        registration:
          web:
            client-id: acme-web
            scope: openid,profile,email           # openid scope = 启用 OIDC

资源服务器验 access token(JWT),需要用户资料时调 UserInfo 或解 ID Token。

一句话:需要「登录」(SSO、第三方登录)→ OIDC;只需要「服务间/委托访问」→ 纯 OAuth 2.0。现代身份系统(Keycloak、Auth0、Spring Authorization Server)都是 OIDC 身份_PROVIDER_,OAuth 2.0 只是它的地基。