OAuth 2.0 详解:现代授权的核心协议

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流程

  1. 客户端生成code_verifier(随机字符串)`。
  2. 客户端计算code_challenge=S256(code_verifier)
  3. 授权请求时带上 code_challenge。
  4. 返回authorization_code
  5. 换Token时提交 code_verifier,服务器验证匹配性。
  6. 验证code_challenge匹配性
  7. 返回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. 实际案例:微信登录流程

  1. 用户点击"微信登录"。
  2. 网站重定向到微信OAuth页(带 appid+redirect_uri)。
  3. 用户扫码确认授权。
  4. 微信返回 code 给网站后端。
  5. 后端用 code+secret 换 access_token。
  6. 用 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 已成为互联网授权的基石,理解其原理能帮助你构建更安全的集成方案。

相关推荐
白帽攻防录31 分钟前
SRC 挖洞:WSO2 JWT 算法混淆绕过深度复盘,CVE-2026-5430 不支持的算法怎么变成管理员
网络·算法·安全·网络安全·jwt
正经教主1 小时前
【FDE系列】阶段3:Day 58:Prompt 安全 — 注入、越狱与防护
网络·人工智能·安全·prompt·fde
hasty1 小时前
配置禁止重定向,为何请求仍继续?Axios Fetch 适配器的安全契约
安全
jimmyleeee3 小时前
大模型安全之三十六:大模型数据管理----从投毒防御到偏见治理的完整框架
人工智能·安全
姜鱼问生3 小时前
三层防火墙排查:Nginx 配好了浏览器还打不开
nginx·安全
终端安全笔记3 小时前
恢复出厂设置清不掉什么:GB 46864 把清除分成三个等级
安全
Summer-Bright5 小时前
深度 | 谷歌Gemini 4 Argon单次输出100万Token:长输出是智能体刚需,先给防御者不给攻击者才是新玩法
人工智能·安全·ai
hasty5 小时前
接口鉴权通过,对象却属于别人:LimeSurvey 跨问卷授权缺陷解析
安全·系统安全
lisw057 小时前
AI如何助力网络安全合规性?
人工智能·安全·可信计算技术
格鸰爱童话7 小时前
搭建primihub开源框架并一步步理解
安全·ai