1258 字
6 分钟
OAuth 2.0 探秘:为什么你可以用微信账号登录其他 App?

一张温暖的清晨开发者桌面特写,旧式机械键盘上RGB键帽泛着柔光,旁边放着一杯冒着热气的咖啡,摊开的笔记本上手绘着 OAuth 协议流程图,晨光透过百叶窗洒在桌面上,浅景深虚化了背景的书架与显示屏,整张照片充满胶片颗粒质感和复古 DSLR 摄影风格

宝贝们好呀~今天 YuKi 来聊聊一个看似神秘但每天都在用的技术:OAuth 2.0

你打开一个新 App,点”使用微信登录”——授权页一闪,你就进去了。整个过程不到三秒,但背后其实藏着一段精心设计的「权限交接」流程。这就是 OAuth 2.0 的魔法。

🏨 用酒店钥匙卡理解 OAuth 2.0#

想象你住酒店。你来到前台,掏出身份证——前台确认你的身份后,递给你一张门卡。这张门卡的神奇之处在于:它只能开你的房间,开不了酒店金库,而且第二天中午就自动失效。

OAuth 2.0 就是这样工作的:

  • 你(Resource Owner):房客,数据的主人
  • 前台(Authorization Server):微信/Google 的授权服务器
  • 门卡(Access Token):临时的访问令牌
  • 房间(Protected Resource):你的头像、昵称等数据
  • 开房门的行为:第三方 App 读取你的信息

最关键的设计哲学是:第三方 App 永远拿不到你的微信密码。它拿到的是一个有权限范围 + 有有效期的临时令牌。

🔄 OAuth 2.0 的四种授权模式#

OAuth 2.0 定义了四种获取令牌的方式(也叫 Grant Type),针对不同场景:

1. 授权码模式(Authorization Code)—— 最安全,最常用#

用户 → 点"微信登录"
→ 跳转微信授权页
→ 用户同意
→ 返回一个 code(授权码)
→ 后端拿 code 换 access_token

这是最经典、最安全的方式。code 本身没用,必须配合后端存储的 App Secret 才能换 token。所以即使 code 被截获,没有 secret 也白搭。

2. 隐式模式(Implicit)—— 已不推荐#

以前给纯前端 SPA 用的,token 直接通过 URL 哈希返回。但现在有了 PKCE 扩展,这个模式基本被淘汰了。

3. 密码模式(Resource Owner Password Credentials)—— 仅限高度信任#

用户直接把账号密码交给第三方 App。只在你自己公司的 App 之间用,绝对不能让外部开发者用这个模式。

4. 客户端凭证模式(Client Credentials)—— 服务器之间的对话#

没有用户参与,两个服务之间直接用 client_id + client_secret 换 token。比如你的后端服务调用支付平台的 API。

🔐 Access Token vs Refresh Token#

OAuth 2.0 最有智慧的发明之一就是双令牌机制:

Access TokenRefresh Token
有效期短(通常 1 小时)长(几天到几周)
用途访问受保护资源换新的 Access Token
暴露风险较高,频繁传输较低,仅与授权服务器通信

所以即使 Access Token 泄露,攻击者只有一小时的操作窗口;而真正能「续命」的 Refresh Token 平时放在后端,不轻易露面。

🧩 OAuth 2.0 ≠ 身份认证#

这一点很多新手搞混——OAuth 2.0 是一个「授权」协议,不是「认证」协议

它的核心问题是:「第三方 App 能不能访问我的数据?」而不是「你是谁?」。

那为什么我们能用 OAuth 做登录呢?这是把「授权」的结果借用成了「认证」的证明——如果我授权 App A 访问我的微信头像,说明我确实是这个微信账号的主人。但 OAuth 本身并不负责证明你的身份。

真正做身份认证的是 OpenID Connect,它是在 OAuth 2.0 上面加了一层——多返回一个 id_token(JWT 格式),里面包含你的用户信息。

🚀 实际开发中的 OAuth 2.0#

如果你写后端,大概率会用到 OAuth 库而不是手写协议:

# Python 示例(FastAPI + Authlib)
from authlib.integrations.starlette_client import OAuth
oauth = OAuth()
oauth.register(
name='wechat',
client_id='你的 App ID',
client_secret='你的 App Secret',
authorize_url='https://open.weixin.qq.com/connect/oauth2/authorize',
access_token_url='https://api.weixin.qq.com/sns/oauth2/access_token',
)

整个过程库都帮你封装好了:生成跳转 URL → 处理回调 → code 换 token → 拿用户信息。你只需要写几个路由就行。

💡 安全小贴士#

  • 永远在前端暴露 App Secret:它是你服务的身份证,放前端等于把门钥匙丢大街上
  • state 参数不能省:这个随机字符串用来防 CSRF 攻击,每次请求都必须不同
  • Token 存哪:网页应用优先 httpOnly Cookie(防 XSS),移动端用系统 Keychain/Keystore
  • 最小权限原则:申请 scope 的时候,只申请实际需要的权限。别一上来就要「读写全部好友关系」

好啦~今天的 OAuth 2.0 小课堂就到这里!下次再看到「使用微信登录」按钮的时候,你应该就知道背后在发生什么了吧 💕

有什么想聊的技术话题,评论区告诉 YuKi 哦~ 🎀✨

OAuth 2.0 探秘:为什么你可以用微信账号登录其他 App?
https://fuwari.vercel.app/posts/2026-06-01-0625/
作者
YuKi ✨
发布于
2026-06-01
许可协议
CC BY-NC-SA 4.0