当前位置: 首页 > news >正文

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)存储用户数据的APIGoogle Contacts API

3. OAuth 2.0 四种授权模式

根据场景不同,OAuth 2.0 定义了4种授权方式:

(1) 授权码模式(Authorization Code)

最安全,适用于有后端的Web应用。

User客户端(博客网站)授权服务器(Google)GoogleAPI1. 点击"用Google登录"2. 重定向到Google授权页3. 登录并同意授权4. 返回授权码(Code)5. 提交Code6. 用Code换Token7. 返回Access Token8. 用Token访问数据User客户端(博客网站)授权服务器(Google)GoogleAPI

特点

  • 需要 client_secret(后端存储,避免泄露)
  • 支持 refresh_token 刷新Token

(2) 隐式模式(Implicit)

已淘汰,适用于纯前端SPA(现代推荐用PKCE替代)。

UserSPA应用授权服务器1. 点击登录2. 重定向到授权页3. 登录授权4. 直接返回Access Token(URL片段)5. 提取TokenUserSPA应用授权服务器

风险:Token暴露在浏览器历史记录中。


(3) 密码模式(Resource Owner Password Credentials)

高度信任场景使用(如自家App登录自家服务)。

User客户端AppAuthServer1. 输入用户名/密码2. 直接发送密码换Token3. 返回Access TokenUser客户端AppAuthServer

警告:需绝对信任客户端(如银行官方App)。


(4) 客户端凭证模式(Client Credentials)

机器对机器(M2M)认证,无用户参与。

服务端脚本AuthServer1. 用client_id+secret换Token2. 返回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_code5. 用code+code_verifier换Token6. 验证code_challenge匹配性7. 返回access_token客户端(SPA/App)授权服务器

5. OAuth 2.0 vs. OAuth 1.0

特性OAuth 1.0OAuth 2.0
复杂性高(签名计算复杂)低(HTTPS+Token即可)
适用场景仅WebWeb/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 已成为互联网授权的基石,理解其原理能帮助你构建更安全的集成方案。

http://www.lryc.cn/news/608191.html

相关文章:

  • 知识随记-----Qt 实战教程:使用 QNetworkAccessManager 发送 HTTP POST
  • Web前端实现银河粒子流动特效的3种技术方案对比与实践
  • C#中的除法
  • 【Web】CCF智能汽车大赛-CTF遴选赛 wp
  • LVGL代码框架简介
  • 苹果MAC 安卓模拟器
  • 计算机网络:任播和负载均衡的区别
  • 【QT】Qt信号与槽机制详解信号和槽的本质自定义信号和槽带参数的信号和槽
  • 【Python修仙编程】(二) Python3灵源初探(11)
  • linux中pthread_t 的值与top -Hp中线程id值的区别
  • 知识随记-----用 Qt 打造优雅的密码输入框:添加右侧眼睛图标切换显示
  • Autosar Nm-网管报文PNC停发后无法休眠问题排查
  • Antlr4在Windows环境下的配置
  • 涉水救援机器人cad【12张】三维图+设计书明说
  • Vue 服务端渲染 Nuxt 使用详解
  • AI Agent开发学习系列 - LangGraph(6): 有多个节点的Sequential Graph(练习解答)
  • 深入理解C++中的Lazy Evaluation:延迟计算的艺术
  • LangGraph认知篇-Command函数
  • UDP通信中BIND端口号的作用解析,LOCALPORT的关系解析
  • 搜索与图论(最小生成树 二分图)
  • 【Django】-5- ORM的其他用法
  • 企业级单点登录(SSO)技术详解:从原理到安全实践
  • 前端与后端部署大冒险:Java、Go、C++三剑客
  • ARM Cortex-M异常处理高级特性详解
  • 集成电路学习:什么是HAL硬件抽象层
  • 【DL学习笔记】计算图与自动求导
  • 紧急救援!Oracle RAC节点驱逐元凶:私网Packet Reassembles Failed“包重组失败”一招救命
  • linux ssh公钥移除办法
  • MySQL PostgreSQL JDBC URL 配置允许批量操作
  • SM2国密算法的大数运算原理详解