1. OAuth2.0 协议核心概念:令牌、授权码、客户端凭证、刷新令牌、作用域
OAuth2.0 是当今分布式系统与微服务架构中最主流的授权框架。它定义了一组角色与令牌交互的规范,使得第三方应用可以在不获取用户密码的前提下,安全地访问受保护资源。理解其核心概念是后续实现令牌校验与缓存异步刷新任务的基础。
1.1 协议中的四大角色
在深入令牌细节之前,必须先明确 OAuth2.0 的四个参与方。所有令牌的颁发、传递与校验都围绕这些角色展开。
| 角色 | 英文 | 职责描述 |
|---|---|---|
| 资源拥有者 | Resource Owner | 通常是最终用户,拥有受保护资源的访问权限。例如,用户的联系人列表。 |
| 客户端 | Client | 需要访问用户资源的第三方应用,如一个数据分析平台请求读取用户的邮箱。 |
| 授权服务器 | Authorization Server | 负责验证用户身份并颁发令牌的核心服务。它是整个协议的中枢。 |
| 资源服务器 | Resource Server | 托管受保护资源的服务,必须验证访问令牌的有效性后才能返回数据。 |
1.2 五大核心概念详解
OAuth2.0 的灵活性来源于其精心设计的令牌体系。以下五个概念构成了协议的数据模型基础。
1.2.1 访问令牌(Access Token)
访问令牌是客户端用来访问资源服务器的凭证。它是一个字符串,通常采用 JWT 格式或不透明字符串。令牌携带了作用域、颁发者、过期时间等关键信息。资源服务器必须校验令牌的签名、有效期和作用域。
1.2.2 授权码(Authorization Code)
授权码是授权码流程中的临时中间凭证。用户通过浏览器授权后,授权服务器将授权码返回给客户端,客户端再用授权码换取访问令牌。授权码的生命周期极短(通常几十秒),且只能使用一次,有效防止了令牌在传输过程中被截获。
1.2.3 客户端凭证(Client Credentials)
客户端凭证是客户端自身的身份标识,包含 client_id 和 client_secret。在无需用户参与的机器对机器(M2M)场景中,客户端直接使用自己的凭证向授权服务器申请令牌。
1.2.4 刷新令牌(Refresh Token)
刷新令牌用于在访问令牌过期后,无需用户重新授权即可获取新的访问令牌。它是实现“长会话”和“无感续期”的关键。刷新令牌通常具有更长的有效期,且必须安全存储。
1.2.5 作用域(Scope)
作用域定义了令牌的权限范围。例如,read:user 表示读取用户信息,write:posts 表示发布文章。资源服务器根据令牌中的 scope 决定是否允许执行特定操作。
1.3 核心概念关系图
下图展示了五大核心概念在授权码流程中的交互关系。箭头方向代表数据流向,节点颜色区分了角色与令牌类型。
1.4 令牌类型与使用场景对比
不同的令牌类型适用于不同的安全场景。下表从生命周期、安全等级和典型用途三个维度进行对比,帮助你在架构设计时做出正确选择。
| 令牌类型 | 生命周期 | 安全等级 | 典型用途 |
|---|---|---|---|
| 授权码 | 极短(秒级) | 高 | 前端 + 后端分离的 Web 应用 |
| 访问令牌 | 短(分钟~小时级) | 中 | 直接访问资源 API |
| 刷新令牌 | 长(天~周级) | 高 | 无感续期访问令牌 |
| 客户端凭证 | 按需 | 中 | 服务间 M2M 通信 |
1.5 作用域的设计原则
作用域是 OAuth2.0 中实现细粒度权限控制的核心机制。设计良好的作用域体系可以显著提升系统的安全性和可维护性。
- 最小权限原则: 每个令牌只赋予完成当前任务所需的最小作用域集合。例如,只读操作不应包含写权限。
- 命名规范: 采用
resource:action格式,如user:read、order:write,便于资源服务器解析。 - 作用域校验: 资源服务器在每次请求中都必须校验令牌的作用域是否包含目标操作所需的权限。
admin 作用域),这会导致权限失控。也不要过于细粒度(如每个按钮一个作用域),这会增加令牌大小和校验复杂度。建议控制在 5~20 个作用域之间。
1.6 令牌校验的初步思考
在理解了核心概念后,我们可以初步思考令牌校验的工程挑战。资源服务器在接收到请求时,必须完成以下校验步骤:
- 令牌存在性: 检查请求头中是否携带了
Authorization: Bearer <token>。 - 令牌格式: 如果是 JWT,校验 Header 和 Payload 的 JSON 结构是否合法。
- 签名验证: 使用授权服务器的公钥验证令牌签名,防止伪造。
- 有效期检查: 确认当前时间在
exp和nbf声明之间。 - 作用域匹配: 验证令牌的
scope是否包含当前请求所需的权限。
这些校验步骤在高并发场景下会带来显著的性能开销,这也是本课程后续引入“缓存异步刷新”架构的直接原因。