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 核心角色与交互关系
在授权码模式中,四个核心角色(资源所有者、客户端、授权服务器、资源服务器)通过两条关键通道进行交互:前端通道(用户代理)和后端通道(服务器到服务器)。下图展示了它们之间的静态关系。
关键区分:授权服务器与资源服务器在逻辑上是分离的,但在物理部署上可以是同一台服务器。生产环境中,建议将两者分离部署,以降低安全风险并提升扩展性。
2.3 三种令牌的对比
访问令牌、刷新令牌和授权码是 OAuth2.0 中三种最重要的凭证。它们各自的生命周期、用途和安全要求截然不同。
| 凭证类型 | 生命周期 | 主要用途 | 安全要求 |
|---|---|---|---|
| 授权码 | 极短(通常 1-10 分钟) | 交换访问令牌 | 一次性使用,必须通过后端通道交换 |
| 访问令牌 | 较短(通常 15 分钟 - 2 小时) | 访问受保护资源 | 不暴露给用户代理,使用 Bearer 方案 |
| 刷新令牌 | 较长(通常数天到数月) | 获取新的访问令牌 | 必须安全存储,支持吊销 |
2.4 授权码模式的核心流程
授权码模式之所以被认为是 OAuth2.0 中最安全的授权流程,关键在于它使用了授权码作为中间凭证,将访问令牌的颁发限制在后端通道中。下图展示了从用户授权到最终获取资源的完整流程。
2.5 关键安全设计原则
- 授权码一次性使用:授权码只能使用一次,即使被截获,攻击者也无法重复使用。
- 后端通道交换:访问令牌只能通过客户端与授权服务器之间的直接通信(后端通道)获取,不经过用户浏览器。
- 刷新令牌轮转:每次使用刷新令牌获取新访问令牌时,授权服务器可以同时颁发新的刷新令牌,使旧的刷新令牌失效。
- 作用域最小化:客户端请求的权限范围(scope)应遵循最小权限原则,只请求必要的资源访问权限。
常见误区:授权码模式中,客户端在步骤 ④ 收到的授权码是临时凭证,不是访问令牌。开发者常犯的错误是将授权码暴露在前端日志或 URL 参数中,或尝试在前端直接使用授权码换取令牌。正确的做法是:授权码必须通过后端服务器发送到授权服务器进行交换。
2.6 概念关系总结
七个核心概念构成了 OAuth2.0 授权码模式的完整生态。从流程上看,它们的关系可以概括为:
- 资源所有者通过客户端发起授权请求。
- 授权服务器验证资源所有者身份后,颁发授权码给客户端。
- 客户端使用授权码向授权服务器交换访问令牌和刷新令牌。
- 客户端使用访问令牌向资源服务器请求受保护资源。
- 当访问令牌过期时,客户端使用刷新令牌获取新的访问令牌。