1. OAuth2.0 核心概念回顾:授权码模式、令牌、作用域、客户端与资源服务器
在深入 Mock 依赖隔离与移植适配之前,必须重新校准 OAuth2.0 的核心概念。本章聚焦授权码模式、令牌、作用域、客户端与资源服务器这五个基石,确保后续章节的 Mock 策略建立在统一、精确的语义之上。
1.1 授权码模式(Authorization Code Flow)
授权码模式是 OAuth2.0 中最完整、最安全的流程,适用于有后端服务的 Web 应用。它通过一个临时的“授权码”作为中间凭证,避免令牌直接暴露在用户代理(浏览器)中。
核心流程(6步):
- 授权请求:客户端引导用户访问授权服务器,附带
response_type=code、client_id、redirect_uri、scope。 - 用户认证:授权服务器验证用户身份,并询问是否授权客户端请求的作用域。
- 授权码下发:用户同意后,授权服务器通过
redirect_uri将授权码(code)返回给客户端。 - 令牌请求:客户端使用授权码 +
client_secret向授权服务器的令牌端点发起 POST 请求。 - 令牌下发:授权服务器验证授权码和客户端凭证,返回
access_token、refresh_token(可选)、expires_in。 - 资源访问:客户端使用
access_token请求资源服务器受保护的 API。
1.2 令牌(Token)
令牌是客户端访问受保护资源的凭证。OAuth2.0 不规定令牌格式,但业界主流使用 JWT(JSON Web Token)作为自包含令牌。
| 令牌类型 | 生命周期 | 用途 | 典型格式 |
|---|---|---|---|
| Access Token | 短(15 分钟 ~ 1 小时) | 直接调用资源 API | JWT 或 opaque string |
| Refresh Token | 长(数天 ~ 数月) | 获取新的 Access Token | 通常为 opaque string |
| ID Token | 与 Access Token 相同 | 身份认证(OpenID Connect) | JWT |
Mock 适配要点: 在 Mock 环境中,建议使用 JWT 格式的 Access Token,因为 JWT 包含
sub、scope、exp 等声明,便于 Mock 服务器直接验证而无需查询数据库。Opaque Token 需要额外的 Token 自省端点,增加 Mock 复杂度。
1.3 作用域(Scope)
作用域是令牌的权限粒度控制机制。客户端在授权请求时声明所需的作用域,授权服务器根据用户授权决定最终授予的作用域。
- 格式:空格分隔的字符串,如
read write delete。 - 最佳实践:使用
resource:action命名规范,如user:read、order:write。 - 验证:资源服务器必须校验 Access Token 中的
scope是否包含当前 API 所需的最小权限。
常见陷阱: 在 Mock 环境中,作用域验证经常被忽略或过度简化。正确的 Mock 应该模拟“作用域不足”的 403 响应,以验证客户端的错误处理逻辑。
1.4 客户端(Client)
客户端是代表资源所有者(用户)请求受保护资源的应用程序。OAuth2.0 定义了多种客户端类型,每种类型的安全约束不同。
| 客户端类型 | 典型场景 | 凭证安全 | 推荐流程 |
|---|---|---|---|
| 机密客户端 | 后端 Web 应用、服务端 API | 可安全存储 client_secret | 授权码模式 |
| 公开客户端 | SPA、移动 App | 无法安全存储 secret | 授权码模式 + PKCE |
| 服务客户端 | 微服务间调用、后台任务 | 使用 client_credentials | 客户端凭证模式 |
1.5 资源服务器(Resource Server)
资源服务器托管受保护的 API,负责验证 Access Token 并执行权限检查。资源服务器不直接参与令牌颁发,只消费令牌。
资源服务器的核心职责:
- 令牌验证:验证 JWT 签名、过期时间、issuer、audience。
- 作用域检查:确认令牌包含当前 API 所需的作用域。
- 用户身份提取:从令牌中提取
sub或client_id用于业务逻辑。
1.6 核心概念关系总结
| 概念 | 角色 | 关键属性 | Mock 关注点 |
|---|---|---|---|
| 授权码模式 | 流程 | code、redirect_uri、state | 模拟授权码生成与兑换端点 |
| Access Token | 凭证 | sub、scope、exp、iat | JWT 签名与过期模拟 |
| Scope | 权限 | read、write、admin | 作用域不足的 403 响应 |
| 客户端 | 请求方 | client_id、client_secret | 凭证验证与客户端类型区分 |
| 资源服务器 | 验证方 | JWKS、audience | 令牌验证逻辑 Mock |
课程前置提示: 后续章节将基于本节的核心概念,构建可移植的 Mock 依赖隔离层。重点在于:
• 如何在不依赖真实授权服务器的情况下,模拟授权码模式的完整流程。
• 如何设计可切换的令牌验证策略(JWT 本地验证 vs. 远程自省)。
• 如何通过作用域 Mock 覆盖权限边界测试。
• 如何在不依赖真实授权服务器的情况下,模拟授权码模式的完整流程。
• 如何设计可切换的令牌验证策略(JWT 本地验证 vs. 远程自省)。
• 如何通过作用域 Mock 覆盖权限边界测试。