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+secretaccess_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 已成为互联网授权的基石,理解其原理能帮助你构建更安全的集成方案。

相关推荐
骥龙16 小时前
1.2、实战准备:AI安全研究环境搭建与工具链
人工智能·python·安全
AORO202516 小时前
防爆手机与普通的区别:应用场景、功能、未来发展
网络·5g·安全·智能手机·信息与通信
TaasLabs16 小时前
MediSec首批参会名单 | 301医院、西门子、联影、GE、阿斯利康等20多家医疗机构安全人员齐聚!
安全
Wang's Blog16 小时前
Linux小课堂: SELinux安全子系统原理与Apache网站目录访问问题解决方案
linux·安全·apache
007tg1 天前
LINE 账号安全与权重提升实战指南:行为模拟与风控规避策略
安全
数据库安全1 天前
《金融电子化》:构建金融韧性运行安全体系:从灾备管理到主动防御新范式
大数据·安全·金融
会开花的二叉树1 天前
应用层网络协议深度解析:设计、实战与安全
网络·网络协议·安全
红树林071 天前
beef-xss网页无法访问
安全·web安全·xss
wanhengidc1 天前
站群服务器都有什么作用
服务器·安全·智能手机·玩游戏
鲜枣课堂1 天前
重新安全定义,IMS算网融合加速企业专网AI+场景落地
大数据·人工智能·安全