1. OAuth2.0 基础概念:四种授权模式核心流程对比

OAuth2.0 是一种开放授权标准,允许第三方应用在用户授权的前提下,安全地访问资源拥有者在资源服务器上的受保护资源,而无需暴露用户的长期凭证(如密码)。其核心是颁发一个短期、有作用域的访问令牌(Access Token)。根据客户端类型与安全需求,OAuth2.0 定义了四种主要的授权模式。

1.1 授权码模式(Authorization Code Grant)

这是功能最完整、安全性最高的模式,适用于有后端服务器的 Web 应用。核心流程是客户端先获取一个临时授权码,再用授权码换取访问令牌,避免令牌直接暴露在用户代理(浏览器)中。

适用场景: 有服务端后端的 Web 应用、原生 App(配合 PKCE 扩展)。
授权码模式核心流程 资源拥有者 用户代理 客户端 授权服务器 资源服务器 ① 访问请求 ② 授权请求 ③ 授权码 ④ 令牌请求 ⑤ 访问令牌 ⑥ 令牌传递 ⑦ 资源请求 ⑧ 资源响应 流程说明 ① 用户访问客户端 → ② 客户端将用户重定向到授权服务器 → ③ 用户认证后,授权服务器返回授权码 ④ 客户端用授权码向授权服务器请求令牌 → ⑤ 授权服务器返回访问令牌(+ 刷新令牌) ⑥ 客户端使用令牌访问资源服务器 → ⑦ 资源服务器验证令牌 → ⑧ 返回受保护资源 关键安全点: 授权码是一次性的,且必须通过客户端服务器与授权服务器之间的直接通信来交换令牌,令牌不会经过用户代理。

1.2 隐式模式(Implicit Grant)

隐式模式是授权码模式的简化版,直接返回访问令牌,省略了授权码交换步骤。此模式安全性较低,令牌直接暴露在 URL 片段中,现已不推荐使用,已被授权码模式 + PKCE 取代。

安全警告: 隐式模式不返回刷新令牌,且令牌可能被浏览器历史、Referer 头泄露。OAuth 2.1 已移除该模式。

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

用户直接向客户端提供用户名和密码,客户端用这些凭证向授权服务器换取令牌。此模式要求客户端高度可信,且用户凭证会暴露给客户端,仅适用于迁移场景或高度信任的第一方应用。

最佳实践: 密码模式应仅在无法使用授权码模式时使用,且必须支持令牌刷新机制。

1.4 客户端模式(Client Credentials Grant)

客户端以自己的身份(而非用户身份)向授权服务器请求令牌。适用于服务器到服务器的通信、后台任务、API 网关等无需用户授权的场景。

1.5 四种模式核心对比

对比维度 授权码模式 隐式模式 密码模式 客户端模式
授权主体 资源拥有者 资源拥有者 资源拥有者 客户端自身
是否需要用户交互 是 是 是 否
令牌获取方式 授权码 → 令牌 直接返回令牌 凭证 → 令牌 客户端凭证 → 令牌
令牌存储位置 客户端服务器 用户代理(浏览器) 客户端服务器 客户端服务器
是否支持刷新令牌 是 否 是 通常否
安全性等级 高 低 中 高(无用户凭证泄露)
推荐状态 强烈推荐 已废弃 谨慎使用 推荐(服务间通信)

1.6 四种模式流程对比图

四种授权模式流程对比 四种授权模式核心流程对比 授权码模式 用户 → 客户端 → 授权服务器 ↓ 授权码 → 令牌交换 令牌仅存于服务端 安全等级:高 隐式模式 用户 → 客户端 → 授权服务器 ↓ 直接返回令牌 令牌暴露在 URL 中 安全等级:低 密码模式 用户提供凭证给客户端 ↓ 客户端用凭证换令牌 凭证暴露给客户端 安全等级:中 客户端模式 客户端直接请求令牌 ↓ 无需用户参与 适用于服务间通信 安全等级:高 关键差异总结 1. 授权码模式:最安全,令牌不经过浏览器,支持刷新令牌,是 OAuth 2.1 推荐的首选模式。 2. 隐式模式:已废弃,令牌直接暴露在 URL 中,存在安全风险,应迁移至授权码模式 + PKCE。 3. 密码模式:用户凭证直接交给客户端,仅适用于高度信任的第一方应用或迁移场景。 4. 客户端模式:无需用户授权,适用于后台服务、API 网关、定时任务等场景。 选择建议 • 有用户参与的 Web/移动应用 → 授权码模式 + PKCE • 服务间通信 / 后台任务 → 客户端模式 • 遗留系统迁移 → 密码模式(短期过渡) • 隐式模式 → 立即迁移至授权码模式 + PKCE

1.7 关键术语速查

  • Access Token(访问令牌): 用于访问受保护资源的凭证,通常有有效期和作用域限制。
  • Refresh Token(刷新令牌): 用于在访问令牌过期后获取新的访问令牌,无需用户重新授权。
  • Authorization Code(授权码): 授权码模式中的临时凭证,一次性使用,用于交换访问令牌。
  • Client ID / Client Secret: 客户端在授权服务器注册时获得的标识和密钥。
  • Scope(作用域): 令牌的权限范围,限制客户端可以访问的资源。
  • Redirect URI(回调地址): 授权服务器在授权完成后重定向用户代理的地址。
调试提示: 在 Mock 环境中调试 OAuth2.0 流程时,建议先使用授权码模式验证完整流程,再根据实际需求切换到其他模式。使用 Postman 或 curl 可以手动模拟授权码交换和令牌请求。