一、定位
OAuth 2.0 是一个开放授权框架(Open Authorization Framework)(而非原生的身份验证协议),核心目标是解决 “第三方应用如何在用户授权下安全访问用户资源” 的问题。它的核心价值是 “授权”(明确 “允许访问什么资源”),而非直接的 “身份验证”(确认 “用户是谁”)。
例如:当你用 QQ 账号登录某音乐 APP 时,APP 不会获取你的 QQ 密码,而是通过 OAuth 2.0 向腾讯的授权服务器请求 “获取你的昵称和头像” 的权限。
腾讯验证你的身份并征得你同意后,向 APP 发放一个 “令牌”,APP 用令牌从腾讯的资源服务器获取你的信息 — 这一过程中,OAuth 2.0 解决的是 “授权 APP 访问资源”,而非直接验证你的身份(身份验证由腾讯的账号系统完成)。
二、 核心角色
资源所有者(Resource Owner):用户,拥有受保护资源(如个人信息、照片)的访问权限。
客户端(Client):第三方应用(如 APP、网站),需要访问用户的资源。
按是否能安全保存凭据分为:
- 机密客户端(Confidential Client):可安全存储
client_secret
(如后端服务)。 - 公共客户端(Public Client):不能安全存储
client_secret
(如浏览器、移动 App)。
授权服务器(Authorization Server,AS):验证用户身份、处理授权请求、发放访问令牌(Access Token)、刷新令牌(Refresh Token)的服务器(如微信、QQ 的授权服务)。
资源服务器(Resource Server,RS):存储用户(受保护)资源的服务器(如微信的用户信息服务器),需验证令牌有效性后提供资源访问(接受并验证 Access Token。)。
三、核心令牌
Access Token(访问令牌)
- 客户端访问受保护资源时使用。
- Bearer Token:谁持有谁能用,必须通过 TLS 保护。
Refresh Token(刷新令牌)
- 用于换取新的 Access Token。
- 通常只发给机密客户端,或需要长时间会话的场景。
ID Token(身份令牌)
- 不属于原始 OAuth 2.0,而是 OIDC 扩展。
- JWT 格式,描述用户身份。
四、授权模式
1、授权码模式(Authorization Code Grant)
最安全,适用于机密客户端(后端服务器)。
流程:
- 客户端将用户引导至授权服务器登录。
- 用户授权后返回授权码(code)。
- 客户端用授权码向授权服务器换取 Access Token(需要
client_secret
)。
改进版:加 PKCE(见后文)。
2、授权码模式 + PKCE(Proof Key for Code Exchange)
专为公共客户端(浏览器、移动端)设计,防止授权码被拦截。
额外步骤:
- 客户端生成随机
code_verifier
,派生出code_challenge
。 - 授权请求中带
code_challenge
,换 token 时带code_verifier
。 - 授权服务器校验两者匹配。
3、客户端凭据模式(Client Credentials)
无用户参与,服务端到服务端调用(机器身份)。
客户端直接用 client_id
+ client_secret
换 Access Token。
4、设备授权模式(Device Authorization Grant)
针对没有浏览器/键盘的设备(如智能电视)。
用户在另一台设备输入授权码来完成授权。
5、密码模式(Resource Owner Password Credentials, ROPC)
用户直接将账号密码交给客户端。
不安全,不推荐,除非在极受信任的环境中。
7、隐式模式(Implicit Grant)
Access Token 直接返回给浏览器(URL fragment 中)。
高风险(泄露、拦截),已被 OAuth 2.1 弃用。
五、常见漏洞与攻击
授权码拦截攻击
- 解决:使用 PKCE + 客户端认证。
重定向 URI 注入 / Open Redirect
- 解决:redirect_uri 白名单 + 精确匹配。
CSRF(缺失 state 校验)
- 解决:随机 state + 会话中校验。
令牌泄露(存储/传输不安全)
- 解决:短期 token + HttpOnly Cookie + TLS。
JWT 验证错误(alg:none / kid 注入)
- 解决:固定算法 + 从可信 JWKS 获取公钥。
混淆攻击(IdP Mix-Up Attack)
- 解决:多 IdP 场景绑定 issuer 并验证。
六、流程图
6.1 授权码模式 + PKCE 流程
6.2 刷新令牌流程
6.3 使用 Access Token 访问资源
6.4 全生命周期
展示 OAuth 2.0 中Token 从生成到使用再到过期或撤销的整个生命周期。
强调“动态流程”,按时间顺序显示事件和状态变化。
展示从用户授权 → 授权码 → Access Token → 使用资源 → Token 刷新 → Token 过期/撤销的完整流程。
6.5 全景图
用于展示 OAuth 2.0 系统的整体架构、参与角色、主要组件和它们之间的关系。
强调“静态结构”而不是“时间顺序”,关注的是系统边界和安全信号。