2. OAuth2.0 核心概念精讲
OAuth 2.0 是一种授权框架,它允许第三方应用(客户端)在资源所有者(用户)授权的前提下,安全地访问资源所有者托管在资源服务器上的受保护资源。理解其核心角色与交互流程,是构建可观测 Mock 服务的基础。
2.1 四大核心角色
OAuth 2.0 定义了四个明确的角色,它们之间的交互构成了整个授权体系。下表总结了每个角色的职责与典型示例:
| 角色 | 英文名称 | 核心职责 | 典型示例 |
|---|---|---|---|
| 资源所有者 | Resource Owner | 拥有受保护资源的实体,通常是用户。它授权客户端访问其资源。 | 使用登录第三方网站的用户 |
| 客户端 | Client | 代表资源所有者请求访问受保护资源的第三方应用。它需要获得授权。 | 一个需要读取用户头像的 Web 应用 |
| 授权服务器 | Authorization Server | 负责验证资源所有者身份并颁发访问令牌的核心服务。它是授权流程的枢纽。 | 开放平台、Auth0、Keycloak |
| 资源服务器 | Resource Server | 托管受保护资源的服务器。它使用访问令牌来验证客户端的访问权限。 | API 服务器(提供用户头像、昵称) |
可观测性视角: 在 Mock 服务中,我们需要为每个角色生成独立的可观测性数据。例如,记录授权服务器的令牌颁发延迟、资源服务器的令牌验证失败率、客户端的授权请求重试次数等。
2.2 关键令牌概念
令牌是 OAuth 2.0 的核心凭证。理解两种主要令牌的区别至关重要:
- 访问令牌(Access Token):用于访问受保护资源的凭证。它通常具有较短的有效期(例如 1 小时),并且包含授权范围(scope)。客户端在请求资源服务器时必须携带此令牌。
- 刷新令牌(Refresh Token):用于在访问令牌过期后,无需用户再次授权即可获取新的访问令牌的凭证。它通常具有较长的有效期,并且是可选发放的。
| 特性 | 访问令牌 | 刷新令牌 |
|---|---|---|
| 主要用途 | 访问资源 | 获取新的访问令牌 |
| 有效期 | 短(分钟/小时) | 长(天/月) |
| 传输方式 | HTTP 请求头(Authorization: Bearer) | HTTP POST 请求体 |
| 是否必须 | 是 | 否(可选) |
| 可观测性关注点 | 令牌颁发速率、验证成功率、过期分布 | 令牌轮换频率、刷新失败原因、生命周期 |
2.3 授权码模式流程详解
授权码模式(Authorization Code Grant)是 OAuth 2.0 中最安全、最常用的授权流程,特别适用于有后端的 Web 应用。其核心思想是:客户端先通过浏览器获取一个临时的“授权码”,再用这个授权码向授权服务器换取访问令牌。这样,访问令牌永远不会暴露在用户浏览器中。
下图展示了授权码模式的完整交互流程:
上述流程可以归纳为以下关键步骤:
- 用户访问客户端:资源所有者(用户)通过浏览器访问客户端应用。
- 客户端构造授权请求:客户端将用户浏览器重定向到授权服务器的授权端点(
/authorize),并附带client_id、redirect_uri、response_type=code等参数。 - 用户认证并授权:用户在授权服务器上登录,并同意客户端请求的权限范围。
- 授权服务器返回授权码:授权服务器将用户浏览器重定向回客户端指定的
redirect_uri,并在 URL 查询参数中附带一个临时的授权码(code)。 - 客户端换取令牌:客户端后端使用授权码,通过安全信道向授权服务器的令牌端点(
/token)发起 POST 请求,并附上client_id、client_secret和code。 - 授权服务器颁发令牌:授权服务器验证授权码和客户端身份后,返回访问令牌(
access_token)和可选的刷新令牌(refresh_token)。 - 客户端访问资源:客户端使用访问令牌向资源服务器请求受保护资源。
Mock 服务实战要点: 在构建 Mock 授权服务器时,我们需要模拟上述流程中的关键端点(
/authorize 和 /token)。可观测性埋点应覆盖:授权码生成耗时、令牌颁发成功率、客户端身份验证失败次数、以及令牌的过期时间分布。这些指标将帮助我们诊断 Mock 服务的健康状态。
2.4 令牌刷新流程
当访问令牌过期后,客户端可以使用刷新令牌来获取新的访问令牌,而无需用户再次交互。这个流程对于提升用户体验至关重要。
令牌刷新流程的核心步骤:
- 检测令牌过期:客户端使用访问令牌请求资源服务器时,收到
401 Unauthorized响应,或通过本地逻辑判断令牌已过期。 - 发起刷新请求:客户端向授权服务器的令牌端点发送 POST 请求,参数包含
grant_type=refresh_token和refresh_token。 - 颁发新令牌:授权服务器验证刷新令牌的有效性,返回新的访问令牌(以及可选的新的刷新令牌)。
安全注意事项: 刷新令牌是长期凭证,其安全性至关重要。在生产环境中,应实施刷新令牌轮换(Refresh Token Rotation)机制,即每次使用刷新令牌后,旧的刷新令牌立即失效并发放一个新的刷新令牌。在 Mock 服务中,我们可以通过可观测性数据来模拟和验证这种轮换策略的正确性。