OAuth 2.0 授权框架:流程、角色与令牌类型
OAuth 2.0 这东西,说白了就是个“令牌中介”。你想想看,用户不想把密码直接给第三方应用,但又想让应用访问自己的数据——那怎么办?授权服务器出来当个裁判,发个临时令牌,搞定。
我在好几个项目里都遇到过团队对 OAuth 2.0 的理解只停留在“用微信登录”这个层面。嗯,真实落地的时候,角色划分、流程选择、令牌的生命周期管理,全都可能挖坑。今天我们就把它彻底捋清楚。
4.1 四个核心角色
先记住这四个角色,后面的流程都是围绕它们转的。
| 角色 | 英文 | 我习惯这么理解 |
|---|---|---|
| 资源所有者 | Resource Owner | 就是用户本人,拥有数据的人 |
| 客户端 | Client | 想要访问用户数据的第三方应用,比如一个天气 App |
| 授权服务器 | Authorization Server | 负责认证用户身份、发放令牌的中间人 |
| 资源服务器 | Resource Server | 真正存储用户数据的后端,验证令牌后返回数据 |
有人会问:资源服务器和授权服务器能不能合并?技术上可以,但架构上不推荐。我在设计微服务网关时,曾把两者的逻辑拆在不同的服务里,结果后续加新客户端类型的扩展性好了很多。
4.2 四种授权模式一览
OAuth 2.0 定义了四种模式,分别应对不同的客户端场景。我个人习惯把它们分成“有后端”和“纯前端”两大类。
- 授权码模式(Authorization Code) — 最常见、最安全。客户端有后端服务器,能妥善保管 client secret。流程里会出现一次临时的“授权码”。
- 隐式模式(Implicit) — 已过时,不建议用。以前用于纯前端 SPA,令牌直接在前端返回,安全性弱。
- 密码模式(Resource Owner Password Credentials) — 用户直接把密码交给客户端,客户端再用密码去换令牌。只有高度信任的场景才用,比如自家 App 的第一方登录。
- 客户端凭证模式(Client Credentials) — 没有用户参与,客户端用自己的凭证去获取令牌,用于服务间通信。
选型小贴士: 如果你在开发一个新系统,优先考虑授权码模式 + PKCE(Proof Key for Code Exchange)。PKCE 解决了授权码被拦截的问题,连纯前端 App 都能安全使用。我在升级老旧系统时,就把隐式模式全换成了这个组合,效果很好。
4.3 授权码模式完整流程(核心图)
下面这张图展示了授权码模式下各角色的交互过程,也是 OAuth 2.0 最典型的“握手”流程。你可以把它当作模板,其他模式只是在这个基础上做减法。
这张图你看清楚了吗?关键是 第三步的“授权码”是一锤子买卖——客户端用 code 换 之后,这个 code 立即失效。我当年第一次实现时,以为 code 还能重复使用,结果被安全审计直接打回。切记。
4.4 令牌类型详解
OAuth 2.0 主要涉及两种令牌:访问令牌和刷新令牌。另外,如果你遇上 OpenID Connect,还会见到 ID ,但那属于身份认证范畴,我们这次先聚焦授权。
| 令牌类型 | 作用 | 有效期 | 我的实战建议 |
|---|---|---|---|
| Access | 直接用于请求资源,类似“临时门票” | 短(通常 15 分钟 ~ 1 小时) | 避免设计过长的有效期,宁可配合 refresh 机制 |
| Refresh | 用于获取新的 Access ,不直接访问资源 | 较长(几天到几个月) | 务必在服务端存储,前端不要暴露 |
曾经踩过的坑: 我在一个 IoT 项目中,把 Access 的有效期设成了 7 天,想着减少刷新频率。结果某个设备 泄露,攻击者直接拿它调了整整一周的 API。后来我改成 30 分钟 + Refresh 双令牌机制,并实现自动续期,安全性和体验都好了很多。
4.5 实战中的避坑指南
- 不要忽略 PKCE: 即使你的客户端有后端,加一层 PKCE 也不费事,却能让授权码被拦截后依然安全。我在公司内部规范里直接写死了“所有 OAuth 2.0 流程必须启用 PKCE”。
- 存储位置: 前端不要存在 LocalStorage,那里是 XSS 的重灾区。我建议用 HttpOnly Cookie + 适当的 CSRF 防护。
- 授权服务器的选型: 小团队可以直接用 Keycloak 或 Auth0,大企业往往自建。我自己更倾向 Spring Authorization Server(Java 生态)或 Ory Hydra(云原生)。
核心要点总结:
- 记住四个角色:资源所有者、客户端、授权服务器、资源服务器。
- 授权码模式是首选,搭配 PKCE 能满足 90% 的场景。
- Access 寿命短,Refresh 保护好。
- 隐式模式已经过时,别再用了。
嗯,关于 OAuth 2.0 的角色、流程和令牌,我们就聊到这。把这套框架理解了,后面再聊更复杂的令牌内省、单点登录和权限委托,就轻松多了。