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