1. OAuth2.0 协议基础:四种授权模式原理与适用场景

OAuth2.0 是目前业界标准的授权协议,核心目标是让第三方应用在不获取用户密码的前提下,获得对受保护资源的有限访问权限。协议定义了四种授权模式,分别对应不同的客户端类型与安全需求。

1.1 核心角色与交互流程

在深入四种模式之前,先明确 OAuth2.0 的四个核心角色:

角色 说明 典型示例
资源所有者 (Resource Owner) 拥有受保护资源的实体,通常是用户 登录系统的最终用户
客户端 (Client) 请求访问受保护资源的第三方应用 Web 应用、移动 App、后端服务
授权服务器 (Authorization Server) 验证资源所有者身份并颁发令牌 统一认证中心 (SSO)
资源服务器 (Resource Server) 存储受保护资源,验证令牌后返回数据 API 网关、用户数据服务
关键原则:授权服务器与资源服务器可以是同一台物理服务器,但在架构上必须逻辑分离。令牌是客户端访问资源的唯一凭证,资源服务器不参与令牌颁发。

1.2 四种授权模式全景对比

下表从安全等级、令牌获取方式、适用客户端三个维度进行横向对比:

授权模式 安全等级 令牌获取方式 适用客户端类型
授权码模式 最高 授权码 → 令牌(后端交换) 有后端的 Web 应用
隐式模式 中等 前端直接获取令牌(已弃用) 纯前端 SPA(已被 PKCE 替代)
密码模式 低 用户名 + 密码 → 令牌 高度信任的第一方应用
客户端凭证模式 高 客户端凭证 → 令牌 服务间通信(无用户参与)
安全提示:隐式模式(Implicit Grant)已在 OAuth2.1 草案中正式移除。新项目应使用授权码模式 + PKCE 扩展替代隐式模式,避免令牌暴露在浏览器 URL 中。

1.3 授权码模式(Authorization Code Grant)

这是最完整、最安全的授权模式,适用于有可靠后端服务器的 Web 应用。核心思想是:令牌只通过后端安全通道传输,前端浏览器仅接触临时授权码。

流程步骤

  1. 客户端引导用户跳转到授权服务器,请求授权码。
  2. 用户登录并授权后,授权服务器通过重定向将授权码返回给客户端回调地址。
  3. 客户端后端使用授权码 + client_secret 向授权服务器请求令牌。
  4. 授权服务器验证授权码和客户端凭证,返回 access_token 和可选的 refresh_token。
最佳实践:授权码有效期极短(通常 1-5 分钟),且一次性使用。即使授权码在传输过程中被截获,攻击者也无法在没有 client_secret 的情况下换取令牌。
授权码模式交互流程 授权码模式交互流程 用户(资源所有者) 客户端(浏览器) 客户端后端 授权服务器 ① 访问应用 ② 请求授权码 ③ 返回授权码 ④ 转发授权码 ⑤ 授权码+secret ⑥ 返回令牌 安全要点 令牌仅在后端之间传输,浏览器只接触临时授权码,避免令牌泄露风险

1.4 隐式模式(Implicit Grant)

隐式模式专为纯前端应用(如浏览器 SPA)设计,不经过后端服务器,授权服务器直接通过 URL 片段(Fragment)返回令牌。由于令牌暴露在浏览器地址栏和历史记录中,安全风险较高。

弃用说明:OAuth2.1 已移除隐式模式。现有 SPA 项目应迁移至授权码模式 + PKCE(Proof Key for Code Exchange)扩展,PKCE 使用动态生成的 code_verifier 和 code_challenge 替代 client_secret,即使授权码被拦截也无法换取令牌。

1.5 密码模式(Resource Owner Password Credentials Grant)

用户直接向客户端提供用户名和密码,客户端用这些凭证向授权服务器换取令牌。此模式违背了 OAuth2.0 的核心理念——不让第三方接触用户密码。

适用条件

  • 客户端与授权服务器属于同一组织(第一方应用)。
  • 用户对客户端有高度信任(如操作系统级应用)。
  • 无法使用重定向的场景(如部分移动端或命令行工具)。
安全风险:密码模式要求客户端存储用户明文密码,一旦客户端被攻破,所有用户凭证将泄露。建议仅在迁移过渡期使用,并配合强密码策略和短令牌有效期。

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

此模式不涉及用户,客户端使用自己的凭证(client_id + client_secret)直接向授权服务器请求令牌。适用于微服务间、后端批处理任务等机器对机器(M2M)通信场景。

典型应用

  • 定时任务从用户数据服务拉取报表。
  • API 网关内部服务间认证。
  • 后台管理系统的服务调用。
四种授权模式适用场景对比 四种授权模式适用场景对比 授权码模式 Web 应用 有后端服务器 安全等级:★★★★★ 推荐首选 隐式模式 纯前端 SPA 无后端服务器 安全等级:★★☆☆☆ 已弃用 密码模式 第一方应用 高度信任场景 安全等级:★★★☆☆ 谨慎使用 客户端凭证模式 服务间通信 无用户参与 安全等级:★★★★☆ M2M 首选 用户参与度:高 ←————————————————————————→ 低 选择建议 有后端 → 授权码模式;无用户 → 客户端凭证模式;其他情况优先考虑 PKCE 扩展

1.7 令牌类型与生命周期

OAuth2.0 定义了两种核心令牌:

令牌类型 用途 典型有效期 安全要求
Access Token 访问受保护资源的凭证 15 分钟 - 1 小时 短有效期,减少泄露影响
Refresh Token 获取新的 Access Token 7 天 - 30 天 需安全存储,可撤销
缓存策略启示:Access Token 的短有效期特性决定了令牌缓存是性能优化的关键。后续章节将深入讲解如何通过本地缓存减少授权服务器压力,以及异步导出场景下的令牌热点削峰方案。

1.8 本章小结

  • 授权码模式是最安全的 Web 应用授权方案,令牌仅在后端传输。
  • 隐式模式已被 OAuth2.1 移除,SPA 应使用授权码 + PKCE。
  • 密码模式仅适用于高度信任的第一方场景,应避免广泛使用。
  • 客户端凭证模式是服务间通信的标准方案,无用户参与。
  • 理解四种模式是设计令牌缓存策略的基础,不同模式对令牌的获取频率、存储位置和刷新策略有直接影响。