2. OAuth2.0 核心概念回顾:Access Token、Refresh Token、Client Credentials Grant、Authorization Code Grant

在深入异步任务编排与缓存策略之前,必须重新夯实 OAuth2.0 的四个核心概念。这些概念是令牌生命周期管理的基石,直接决定了缓存策略的选型边界。

2.1 令牌双生子:Access Token 与 Refresh Token

OAuth2.0 将授权与资源访问分离,通过两种令牌实现:

属性 Access Token(访问令牌) Refresh Token(刷新令牌)
用途 携带在请求头中访问受保护资源 在 Access Token 过期后获取新的 Access Token
有效期 短(通常 15 分钟 ~ 1 小时) 长(通常 7 天 ~ 30 天,可轮换)
存储位置 客户端内存 / 缓存(高频读取) 安全存储 / 缓存(低频读取)
泄露风险 高(需短生命周期 + 作用域限制) 极高(需绑定客户端 + 一次性使用)
缓存策略关注点 高并发读、过期驱逐、提前刷新 安全轮换、并发保护、持久化
关键认知:Access Token 是“通行证”,Refresh Token 是“补办凭证”。缓存设计必须区分两者的读写频率和安全等级,不能混用同一套过期策略。
Access Token 与 Refresh Token 生命周期对比 Access Token 有效期 15min 过期 Refresh Token 有效期 7天 刷新 新 Access Token 有效期 15min 说明: Access Token 过期后,客户端使用 Refresh Token 向授权服务器换取新的 Access Token。 缓存策略需在 Access Token 过期前(如剩余 20% 有效期)触发异步预刷新,避免阻塞。

2.2 两种核心授权流程

OAuth2.0 定义了多种授权流程,其中 Authorization Code Grant 和 Client Credentials Grant 是异步任务编排中最常遇到的两种模式。

2.2.1 Authorization Code Grant(授权码模式)

适用于有前端的 Web 应用或移动应用,代表“用户代理”参与授权。流程包含用户、客户端、授权服务器、资源服务器四方交互。

  1. 用户访问客户端,客户端将用户重定向到授权服务器。
  2. 用户认证并授权,授权服务器返回授权码(Authorization Code)到客户端回调地址。
  3. 客户端用授权码换取令牌:携带授权码 + Client Secret 向授权服务器请求 Access Token 和 Refresh Token。
  4. 客户端使用 Access Token 访问资源服务器。
缓存设计影响:此模式涉及用户身份,令牌必须与用户会话绑定。缓存 Key 通常为 user_id:token_type,且需支持多租户隔离。Refresh Token 的轮换操作必须加分布式锁,防止并发刷新导致令牌失效。

2.2.2 Client Credentials Grant(客户端凭证模式)

适用于服务间通信、后台任务、定时脚本等无用户参与的场景。客户端直接使用自己的身份(Client ID + Client Secret)获取令牌。

  • 无用户概念:令牌代表客户端自身,而非某个用户。
  • 通常不颁发 Refresh Token:因为 Client Secret 可以随时重新获取令牌,Refresh Token 反而增加复杂度。
  • 缓存命中率高:同一客户端的所有请求共享同一个 Access Token,非常适合集中缓存。
对比维度 Authorization Code Grant Client Credentials Grant
参与方 用户、客户端、授权服务器、资源服务器 客户端、授权服务器、资源服务器
令牌粒度 每个用户独立令牌 每个客户端共享令牌
Refresh Token 通常颁发,需安全存储 通常不颁发
缓存 Key 设计 user_id:client_id client_id
并发刷新风险 高(多用户同时刷新) 低(单客户端全局刷新)
Authorization Code Grant 与 Client Credentials Grant 流程对比 Authorization Code Grant 用户 客户端 授权服务器 资源服务器 ① 访问 ② 授权码 ③ 换令牌 ④ 访问资源 • 有用户参与,令牌与用户绑定 • 颁发 Refresh Token,需轮换 • 缓存 Key 含用户标识 Client Credentials Grant 客户端 授权服务器 资源服务器 ① Client Secret ② 返回令牌 ③ 访问资源 • 无用户参与,客户端自授权 • 通常不颁发 Refresh Token • 缓存 Key 仅含客户端标识

2.3 令牌缓存的核心挑战

基于上述概念,异步任务编排中的令牌缓存面临三个核心挑战:

  • 并发刷新风暴:多个异步任务同时发现 Access Token 过期,同时发起刷新请求,导致授权服务器压力激增。
  • 令牌状态不一致:Refresh Token 被轮换后,旧令牌失效。若缓存未及时更新,后续任务使用旧令牌刷新会失败。
  • 过期窗口内的空窗期:令牌在缓存中刚过期,但新令牌尚未获取成功,此时所有请求都会失败。
常见误区:不要将 Access Token 的过期时间设置为缓存 TTL 的精确值。例如令牌有效期 15 分钟,缓存 TTL 也设为 15 分钟,会导致大量请求在令牌实际过期前因缓存驱逐而失败。正确的做法是设置缓存 TTL 为令牌有效期的 70%~80%,并配合异步预刷新机制。

2.4 本章小结