返回 ELI5 知识库首页 🔑 AUTH & ACCESS DELEGATION (RFC 6749)
🔑 OAuth 2.0 · Open Authorization · Temporary Key Delegation

什么是 OAuth 2.0(第三方授权 · 临时门禁卡)?

你想让扫地机器人 App 帮你打扫房间,传统做法是把家门钥匙(账号密码)直接交给外人,他随时能打开你的卧室和保险柜;而 OAuth 2.0 就像“物业大堂给保洁阿姨发一张智能临时门禁卡(Access Token)” —— 只能在周二下午开客厅的门,进不去卧室,过期自动作废,你随时可以一键吊销它!

💀 蛮荒时代:把主账号密码直接给第三方

交出主钥匙,隐私彻底失控

早期第三方软件(如邮件客户端、相册打印)为了同步数据,会直接弹窗让你输入主账号的真实账号与密码。第三方不仅能明文保存你的密码,还能以你的名义修改密码、转账消费!

输入微信/谷歌密码: ****** 🚨 第三方拥有全部最高权限 (无法撤销 💥) ⚠️ 密码泄露、权限无限放大、无法单独停用
  • 权限失控:第三方拥有与你本人 100% 相同的超级管理员权限
  • 一损俱损:只要一家第三方被黑,你的主账号彻底沦陷
VS
🔑 OAuth 2.0 时代:权限委托与临时门卡

用 Google/微信登录,第三方全程不见密码

跳转到微信/谷歌官方收银台进行认证,用户明确勾选“只允许读取公开头像与昵称(Scope)”。官方下发一张有时效、有范围限制的 Access Token 令牌,第三方永远碰不到你的密码!

第三方 App 拿不到密码 官方授权中心 用户点击同意 签发 Access Token 用户数据 只读头像 ✨ 最小权限原则 · 随时在后台一键解绑断开!
  • 密码零泄露:用户只在官方域名下输密码,第三方碰不到
  • 精细控制:支持按需授权只读、限时 2 小时、随时吊销
💡

一句话顿悟:OAuth 2.0 与 登录认证(Authentication)的区别?

- 认证(Authentication - 你是谁): 验证“你是小明本人”(如人脸识别、输密码);
- 授权(Authorization - OAuth 的核心 - 你能干什么): 解决“你能代表小明去开哪几扇门”
OAuth 2.0 本质是一个权限委托协议(Access Delegation),而我们常说的“使用 Google 一键登录”是在 OAuth 2.0 之上叠加了 OIDC(OpenID Connect) 身份层!

拆解 OAuth 2.0 体系的 4 大核心基石

从四大角色到令牌续期,读懂互联网授权第一协议

👥

1. 四大核心角色分工

资源拥有者 (用户)、客户端 (第三方App)、授权服务器 (Google/微信登录中心)、资源服务器 (存储相册/资料的 API)。

🎯

2. Scope (权限范围控制)

支持极细粒度的权限申请(如 read:profilewrite:photos),绝不多给一个多余权限。

🎫

3. Access Token (短期门禁卡)

无状态或加密的字符串(常用 JWT 格式),有效时间通常只有 1~2 小时,即使被中间人截获也会迅速过期。

🔄

4. Refresh Token (长期续期卡)

保存在后端安全服务器上。当短期 Access Token 过期时,在后台静默换取新卡,用户完全无需重新手动扫码登录。

🕹️ 经典授权码模式 (Authorization Code Flow) 演练台

观察你在网页点击“使用微信/Google 登录”时,前后端数据包的完整流转过程:

1. 浏览器重定向 GET /authorize?client_id=123&scope=user
2. 回调携带 Code 等待用户确认...
3. 后端换 Token 等待后端发起...
1️⃣ 步骤 1:跳转到官方认证中心
用户在第三方网站点击“Google 登录”。
页面跳转到 accounts.google.com 官方安全域名。
用户输入密码/生物识别完成认证,并确认权限范围!
✔ 密码输入在 Google 官方安全域进行 · 第三方完全不可见
🛡️ 为什么需要“授权码 Code”多倒一手?

前端浏览器绝不能直接拿 Token

如果授权服务器直接把 Access Token 通过 URL 参数返回给浏览器前端;

Token 极易通过浏览器历史记录、Referer 头或 XSS 漏洞被恶意脚本窃取。用一次性 Code 在后端服务器之间暗中换 Token,才是最高安全防线!

📱 PKCE:移动端与单页应用标配

彻底消灭 Client Secret 泄露风险

手机 App(iOS/Android)或纯前端 SPA 无法安全存储 Client Secret(客户端密钥)。

PKCE(Proof Key for Code Exchange) 通过动态生成一次性随机密码哈希挑战(Code Challenge),彻底杜绝了授权码被恶意 App 拦截伪造!

🔄 一键吊销与解绑管理

随手掐断第三方的访问通道

当你在某款软件停用服务后;

只需打开 Google 账号的“安全性 ➔ 第三方应用与服务”,点击“移除访问权限”,官方授权中心立即作废该 Token,第三方瞬间失去所有权限,再无后顾之忧!