2. OAuth2.0 核心概念:资源所有者、客户端、授权服务器、资源服务器、访问令牌、刷新令牌、授权码

OAuth2.0 授权码模式并非凭空产生的协议,它由七个核心概念构成。理解这些概念及其相互关系,是掌握授权码模式的前提。本节将逐一拆解这些概念,并展示它们在授权流程中的角色。

2.1 七个核心概念一览

下表从定义、职责和典型示例三个维度,对这七个概念进行对比,帮助建立全局认知。

概念 定义与职责 典型示例
资源所有者 拥有受保护资源的实体,能够授权客户端访问其资源。 用户(如张三)
客户端 代表资源所有者请求访问受保护资源的应用程序。 第三方 Web 应用、移动 App
授权服务器 验证资源所有者身份并颁发访问令牌的服务器。 开放平台、GitHub OAuth 服务
资源服务器 托管受保护资源的服务器,验证访问令牌并响应资源请求。 用户信息 API、GitHub API
访问令牌 用于访问受保护资源的凭证,具有时效性和作用域。 Bearer eyJhbGciOiJSUzI1NiIs...
刷新令牌 用于在访问令牌过期后获取新访问令牌的长期凭证。 refresh_token: 1/abcdef123456
授权码 授权服务器颁发的临时凭证,客户端用它交换访问令牌。 code: 4/P7q7W91a-oMsCeLvIaQm6bTrgtp7

2.2 核心角色与交互关系

在授权码模式中,四个核心角色(资源所有者、客户端、授权服务器、资源服务器)通过两条关键通道进行交互:前端通道(用户代理)和后端通道(服务器到服务器)。下图展示了它们之间的静态关系。

OAuth2.0 核心角色关系图 OAuth2.0 核心角色与交互关系 资源所有者 (用户) 客户端 (第三方应用) 授权服务器 (认证中心) 资源服务器 (API 服务) 授权请求 请求授权码 颁发令牌 携带令牌访问资源 关键交互说明 1. 用户授权客户端访问其资源 2. 客户端向授权服务器请求授权码 3. 授权服务器验证用户身份后 颁发授权码/令牌 4. 客户端使用令牌访问资源服务器 5. 资源服务器验证令牌有效性 6. 返回受保护资源 7. 令牌过期后使用刷新令牌续期
关键区分:授权服务器与资源服务器在逻辑上是分离的,但在物理部署上可以是同一台服务器。生产环境中,建议将两者分离部署,以降低安全风险并提升扩展性。

2.3 三种令牌的对比

访问令牌、刷新令牌和授权码是 OAuth2.0 中三种最重要的凭证。它们各自的生命周期、用途和安全要求截然不同。

凭证类型 生命周期 主要用途 安全要求
授权码 极短(通常 1-10 分钟) 交换访问令牌 一次性使用,必须通过后端通道交换
访问令牌 较短(通常 15 分钟 - 2 小时) 访问受保护资源 不暴露给用户代理,使用 Bearer 方案
刷新令牌 较长(通常数天到数月) 获取新的访问令牌 必须安全存储,支持吊销

2.4 授权码模式的核心流程

授权码模式之所以被认为是 OAuth2.0 中最安全的授权流程,关键在于它使用了授权码作为中间凭证,将访问令牌的颁发限制在后端通道中。下图展示了从用户授权到最终获取资源的完整流程。

授权码模式核心流程 授权码模式核心流程 资源所有者 客户端 授权服务器 资源服务器 ① 发起授权请求 ② 请求授权码 ③ 用户认证与授权 ④ 返回授权码 ⑤ 用授权码交换令牌 ⑥ 返回访问令牌 + 刷新令牌 ⑦ 携带访问令牌请求资源 ⑧ 返回受保护资源 关键安全设计:步骤 ⑤ 和 ⑥ 发生在后端通道(服务器到服务器),访问令牌不经过用户代理,避免泄露

2.5 关键安全设计原则

  • 授权码一次性使用:授权码只能使用一次,即使被截获,攻击者也无法重复使用。
  • 后端通道交换:访问令牌只能通过客户端与授权服务器之间的直接通信(后端通道)获取,不经过用户浏览器。
  • 刷新令牌轮转:每次使用刷新令牌获取新访问令牌时,授权服务器可以同时颁发新的刷新令牌,使旧的刷新令牌失效。
  • 作用域最小化:客户端请求的权限范围(scope)应遵循最小权限原则,只请求必要的资源访问权限。
常见误区:授权码模式中,客户端在步骤 ④ 收到的授权码是临时凭证,不是访问令牌。开发者常犯的错误是将授权码暴露在前端日志或 URL 参数中,或尝试在前端直接使用授权码换取令牌。正确的做法是:授权码必须通过后端服务器发送到授权服务器进行交换。

2.6 概念关系总结

七个核心概念构成了 OAuth2.0 授权码模式的完整生态。从流程上看,它们的关系可以概括为:

  1. 资源所有者通过客户端发起授权请求。
  2. 授权服务器验证资源所有者身份后,颁发授权码给客户端。
  3. 客户端使用授权码向授权服务器交换访问令牌和刷新令牌。
  4. 客户端使用访问令牌向资源服务器请求受保护资源。
  5. 当访问令牌过期时,客户端使用刷新令牌获取新的访问令牌。