告别繁琐密码:OAuth 2.0、SSO 单点登录与 Passkey(FIDO2)无密码技术革命

记密码反人性还易被钓鱼。聊聊"用 Google 登录"背后的 OAuth 2.0 与 OIDC、企业级 SAML 单点登录,以及用非对称加密+生物识别让密码灭绝的 Passkey。

你手机里现在存着多少个密码?银行一个、微信一个、邮箱一个、还有各种小网站各一个……光是"记住且不能重复、还得够复杂"这件事,就已经反人类了。更糟的是,你辛辛苦苦记的复杂密码,遇到个高仿的钓鱼网站,可能一秒就被骗走。这篇文章咱就聊聊:密码这个古老玩意儿,是怎么被 OAuth 2.0、单点登录(SSO)和 Passkey(FIDO2)一步步逼向"灭绝"的。

一、为什么"记复杂密码"这事儿,本身就不科学?

密码的问题,根子上是人性的弱点:

  • 记不住:人脑天生记不住 Xk9$mP2!qL 这种乱码,于是要么写便利贴,要么所有网站用同一个。
  • 爱复用:同一套账密走天下,一家泄漏,全网裸奔。撞库攻击就是靠这个吃饭的。
  • 会被钓鱼:再复杂的密码,遇到一个做得跟真站一模一样的钓鱼页,你照样乖乖输进去。Verizon 多年的数据泄露报告反复指出,被盗凭证始终是最主要的入侵原因
  • 服务器也会漏:网站把你密码哈希后存库,可一旦数据库被拖,弱哈希或加盐不当还是可能解出明文。

说白了,密码是"人和服务器都知道同一个秘密",这秘密一旦在任何一端泄露,就完了。那有没有办法,让"验证你是你"这件事,根本不需要共享秘密?

二、"用 Google 登录"背后,到底发生了什么?

你点"用 Google 登录"时,并没有把 Google 密码告诉那个第三方网站——这正是 OAuth 2.0 的功劳。注意一个常见误区:OAuth 2.0 本身是"授权"协议,不是"认证"协议。它解决的是"让 App 在不知你密码的情况下,代表你访问你的数据"。而"确认你是谁"那一层,是叠在它上面的 OpenID Connect(OIDC)。所以"用 Google 登录" = OIDC + OAuth 一起干活。

整个过程有四个角色:

  • 资源拥有者(Resource Owner):你。
  • 客户端(Client):想访问你数据的那个 App。
  • 授权服务器(Authorization Server):发令牌的,比如 Google 的账号系统。
  • 资源服务器(Resource Server):存数据的 API,比如 Google 通讯录接口。

最常用的"授权码流程"长这样:

  1. App 把你重定向到 Google,附带 client_idredirect_uriscope=email profile 等参数。
  2. 你在 Google 登录并点"允许"。
  3. Google 带着一个一次性授权码(code)重定向回 App。
  4. App 在服务端用这个 code 换令牌(这一步浏览器里看不到令牌,安全)。
  5. Google 返回 Access TokenID Token

这里顺手科普两个关键点:

PKCE:给"没法藏密钥"的 App 兜底

手机 App、网页前端没法安全保管 client_secret(用户能反编译)。于是有了 PKCE:客户端先随机生成一个 code_verifier,算出它的 SHA-256 哈希 code_challenge 发给授权服务器;换令牌时再出示原文,服务器一比对哈希,就能确认"开头和结尾是同一个客户端"。现在所有 OAuth 流程都建议上 PKCE。

把整个流程落到实际请求上,授权跳转大概长这样:

GET https://accounts.google.com/o/oauth2/v2/auth?client_id=xxx&redirect_uri=https://myapp.com/callback&response_type=code&scope=openid%20email%20profile&state=随机值

你的后端拿到那个一次性 code 后,在服务端去换令牌:

POST https://oauth2.googleapis.com/token grant_type=authorization_code&code=xxx&client_id=xxx&code_verifier=最初的随机值

关键点是:这个 code 只能用一次、还有有效期。所以就算坏人中途截获了 URL 里的 code,也换不到令牌——这正是"授权码流程"比老式"把令牌直接塞进回调 URL"安全的地方。而且全程你的 Google 密码一次都没离开过 Google。

三类令牌,别搞混

  • Access Token:短期有效(15 分钟~1 小时),装在请求头里当"门禁卡"去调 API。短命,所以被盗了损失也小。
  • Refresh Token:长期有效(几天到几个月),用来换新 Access Token,得严实保管。
  • ID Token(OIDC):一个 JWT,里面装着你的名字、邮箱等身份信息,专门给 App 用来"确认登录的是谁",不该拿它去调 API

三、企业级单点登录与 SAML:一次登录,到处通行

公司里用的那种"用企业账号登录各种内部系统",背后大多是 SAML 2.0(2005 年就成了标准)。它的角色跟 OAuth 不太一样:

  • IdP(身份提供方):比如 Okta、公司的 ADFS,负责认证你。
  • SP(服务提供商):你想用的应用,比如 Salesforce、Slack。

流程是:你想进 Salesforce(SP),它不自己验密码,而是把你重定向到公司 IdP;IdP 验明正身,发回一个 数字签名的 XML 断言(Assertion),相当于一张"此人可以进"的推荐信;Salesforce 验一下签名就放行。你从头到尾没在 Salesforce 输过密码。

SAML 和 OAuth 常被混为一谈,其实一句话分清:SAML 是"你是谁"(认证),OAuth 是"你能干啥"(授权)。打个比方——SAML 像前台查工牌放你进大楼大门,OAuth 像里面各房间的钥匙卡,决定你能进哪间会议室。SAML 用 XML、又重又适合老牌企业系统;OAuth/OIDC 用 JSON、轻巧,适合现代 App 和手机端。现在不少大厂是俩一起用:SAML 做企业登录,OAuth 拿令牌调 API。

那张"推荐信"到底长啥样?简化一下大概是:

<saml:Assertion><saml:Subject><saml:NameID>alice@corp.com</saml:NameID>...<ds:Signature>...数字签名...</ds:Signature></saml:Assertion>

它是 XML,带着数字签名(ds:Signature)、有效期和受众限制。Salesforce 收到后先验签名真伪,再看"这张断言是发给我的吗、过期没",全过才放行。也正因为靠数字签名防伪、且标准成熟,SAML 特别受金融、政企这类对合规要求高的系统偏爱。

四、终极方案:Passkey(FIDO2)让密码彻底失业

前面这些,不管是 OAuth 还是 SAML,本质上还是"用令牌代替密码",但注册时你账户那头可能还得有个密码兜底。真正要让密码灭绝的,是 Passkey(通行密钥)。它背后是 FIDO2 标准,由 W3C 的 WebAuthn(浏览器接口)和 FIDO 联盟的 CTAP2(浏览器和硬件钥匙的通信协议)组成。2022 年苹果、谷歌、微软一起承诺支持云端同步的 Passkey,等于给普及按下了加速键。

它的核心思想特别优雅——彻底不要共享秘密

注册时

  1. 服务器生成一串随机 挑战值(challenge,至少 16 字节)
  2. 你的设备(手机/电脑)在安全芯片(iPhone 的 Secure Enclave、Windows 的 TPM、或 YubiKey)里生成一对非对称密钥
  3. 私钥永远不出设备,只把公钥发给服务器存着。

登录时

  1. 服务器发来一个一次性挑战。
  2. 你按指纹 / 刷脸 / 输设备 PIN,本地验证通过。
  3. 设备用私钥给挑战签名,把签名发回去。
  4. 服务器用之前存的公钥验签名——对了就证明"你确实握着那把私钥",登录成功。

妙处在哪?

  • 抗钓鱼,写在协议里:每个 Passkey 都和具体域名绑定(RP ID)。就算你被忽悠进了 fake-bank.com,浏览器一看域名不对,根本不会用真站的密钥去签名。钓鱼站拿到个寂寞。
  • 没秘密可偷:服务器只存公钥,公钥本来就该公开,数据库被拖了攻击者也没法反推私钥、没法冒充你。
  • 本地生物验证:每次用私钥前都要指纹/ FaceID 确认,"拿你设备的人就是你本人"。

Passkey 分两种:设备绑定型(只在这台设备,最安全但丢了就麻烦,像 YubiKey)和云端同步型(存 iCloud 钥匙串 / Google 密码管理器,手机建的电脑也能用,方便但要信任云厂商的端到端加密)。现在主流是同步型,体验基本就是"点一下,刷个脸,完事",比输密码快得多。

从开发者视角看,整套流程靠浏览器原生 API 驱动:注册时浏览器调用 navigator.credentials.create(),登录时调用 navigator.credentials.get(),而具体的指纹/人脸弹窗是操作系统(不是网站)画的——这正是抗钓鱼的关键:钓鱼页根本调不动为真实域名生成的那个系统级弹窗。另外,每个凭证里还有一个 counter 计数器,每次登录自动 +1;一旦发现同一个计数被用了两次,就立刻判定密钥可能遭克隆,马上告警。

五、现实建议:密码还能活多久?

别急着把密码全删了。眼下还有不少网站不支持 Passkey,过渡期一般是"Passkey 为主、密码兜底"。如果你是自己搭系统,可以现在就用 SimpleWebAuthn、Auth0、Clerk 这类工具把 Passkey 接上;普通用户的话,去 Google、Apple ID、GitHub、PayPal 这些地方把 Passkey 开了,体验立马上一个台阶。记住:Passkey 解决的是"登录"这一步,CSRF 防护、会话管理、异常日志这些该做的还是得做。

顺便提一句,在 Passkey 全面普及之前,密码管理器(1Password、Bitwarden、iCloud 钥匙串)算是个不错的过渡:它帮你生成并记住每个网站独一无二的强密码,解决了"复用"和"记不住"两件事。但它没解决"钓鱼"和"服务器泄露"——主密码一旦被钓鱼,还是一把全丢。所以密码管理器是"把风险集中、专业管理"的进步,而 Passkey 是连"共享秘密"都不要的终极形态。到 2026 年,欧美和不少亚洲地区的金融、社交、电商平台基本都提供了 Passkey 登录选项,趋势已经很明确了。

总结

密码的衰落是必然的:它反人性、爱复用、易被钓鱼。OAuth 2.0 + OIDC 让我们能"用 Google 登录"而不交出密码;SAML 让企业实现一次登录处处通行;而 Passkey(FIDO2)用非对称加密 + 生物识别 + 域名绑定,从协议层消灭了钓鱼和密码泄露——私钥永远不离开你的设备,服务器只存一把没用的公钥。未来的方向很清楚:那个让你抓耳挠腮想密码的时代,正在走向终点。

延伸阅读

更多相关攻略推荐:【知识库自托管 02】2026 实测:VPS 自托管 Anythin【知识库自托管 03】2026 实测:搬瓦工/RackNerd 上自如何给 VPS 厂商做"信用评估":跑路、超售与售后风险排查手册【知识库自托管 01】2026 企业/个人私有文档 RAG 问答选型人机对决:WAF、验证码与恶意 Bot/爬虫攻防战