1. OAuth2.0 核心概念回顾:授权码模式、令牌、作用域、客户端与资源服务器

在深入 Mock 依赖隔离与移植适配之前,必须重新校准 OAuth2.0 的核心概念。本章聚焦授权码模式、令牌、作用域、客户端与资源服务器这五个基石,确保后续章节的 Mock 策略建立在统一、精确的语义之上。

1.1 授权码模式(Authorization Code Flow)

授权码模式是 OAuth2.0 中最完整、最安全的流程,适用于有后端服务的 Web 应用。它通过一个临时的“授权码”作为中间凭证,避免令牌直接暴露在用户代理(浏览器)中。

核心流程(6步):
  1. 授权请求:客户端引导用户访问授权服务器,附带 response_type=code、client_id、redirect_uri、scope。
  2. 用户认证:授权服务器验证用户身份,并询问是否授权客户端请求的作用域。
  3. 授权码下发:用户同意后,授权服务器通过 redirect_uri 将授权码(code)返回给客户端。
  4. 令牌请求:客户端使用授权码 + client_secret 向授权服务器的令牌端点发起 POST 请求。
  5. 令牌下发:授权服务器验证授权码和客户端凭证,返回 access_token、refresh_token(可选)、expires_in。
  6. 资源访问:客户端使用 access_token 请求资源服务器受保护的 API。
授权码模式完整流程 授权码模式 6 步流程 用户代理 客户端 授权服务器 资源服务器 ① 授权请求 ② 用户认证 ③ 授权码 redirect_uri?code=xxx ④ 令牌请求 code + client_secret ⑤ 令牌下发 access_token + refresh_token ⑥ 资源访问 Bearer access_token 关键安全设计: • 授权码一次性使用,有效期极短(通常 10 分钟),即使被截获也无法直接获取令牌。 • 令牌请求必须验证 client_secret,确保只有真正的客户端能兑换授权码。 • 支持 PKCE(Proof Key for Code Exchange)增强公共客户端的授权码安全性。

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 并执行权限检查。资源服务器不直接参与令牌颁发,只消费令牌。

资源服务器的核心职责:

  1. 令牌验证:验证 JWT 签名、过期时间、issuer、audience。
  2. 作用域检查:确认令牌包含当前 API 所需的作用域。
  3. 用户身份提取:从令牌中提取 sub 或 client_id 用于业务逻辑。
客户端与资源服务器交互 资源服务器令牌验证流程 客户端 资源服务器 GET /api/resource Authorization: Bearer <token> 令牌验证步骤: 1. 解析 JWT Header + Payload 2. 验证签名(公钥 / JWKS) 3. 检查 exp、iss、aud 4. 检查 scope 是否包含所需权限

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 覆盖权限边界测试。