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 应用。其核心思想是:客户端先通过浏览器获取一个临时的“授权码”,再用这个授权码向授权服务器换取访问令牌。这样,访问令牌永远不会暴露在用户浏览器中。

下图展示了授权码模式的完整交互流程:

授权码模式交互流程 授权码模式(Authorization Code Grant)交互流程 资源所有者 (用户浏览器) 客户端 (Web 后端) 授权服务器 资源服务器 1. 访问应用 2. 构造授权请求 URL 3. 浏览器重定向 4. 用户登录并授权 5. 返回授权码(code) 6. 通过回调 URL 传递 code 7. POST /token (code + client_secret) 8. 返回 access_token + refresh_token 9. GET /resource (Bearer token) 10. 返回受保护资源 关键安全特性: 访问令牌仅通过客户端后端与授权服务器之间的安全信道传输,用户浏览器只接触临时的授权码,极大降低了令牌泄露风险。

上述流程可以归纳为以下关键步骤:

  1. 用户访问客户端:资源所有者(用户)通过浏览器访问客户端应用。
  2. 客户端构造授权请求:客户端将用户浏览器重定向到授权服务器的授权端点(/authorize),并附带 client_id、redirect_uri、response_type=code 等参数。
  3. 用户认证并授权:用户在授权服务器上登录,并同意客户端请求的权限范围。
  4. 授权服务器返回授权码:授权服务器将用户浏览器重定向回客户端指定的 redirect_uri,并在 URL 查询参数中附带一个临时的授权码(code)。
  5. 客户端换取令牌:客户端后端使用授权码,通过安全信道向授权服务器的令牌端点(/token)发起 POST 请求,并附上 client_id、client_secret 和 code。
  6. 授权服务器颁发令牌:授权服务器验证授权码和客户端身份后,返回访问令牌(access_token)和可选的刷新令牌(refresh_token)。
  7. 客户端访问资源:客户端使用访问令牌向资源服务器请求受保护资源。
Mock 服务实战要点: 在构建 Mock 授权服务器时,我们需要模拟上述流程中的关键端点(/authorize 和 /token)。可观测性埋点应覆盖:授权码生成耗时、令牌颁发成功率、客户端身份验证失败次数、以及令牌的过期时间分布。这些指标将帮助我们诊断 Mock 服务的健康状态。

2.4 令牌刷新流程

当访问令牌过期后,客户端可以使用刷新令牌来获取新的访问令牌,而无需用户再次交互。这个流程对于提升用户体验至关重要。

令牌刷新流程 令牌刷新流程 客户端 授权服务器 资源服务器 1. 请求资源(过期令牌) 2. 返回 401 Unauthorized 3. POST /token (grant_type=refresh_token) 4. 返回新的 access_token 可观测性关注点: 刷新令牌的轮换策略(是否发放新刷新令牌)、刷新请求的失败率(如刷新令牌过期或被撤销)、刷新操作的端到端延迟。

令牌刷新流程的核心步骤:

  • 检测令牌过期:客户端使用访问令牌请求资源服务器时,收到 401 Unauthorized 响应,或通过本地逻辑判断令牌已过期。
  • 发起刷新请求:客户端向授权服务器的令牌端点发送 POST 请求,参数包含 grant_type=refresh_token 和 refresh_token。
  • 颁发新令牌:授权服务器验证刷新令牌的有效性,返回新的访问令牌(以及可选的新的刷新令牌)。
安全注意事项: 刷新令牌是长期凭证,其安全性至关重要。在生产环境中,应实施刷新令牌轮换(Refresh Token Rotation)机制,即每次使用刷新令牌后,旧的刷新令牌立即失效并发放一个新的刷新令牌。在 Mock 服务中,我们可以通过可观测性数据来模拟和验证这种轮换策略的正确性。