1. OIDC 协议基础

OIDC(OpenID Connect)是构建在 OAuth 2.0 之上的身份认证层协议。理解 OIDC 与 OAuth 2.0 的关系、令牌类型以及核心角色,是优化授权码流程异步编排的前提。

1.1 OIDC 与 OAuth 2.0 的关系

OAuth 2.0 本质是授权框架,解决“谁可以访问什么资源”的问题;OIDC 在此基础上增加身份认证层,解决“用户是谁”的问题。两者是“扩展”而非“替代”关系。

维度 OAuth 2.0 OIDC
核心目标 授权(Access Token) 认证(ID Token)
令牌类型 Access Token、Refresh Token ID Token + Access Token + Refresh Token
用户身份 不关心用户身份 通过 ID Token 携带用户身份声明
标准规范 RFC 6749 OIDC Core 1.0
典型场景 API 授权、第三方登录授权 单点登录(SSO)、用户信息获取
关键理解:OIDC 不是重写 OAuth 2.0,而是在授权码流程的令牌响应中额外返回一个 JWT 格式的 ID Token,用于客户端验证用户身份。

1.2 ID Token 与 Access Token 的区别

两种令牌在异步任务编排中承担不同职责,混淆使用会导致安全漏洞或架构设计错误。

属性 ID Token Access Token
格式 JWT(必须) JWT 或 opaque(不透明)
用途 客户端验证用户身份 授权访问受保护资源
受众(aud) 客户端 ID(client_id) 资源服务器(API)
生命周期 短(通常几分钟到几小时) 可长可短(取决于资源服务器策略)
是否可撤销 通常不撤销(无状态验证) 可撤销(黑名单或自省端点)
包含声明 sub、name、email、iss、aud、exp、iat 等 scope、client_id、授权范围等
常见误区:不要将 ID Token 作为 API 调用的凭证发送给资源服务器。ID Token 仅用于客户端本地验证用户身份,资源服务器应只信任 Access Token。

1.3 授权码流程的核心角色

OIDC 授权码流程涉及四个核心角色,每个角色在异步任务编排中承担不同的并发与安全职责。

  1. 终端用户(End User):资源所有者,通过浏览器发起认证请求。
  2. 客户端(Client):需要验证用户身份的应用程序(如 Web 前端、移动 App、后端服务)。
  3. 授权服务器(Authorization Server):负责用户认证、发放授权码和令牌(如 Keycloak、Auth0、自建 OIDC 服务)。
  4. 资源服务器(Resource Server):托管受保护 API,验证 Access Token 后返回用户资源或数据。
OIDC 授权码流程核心角色与交互 终端用户 (浏览器) 客户端 (应用) 授权服务器 (OIDC 提供方) 资源服务器 (API) ① 发起认证 ② 授权请求 ③ 用户认证页面 ④ 提交凭证 ⑤ 返回授权码 ⑥ 授权码 + client_secret ⑦ ID Token + Access Token ⑧ 携带 Access Token 请求资源 ⑨ 返回用户资源
异步编排视角:步骤⑥(授权码→令牌交换)是典型的 I/O 密集型操作,适合使用异步任务编排(如 CompletableFuture、协程)来避免阻塞客户端线程。步骤⑧(资源请求)可进一步拆分为多个并行子任务,提升整体吞吐量。

1.4 角色在异步场景下的职责边界

角色 同步场景职责 异步编排优化点
终端用户 等待认证完成 无(用户交互不可异步化)
客户端 阻塞等待令牌响应 使用非阻塞 HTTP 客户端 + 异步回调
授权服务器 同步处理令牌请求 支持并发令牌请求,避免数据库锁竞争
资源服务器 同步验证令牌 缓存公钥(JWKS)减少远程调用