1. 什么是OAuth?
OAuth(Open Authorization)是一种开放授权标准,允许用户在不共享密码的情况下,授权第三方应用访问其存储在另一服务中的数据。
核心思想
- "用Token代替密码" :第三方应用获取访问令牌(Access Token),而非用户的真实密码。
- 限制权限:用户可精细控制授权范围(如仅允许读取邮件,不允许删除)。
举例 :
你用Google账号登录某网站,该网站可以获取你的Gmail联系人,但不需要知道你的Google密码。
2. OAuth 2.0 核心角色
角色 | 说明 | 示例 |
---|---|---|
资源所有者 (Resource Owner) | 拥有数据权限的用户 | 你(用户) |
客户端 (Client) | 请求访问数据的应用 | 某博客网站 |
授权服务器 (Authorization Server) | 颁发Token的服务 | Google登录服务器 |
资源服务器 (Resource Server) | 存储用户数据的API | Google Contacts API |
3. OAuth 2.0 四种授权模式
根据场景不同,OAuth 2.0 定义了4种授权方式:
(1) 授权码模式(Authorization Code)
最安全,适用于有后端的Web应用。
User 客户端(博客网站) 授权服务器(Google) GoogleAPI 1. 点击"用Google登录" 2. 重定向到Google授权页 3. 登录并同意授权 4. 返回授权码(Code) 5. 提交Code 6. 用Code换Token 7. 返回Access Token 8. 用Token访问数据 User 客户端(博客网站) 授权服务器(Google) GoogleAPI
特点:
- 需要
client_secret
(后端存储,避免泄露) - 支持
refresh_token
刷新Token
(2) 隐式模式(Implicit)
已淘汰,适用于纯前端SPA(现代推荐用PKCE替代)。
User SPA应用 授权服务器 1. 点击登录 2. 重定向到授权页 3. 登录授权 4. 直接返回Access Token(URL片段) 5. 提取Token User SPA应用 授权服务器
风险:Token暴露在浏览器历史记录中。
(3) 密码模式(Resource Owner Password Credentials)
高度信任场景使用(如自家App登录自家服务)。
User 客户端App AuthServer 1. 输入用户名/密码 2. 直接发送密码换Token 3. 返回Access Token User 客户端App AuthServer
警告:需绝对信任客户端(如银行官方App)。
(4) 客户端凭证模式(Client Credentials)
机器对机器(M2M)认证,无用户参与。
服务端脚本 AuthServer 1. 用client_id+secret换Token 2. 返回Access Token 服务端脚本 AuthServer
用途:后台服务调用API(如定时同步数据)。
4. OAuth 2.0 安全增强:PKCE
PKCE(Proof Key for Code Exchange) 用于防止授权码被拦截(如移动端/SPA)。
PKCE流程
- 客户端生成code_verifier(随机字符串)`。
- 客户端计算code_challenge=S256(code_verifier)
- 授权请求时带上
code_challenge
。 - 返回authorization_code
- 换Token时提交
code_verifier
,服务器验证匹配性。 - 验证code_challenge匹配性
- 返回access_token
作用 :即使黑客截获 authorization_code
,也无法换取Token。
客户端(SPA/App) 授权服务器 1. 生成code_verifier(随机字符串) 2. 计算code_challenge=S256(code_verifier) 3. 授权请求(+code_challenge) 4. 返回authorization_code 5. 用code+code_verifier换Token 6. 验证code_challenge匹配性 7. 返回access_token 客户端(SPA/App) 授权服务器
5. OAuth 2.0 vs. OAuth 1.0
特性 | OAuth 1.0 | OAuth 2.0 |
---|---|---|
复杂性 | 高(签名计算复杂) | 低(HTTPS+Token即可) |
适用场景 | 仅Web | Web/App/API |
安全性 | 签名防篡改 | 依赖HTTPS+PKCE |
现状 | 已淘汰 | 行业标准 |
6. OAuth 2.0 的Token类型
Token类型 | 用途 | 有效期 |
---|---|---|
Access Token | 访问资源API | 短(1小时) |
Refresh Token | 刷新Access Token | 长(几天) |
ID Token (OIDC) | 用户身份信息(JWT格式) | 可变 |
7. 实际案例:微信登录流程
- 用户点击"微信登录"。
- 网站重定向到微信OAuth页(带
appid
+redirect_uri
)。 - 用户扫码确认授权。
- 微信返回
code
给网站后端。 - 后端用
code
+secret
换access_token
。 - 用
access_token
获取用户OpenID。
8. OAuth 2.0 安全隐患与防护
攻击类型 | 防护措施 |
---|---|
CSRF攻击 | 使用 state 参数 |
Token泄露 | HTTPS+短期Token+PKCE |
授权码截获 | PKCE+限制 redirect_uri |
Refresh Token滥用 | 绑定IP/设备指纹 |
9. 总结
- OAuth 2.0 是授权框架,不是认证协议(认证需结合OpenID Connect)。
- 最安全的模式是授权码+PKCE(Web/App通用)。
- 永远不要在前端存储
client_secret
! - 实际开发推荐库 :
- 后端:
passport-oauth2
(Node.js)、Spring Security OAuth2
(Java) - 前端:
Auth.js
(Next.js)、AppAuth
(移动端)
- 后端:
OAuth 2.0 已成为互联网授权的基石,理解其原理能帮助你构建更安全的集成方案。