点一下"用微信登录",为什么要跳出去、又跳回来?一次讲清 OAuth
点"用微信登录",页面唰地跳走,过一秒又跳回来,你已经登上了。多跳这一下,到底图什么?
因为安全的做法是:从头到尾,都不把你的密码交出去。
一、过去:直接把密码给第三方
二十年前,想让一个网站去读你另一处的东西,你就得把密码递给它。方便,代价却大:
- 它会把密码存下来,甚至存成明文;
- 它拿到的是"全套",能做你没答应的事;
- 你哪天反悔,只能改密码——可一改,别处也全得重登。
这正是 RFC 9700 所说的"密码反模式"。
二、现在:跳出去、点个头、带张小票回来
办法换了——密码不给了。你点"用微信登录":
- 先跳到微信那边;
- 在微信里登好,点一下同意;
- 带着一张只能用一次的小票(行话叫授权码)跳回原网站;
- 网站拿小票,去微信换一张"出入牌"(access token)。
全程,网站没碰过你的密码,只见过这张出入牌。
三、这张"牌"能干嘛:范围 + 时效
出入牌上写着三件事:替谁来的、到多久、能干嘛。
- 能干嘛,是你在同意页上勾的那几样:只勾了昵称和头像,它就只看得到这两样;
- 没勾的,牌上没写,门卫就不让(这就是 scope,RFC 6749 §3.3);
- 牌还有到期时间,一到就作废;想提前收回,去"授权管理"里点一下即可。
四、它怎么长成这样:1.0 → 2.0 → 补漏
| 阶段 | 时间 | 关键变化 |
| OAuth 1.0 | 2010(RFC 5849,已废弃) | 第一版,太绕,各家各写各的 |
| OAuth 2.0 | 2012(RFC 6749) | 重写成一版通用的;授权码换一次作废 |
| 补漏 PKCE | 2015(RFC 7636) | 小票万一被半路截走,加一道暗记,验不过就用不了 |
| 安全最佳实践 | 2025(RFC 9700) | 弃用隐式流、强制 PKCE 等 |
五、真正的口子:同意那一步
危险不在密码,在你这一头。2022 年就出过事:有人做了假应用,骗人点"同意",之后一直能读邮件、看日历(微软官方 + Proofpoint 披露)。
所以"跳出去那一下",是留给你一次看清的机会:看清是谁在问、要哪几样,再点头。
六、三个容易想歪的地方
- "用第三方登录" ≠ 这个网站安全——你的密码只给了微信,网站从没拿到;
- OAuth 不是"登录协议"——它管授权;"你是谁"是 OIDC 的事;
- 点了同意 ≠ 万事大吉——随时能在"授权管理"里收回。
七、一句话带走
用第三方登录,网站从头到尾没拿到你的密码;它拿到的,是一张有范围、有时效、你能随时收回的出入牌。
以上实践来自我们构建身份层 Autional 的经验:授权码 + 一次性校验(PKCE)、同意页列明范围且可撤回、"你是谁"交给专门的身份层协议。官网:https://www.autional.com
参考:RFC 6749、RFC 7636、RFC 9700、RFC 5849、OpenID Connect Core 1.0;案例:微软同意钓鱼(2022)。
浙公网安备 33010602011771号