主题
OAuth2 简介
OAuth2 是一个开放标准的授权协议,允许用户让第三方应用访问该用户在某个网站上的资源,而无需将用户名和密码提供给第三方应用。
为什么使用 OAuth2?
传统方式的问题
在 OAuth2 出现之前,第三方应用获取用户数据通常需要:
- 用户提供用户名和密码 - 用户需要将账号密码直接交给第三方应用
- 安全风险高 - 第三方应用可能滥用或泄露用户凭证
- 权限控制差 - 一旦授权,第三方应用拥有用户的全部权限
- 撤销困难 - 用户无法方便地撤销第三方应用的访问权限
OAuth2 的优势
使用 OAuth2 协议可以解决上述问题:
- 无需提供密码 - 用户只需要授权,不需要提供账号密码
- 权限可控 - 用户可以精确控制第三方应用的访问权限
- 易于撤销 - 用户可以随时撤销授权
- 安全性高 - 使用令牌(Token)机制,令牌可以定期失效和刷新
核心角色
OAuth2 协议涉及四个核心角色:
1. 资源所有者 (Resource Owner)
定义:能够授权访问受保护资源的实体。
说明:通常就是最终用户,拥有对受保护资源的完全控制权。
示例:拥有账户信息和数据的用户。
2. 客户端 (Client)
定义:代表资源所有者请求访问受保护资源的第三方应用程序。
说明:需要访问用户资源的第三方应用。
示例:
- 移动应用
- Web 应用
- 桌面应用
- 后端服务
3. 授权服务器 (Authorization Server)
定义:验证用户身份并颁发访问令牌的服务器。
说明:负责用户认证和授权,发放访问令牌。
功能:
- 验证用户身份
- 验证客户端身份
- 颁发授权码
- 颁发访问令牌
- 刷新令牌
4. 资源服务器 (Resource Server)
定义:托管受保护资源的服务器。
说明:存储用户数据,根据访问令牌提供数据服务。
功能:
- 验证访问令牌
- 提供受保护的资源
- 返回用户数据
角色关系
授权模式
OAuth2 定义了四种授权模式,每种模式适用于不同的应用场景:
1. 授权码模式 (Authorization Code)
适用场景:最安全的模式,适用于有后端服务器的 Web 应用
特点:
- 安全性最高
- 支持刷新令牌
- 令牌不会暴露给前端
推荐:✅ 推荐使用
2. 隐式授权模式 (Implicit)
适用场景:纯前端应用,无后端服务器
特点:
- 简单快捷
- 但安全性较低
- 不支持刷新令牌
推荐:⚠️ 不推荐使用
3. 密码模式 (Resource Owner Password Credentials)
适用场景:用户高度信任的应用,如官方应用
特点:
- 需要用户提供密码
- 安全性较差
推荐:❌ 仅限特殊场景
4. 客户端模式 (Client Credentials)
适用场景:服务端之间的通信,不涉及用户资源
特点:
- 无需用户参与
- 用于后端服务之间的认证
推荐:✅ 适用于服务间认证
授权码模式详解
授权码模式是 OAuth2 最完整、最安全的授权流程,包含以下步骤:
步骤概览
关键概念
授权码 (Authorization Code)
- 临时凭证,有效期短(通常10分钟)
- 一次性使用
- 由授权服务器颁发给客户端
- 用于换取访问令牌
访问令牌 (Access Token)
- 用于访问受保护资源
- 有效期较短(通常1-2小时)
- 放在 HTTP 请求头中
- 需要妥善保管
刷新令牌 (Refresh Token)
- 用于获取新的访问令牌
- 有效期较长(通常数天或数周)
- 当访问令牌过期时使用
- 需要妥善保管
state 参数
- 随机字符串,用于防止 CSRF 攻击
- 客户端生成,授权服务器原样返回
- 客户端需要验证返回的 state 是否匹配
安全性考虑
1. 保护密钥
client_secret必须保密- 不能在前端代码中暴露
- 建议在后端服务器完成令牌交换
2. 使用 state 参数
防止 CSRF 攻击,每次授权请求都使用随机的 state。
3. 令牌存储
- 不要将令牌存储在 URL 中
- 不要使用 localStorage 存储敏感令牌
- 建议使用 httpOnly cookie 或后端 session
4. 令牌有效期管理
- 合理设置令牌过期时间
- 使用刷新令牌自动续期
- 提供退出登录撤销令牌的机制
术语对照表
| 英文术语 | 中文翻译 | 说明 |
|---|---|---|
| Resource Owner | 资源所有者 | 用户 |
| Client | 客户端 | 第三方应用 |
| Authorization Server | 授权服务器 | 认证服务器 |
| Resource Server | 资源服务器 | API 服务器 |
| Authorization Code | 授权码 | 临时凭证 |
| Access Token | 访问令牌 | 用于访问资源的凭证 |
| Refresh Token | 刷新令牌 | 用于获取新的访问令牌 |
| Grant Type | 授权类型 | OAuth2 的授权模式 |
| Scope | 权限范围 | 请求的访问权限 |
| Redirect URI | 回调地址 | 授权完成后的跳转地址 |
相关资源
文档版本: v2.0.0 最后更新: 2025-12-29