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

相关推荐
黎阳之光7 小时前
视频孪生+空天地水工融合,黎阳之光构建智慧水利监测新范式
大数据·人工智能·物联网·算法·安全
心 一7 小时前
Lonkero Web安全扫描器:从安装到实战的完整指南
安全·web安全
小鹿软件办公7 小时前
微软不再声称 Win11 内置安全防护可替代第三方杀毒软件
安全·microsoft
学习溢出7 小时前
【网络安全】追踪PowerShell命令历史
安全·网络安全
会周易的程序员8 小时前
使用 QClaw 驱动多 Agent 团队对项目进行专业安全审计实战
物联网·安全·iot·aiot·qclaw
codingPower8 小时前
JAVA后端安全进阶:基于HMAC-SHA256+Nonce+Timestamp的API防重放攻击方案
java·开发语言·spring boot·安全
Geometry Fu8 小时前
《物联网安全》第4章 网络攻防实例
网络·物联网·安全·网络攻击·网络攻防
Sombra_Olivia8 小时前
Vulhub 中的 cmsms CVE-2019-9053 & CVE-2021-26120
安全·web安全·网络安全·渗透测试·vulhub
数字护盾(和中)9 小时前
攻击链识别:企业抵御快攻型勒索攻击的关键能力
网络·安全·web安全
云天AI实战派9 小时前
2026 跨境出海全流程实战:独立开发者如何用开源工具搭建落地页、订阅支付、客服工单与多语言 SEO 闭环
人工智能·安全·chatgpt·个人开发·独立开发·跨境出海