OAuth2 概念 📅 发布时间:2026/7/15 10:52:04 👁️ 浏览次数: 前言你是否有过这样的经历在某个网站或 App 上看到微信登录、Google 登录或GitHub 登录的按钮点击一下扫码确认就成功登录了整个过程快捷方便而且你不需要记住新密码。但你有没有想过为什么用微信登录其他网站时不需要把微信密码告诉那个网站那个网站是怎么知道你是谁的这背后到底发生了什么答案就是OAuth2——一个让第三方应用获得有限访问授权的开放标准协议。今天我们就来彻底搞懂 OAuth2 的工作原理。一、OAuth2 是什么OAuth2Open Authorization 2.0是一个授权协议它的核心思想是让用户授权第三方应用访问其在某个服务上的资源而无需将用户名和密码提供给第三方应用。核心概念想象这样一个场景你想用某个应用管理你的照片这个应用需要访问你的 Google 相册但你不想把 Google 密码告诉这个应用OAuth2 就是为了解决这个问题而诞生的四种角色在 OAuth2 协议中有四个重要的角色资源拥有者就是用户拥有资源的所有权客户端第三方应用想要访问用户的资源授权服务器负责验证用户身份并颁发访问令牌资源服务器托管受保护资源的服务器二、真实的第三方登录流程让我们以用微信登录某网站为例看看完整的过程是怎样的。第一步点击微信登录按钮你在网站上看到这个按钮 ┌─────────────────┐ │ 微信登录 │ └─────────────────┘点击后网站内部会构建一个 URL 并跳转到微信const authUrl https://open.weixin.qq.com/connect/qrconnect? appidwx1234567890 redirect_urihttps%3A%2F%2Fwww.example.com%2Fcallback response_typecode scopesnsapi_login stateabc123#wechat_redirect window.location.href authUrl你的浏览器地址栏变成了微信的授权页面。第二步微信显示授权页面此时你看到的是┌─────────────────────────────┐ │ 微信授权登录 │ │ │ │ [二维码] │ │ 请使用微信扫码 │ │ │ │ 登录后该网站将获得 │ │ ☑ 您的公开信息昵称等 │ │ │ │ [取消] [确认] │ └─────────────────────────────┘第三步扫码并确认授权你用微信扫码点击确认。微信服务器会验证你的身份生成一个临时的授权码重定向回原网站并带上这个授权码浏览器地址栏变成https://www.example.com/callback?codeAUTH_CODE_XYZ123stateabc123第四步网站后台换取用户信息这是最关键的一步网站的后台拿到授权码后会用它向微信服务器换取用户信息const response await fetch(https://api.weixin.qq.com/sns/oauth2/access_token, { method: POST, body: JSON.stringify({ appid: wx1234567890, secret: SECRET_abc123, // 网站的密钥 code: authCode, grant_type: authorization_code }) }) const data await response.json() // 微信返回 // { // access_token: ACCESS_TOKEN_xxx, // openid: o1234567890, // expires_in: 7200 // }然后网站用这个 access_token 获取用户详细信息并在自己的数据库中创建或更新用户最后给你一个自己网站的登录凭证。第五步登录成功你被重定向到网站的首页已经成功登录了。三、为什么 OAuth2 更安全传统方式危险你 → 把微信密码输入到网站 ↓ 网站拿到你的密码 ↓ 网站可以用你的密码登录微信 ↓ 如果网站是假的密码就被盗了OAuth2 方式安全你 → 只在微信输入密码 ↓ 微信验证通过 ↓ 微信告诉网站这个人是我认证过的 ↓ 网站只知道这是某个微信用户 ↓ ✅ 网站永远拿不到你的密码关键安全保障密码隔离你的密码只存储在微信服务器第三方网站永远不会知道有限授权你只授予网站必要的权限如昵称、头像而不是全部信息临时凭证授权码只能用一次有效期很短通常 10 分钟可撤销你可以在微信设置中随时撤销对某个网站的授权四、OAuth2 的四种授权模式除了我们刚才看到的授权码模式最安全、最常用OAuth2 还提供了其他三种模式1. 授权码模式最安全最常用适用于有服务器的 Web 应用用户看不到 access_token2. 简化模式直接在前端获取 token适用于纯前端应用如 SPA安全性较低3. 密码模式用户直接提供用户名和密码不推荐使用仅适用于官方应用4. 客户端模式机器对机器的授权不涉及用户适用于后台服务调用五、Token 的奥秘在 OAuth2 中有两种重要的令牌Access Token访问令牌用于访问受保护资源有效期短通常 1-2 小时每次调用 API 时都需要携带Refresh Token刷新令牌用于获取新的 access_token有效期长数天到数月只能使用一次Token 刷新流程当 access_token 过期时网站可以用 refresh_token 获取新的 token而不需要用户重新授权POST /token { grant_type: refresh_token, refresh_token: tGzv3JOkF0XG5Qx2TlKWIA } // 响应 { access_token: 新的access_token, refresh_token: 新的refresh_token, expires_in: 3600 }六、安全最佳实践1. PKCE 扩展防止授权码被拦截拦截攻击在移动应用和 SPA 中特别重要生成一个随机的 code_verifier用 code_verifier 生成 code_challenge授权时发送 code_challenge换取 token 时验证 code_verifier2. State 参数防止 CSRF 攻击生成随机字符串作为 state授权请求时带上 state回调时验证 state 是否一致3. Token 存储不要将 access_token 存储在 localStorage易受 XSS 攻击推荐使用 httpOnly Cookie 或内存存储七、前端实现示例class OAuth2Client { constructor(config) { this.clientId config.clientId this.redirectUri config.redirectUri this.authUrl config.authUrl this.tokenUrl config.tokenUrl } getAuthorizationUrl() { const params new URLSearchParams({ response_type: code, client_id: this.clientId, redirect_uri: this.redirectUri, scope: read:user, state: this.generateState() }) return ${this.authUrl}/authorize?${params} } async exchangeCodeForToken(code) { const response await fetch(this.tokenUrl, { method: POST, headers: { Content-Type: application/x-www-form-urlencoded, }, body: new URLSearchParams({ grant_type: authorization_code, code: code, client_id: this.clientId, redirect_uri: this.redirectUri }) }) return response.json() } generateState() { return Math.random().toString(36).substring(2) } }八、常见应用场景1. 社交登录使用微信、Google、GitHub 账号登录其他网站2. 第三方应用授权应用访问你的 Google 相册、微信朋友圈等3. API 授权允许第三方服务调用平台的 API4. 企业单点登录企业内部系统统一登录九、总结OAuth2 是一个强大而灵活的授权协议它让第三方应用可以在不暴露用户密码的情况下获得有限的访问权限。核心要点用户密码永远不会泄露给第三方授权是有限的、可撤销的使用临时凭证授权码和短期 token 提高安全性授权码模式是最安全的实现方式下次当你使用微信登录时你就知道背后发生了什么这种设计既方便又安全这就是为什么越来越多的网站支持第三方登录的原因。
铜层测厚:5G通信、新能源汽车等制造的“隐形关卡”? 在当今高端制造领域,5G通信设备、新能源汽车等正引领着技术革命的前沿。这些产业有一个共同的关键需求:对铜层厚度进行精密控制。这个看似微小的环节,实则是影响产品性能、可靠性和成本的核心“隐形关卡”。铜层测厚为何如此关键?… 2026/7/12 19:46:44
计算机毕业设计springboot基于的爱心捐赠系统 基于SpringBoot的公益物资捐赠管理平台 基于SpringBoot的智能化爱心帮扶系统 计算机毕业设计springboot基于的爱心捐赠系统yi9nch2t (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。在数字化浪潮席卷全球的当下,互联网技术正以前所未有的速度重塑… 2026/7/13 1:22:35
计算机毕业设计springboot基于的健康管理系统 基于SpringBoot的个人健康服务平台的设计与实现 基于SpringBoot的智慧医疗健康管理信息系统的设计与实现 计算机毕业设计springboot基于的健康管理系统v206ish5 (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。随着人们生活节奏的加快,慢性病患者数量的增加,以及… 2026/7/16 8:16:44
协程的基本概念及用法 协程的基本概念及用法 协程的基本概念及用法1. 阅读前问题卡:Kotlin 协程 1.1 阅读前先看这几个问题1.2 读完后完成这 3 个任务 1.2.1 任务 1:说明协程与线程的关系1.2.2 任务 2:区分协程创建、切换与挂起1.2.3 任务 3:走读请求示… 2026/7/16 10:00:42
基于STC8H1K高级PWM的正交编码器测速与方向检测实践 1. STC8H1K高级PWM与正交编码器基础 正交编码器在电机控制和位置检测中扮演着关键角色。这种传感器通过输出两路相位差90度的脉冲信号(A相和B相),不仅能测量转速,还能判断旋转方向。STC8H1K系列单片机内置的高级PWM模块࿰… 2026/7/16 10:00:42
Windows数字许可激活工具CMWTAT的技术解析与应用 1. 项目概述:数字许可激活工具的核心价值在Windows系统使用过程中,正版激活始终是绕不开的话题。不同于传统的KMS激活或密钥激活,数字许可(Digital License)是微软近年来推广的正版授权机制,它通过硬件哈希… 2026/7/16 9:58:40
ROS rqt 启动段错误(Segmentation Fault)的深度诊断与修复指南 1. 理解rqt段错误的本质 当你兴冲冲地准备用rqt_graph查看ROS节点关系图,或者在rqt_gui里调试参数时,终端突然跳出"Segmentation fault (core dumped)"的红色错误提示,那种感觉就像开车时突然爆胎。这种错误在ROS开发中并不罕见&am… 2026/7/16 9:58:40
0欧电阻在PCB设计中的关键应用与选型指南 1. 0欧电阻在PCB设计中的独特价值 作为一名在硬件设计领域摸爬滚打多年的女工程师,我见过太多新手面对"0欧电阻"这个元件时露出的困惑表情。第一次在BOM表里看到这个元件时,我也曾暗自嘀咕:"既然电阻值为零,干嘛不… 2026/7/16 9:58:40
2026超实用!专业适配的AI论文写作工具大揭秘与推荐 写期刊论文是不是让你头疼不已? 面对成堆的文献资料,复杂的格式要求,还有一遍又一遍的修改,很多学术人总觉得效率特别低。其实,借助AI论文写作工具,能大大缓解这些困难。这些工具不仅能帮你快速找到相关文… 2026/7/16 9:56:39
A--10 Codex Review与GitHub PR工作流实战指南:从代码审查到安全合并 摘要:本文系统讲解如何利用Codex App的Review功能与GitHub PR工作流,实现从代码修改到安全合并的完整流程。涵盖Review面板深度使用、/review命令实战、GitHub Connector配置、PR描述撰写技巧,以及常见问题排查方法。通过多个实战案例和流程图,帮助开发者建立高效的AI辅助代… 2026/7/16 0:00:26
HAM未来路线图:下一代高可用迁移技术的发展方向与展望 HAM未来路线图:下一代高可用迁移技术的发展方向与展望 【免费下载链接】ham Based on the remote memory access capability and high bandwidth of the UB, deterministic duration virtual machine live migration is achieved, addressing planned downtime issu… 2026/7/16 0:04:27
月球是否是从地球分离出去的?——容度原理解释 月球是否是从地球分离出去的?——容度原理解释一、月球起源的“三大假说”与容度原理的重新审视月球起源的三大假说——捕获说(月球是太阳系中独立的星体,被地球引力捕获)、共生说(月球与地球同时从原始星云中形成&… 2026/7/16 0:06:27
Git reset 与 revert 深度对比:5个关键差异与 3 种典型应用场景 Git Reset 与 Revert 深度对比:5个关键差异与3种典型应用场景在团队协作开发中,代码版本管理如同行走钢丝——一步失误可能导致整个项目陷入混乱。作为Git进阶用户,你是否曾在深夜面对错误的提交束手无策?是否在强制推送后收到同事… 2026/7/13 8:31:55
GitHub 学生包申请避坑:5个常见失败原因与开发者工具调试方案 GitHub 学生包申请技术排障指南:5个高频失败场景与开发者工具实战方案第一次尝试申请GitHub学生包时,我盯着屏幕上那个不断转圈的加载动画整整15分钟,最终只等来了一行冰冷的错误提示。这可能是许多开发者共同的经历——明明按照教程操作&… 2026/7/16 3:47:53
冒烟测试用例设计规范:5%-10%覆盖率下的3类核心场景与执行标准 冒烟测试用例设计的黄金法则:5%-10%覆盖率下的精准筛选策略在快节奏的敏捷开发环境中,冒烟测试作为质量保障的第一道防线,其重要性不言而喻。当测试资源有限而时间紧迫时,如何从海量测试用例中精准筛选出那关键的5%-10%࿰… 2026/7/14 5:09:41