当前位置: 首页 > 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.dtcms.com/a/311271.html

相关文章:

  • 《机器学习数学基础》补充资料:泰勒定理与余项
  • webpack面试题及详细答案80题(61-80)
  • linux-process-control
  • Linux自主实现shell
  • Maven - 并行安全无重复打包构建原理揭秘
  • 探索 Python 的 `lambda` 函数:简洁的利器与其限制
  • LangGraph认知篇-Command函数
  • 深度学习(鱼书)day09--与学习相关的技巧(前三节)
  • sqli-labs:Less-18关卡详细解析
  • 拉格朗日插值法
  • 防火墙配置实验2(DHCP,用户认证,安全策略)
  • 防火墙相关技术内容
  • 【Python3教程】Python3高级篇之网络编程
  • Conda和pip的使用记录
  • conda : 无法将“conda”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正
  • Apache ShardingSphere 初识使用
  • 【Django】-4- 数据库存储和管理
  • 大模型复杂任务
  • 【MySQL】增删改查操作 —— CRUD
  • 楼市低迷能否通过股市提振
  • ADB 底层原理
  • Android 15 中禁用/启用应用的系统级方法
  • 二叉搜索树(C++实现)
  • LeetCode 刷题【26. 删除有序数组中的重复项、27. 移除元素、28. 找出字符串中第一个匹配项的下标】
  • 10.1通用数据类型
  • 查找文献
  • 类似 Pixso 但更侧重「网页 / 软件界面设计」「前后端可视化开发」的工具
  • 【智能体cooragent】_process_workflow 结构拆解分析
  • 一维dp-序列类型-最长有效括号
  • XGBoost三部曲:XGBoost参数详解