Skip to content

OAuth2 简介

OAuth2 是一个开放标准的授权协议,允许用户让第三方应用访问该用户在某个网站上的资源,而无需将用户名和密码提供给第三方应用。

为什么使用 OAuth2?

传统方式的问题

在 OAuth2 出现之前,第三方应用获取用户数据通常需要:

  1. 用户提供用户名和密码 - 用户需要将账号密码直接交给第三方应用
  2. 安全风险高 - 第三方应用可能滥用或泄露用户凭证
  3. 权限控制差 - 一旦授权,第三方应用拥有用户的全部权限
  4. 撤销困难 - 用户无法方便地撤销第三方应用的访问权限

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

最近更新