桶权限控制:OAuth2.0细粒度策略配置实战 - 第1节
1.1 OAuth 2.0 是什么
OAuth 2.0 是一个授权框架,它允许第三方应用在用户(资源所有者)授权的前提下,获取对用户存储在另一服务上的资源的有限访问权限,而无需暴露用户的长期凭证(如密码)。
该框架的核心思想是委托授权:用户将访问权限委托给一个客户端应用,客户端通过一个短期、作用域受限的令牌来访问资源,而不是直接使用用户的用户名和密码。
核心价值:OAuth 2.0 解决了“密码共享”的安全隐患,实现了访问权限的细粒度控制与可撤销性。
1.2 核心角色
OAuth 2.0 定义了四个核心角色,它们协同工作以完成授权流程:
| 角色 | 英文名称 | 职责描述 | 典型示例 |
|---|---|---|---|
| 资源所有者 | Resource Owner | 拥有受保护资源的实体,通常是最终用户。它授权客户端访问其资源。 | 使用登录第三方网站的用户 |
| 客户端 | Client | 代表资源所有者请求访问受保护资源的第三方应用。它需要获得授权才能获取令牌。 | 一个需要读取用户昵称的第三方游戏应用 |
| 授权服务器 | Authorization Server | 负责验证资源所有者身份并颁发授权码或访问令牌的服务器。它是整个授权流程的核心。 | 开放平台的授权服务 |
| 资源服务器 | Resource Server | 托管受保护用户资源的服务器。它接收并验证访问令牌,然后返回请求的资源。 | 的用户信息 API 服务器 |
角色关系:授权服务器和资源服务器在物理上可以是同一台服务器,但在逻辑上是两个独立的实体。授权服务器负责“发证”,资源服务器负责“验票”。
角色交互流程
下图展示了四个核心角色在标准授权码流程中的交互关系:
1.3 令牌与授权码的区别
在 OAuth 2.0 流程中,授权码和访问令牌是两个关键凭证,它们的作用、生命周期和安全级别截然不同。理解它们的区别是配置细粒度策略的基础。
| 对比维度 | 授权码 (Authorization Code) | 访问令牌 (Access Token) |
|---|---|---|
| 本质 | 一个临时凭证,代表资源所有者对客户端的授权许可。 | 一个用于访问受保护资源的凭证字符串。 |
| 用途 | 仅用于向授权服务器换取访问令牌。 | 直接用于向资源服务器请求用户数据。 |
| 生命周期 | 极短(通常几分钟),一次性使用。 | 相对较长(通常几小时到几天),可重复使用直至过期。 |
| 安全级别 | 高。通过后端服务器传递,不暴露给浏览器或用户代理。 | 中。可能存储在客户端(如浏览器本地存储),存在泄露风险。 |
| 可见性 | 对用户和浏览器不可见。 | 对客户端应用可见,可能被用户或浏览器插件捕获。 |
| 是否携带用户信息 | 否。仅是一个授权许可的引用。 | 是。通常包含用户标识、作用域、过期时间等声明(如 JWT)。 |
安全警示:授权码绝不能暴露在浏览器前端或移动端代码中。它必须通过安全的服务器到服务器通道进行交换。如果授权码被截获,攻击者可以冒充客户端换取令牌。
授权码流程中的凭证流转
下图展示了授权码和访问令牌在标准授权码流程中的具体流转位置:
关键结论:授权码是“一次性兑换券”,访问令牌是“长期通行证”。在细粒度策略配置中,我们主要对访问令牌进行作用域、权限和过期时间的控制。