OAuth 发展史:从密码到全球标准

你每天都能看到它。你点击“使用 Google 登录”或“使用 GitHub 登录”。你不需要输入密码,即可立即进入网站。

这得益于 OAuth。它是全球的安全标准。但它并非一开始就是这样的,它是为了解决巨大的问题而演进出来的。

密码带来的问题

在早期,你为每个网站都创建一个新密码。这导致了三个大问题:

  • 人们在所有地方都使用相同的密码。如果一个网站泄露,所有账户都会面临风险。
  • 人们会忘记密码。他们花在点击“忘记密码”上的时间比使用网络的时间还要多。
  • 网站能看到你的明文密码。如果网站被黑,你的密码就泄露了。

安全技术的演进

  1. Basic Auth:你每次请求都会发送用户名和密码。如果你没有使用 HTTPS,黑客可以窃取一切。

  2. Session Cookies:你登录一次后会获得一个会话 ID。这更好了一些,但 Cookie 可能会通过 XSS 或 CSRF 等攻击被窃取。此外,一个网站无法利用你的登录信息与其他网站进行通信。

  3. API Keys:你给网站一个特殊的密钥。这更好,因为你不需要发送密码。然而,API 密钥往往权限过大。如果你给一个应用 API 密钥,该应用可能拥有读取你的电子邮件、发送消息和删除你账户的权限。这就像把汽车钥匙交给酒店代客泊车员,但那把钥匙竟然还能打开你的家门。

OAuth 的解决方案:代客泊车钥匙 (Valet Key)

OAuth 改变了游戏规则。你不再提供密码,而是提供一个“令牌 (token)”。把它想象成一把代客泊车钥匙。代客泊车钥匙允许司机停放你的车,但不能让他们打开你的后备箱或进入你的家。

OAuth 在实践中是如何工作的:

  • 你想使用 Canva 并从 Google 获取照片。
  • Canva 向 Google 请求权限。
  • Google 问你:“Canva 可以查看您的照片吗?”
  • 你说:“可以,但仅限查看。不要让他们删除任何内容。”
  • Google 给 Canva 一个特定的令牌。

Canva 永远看不到你的 Google 密码。即使黑客窃取了该令牌,他们也只能在短时间内查看照片。他们无法更改你的密码或转移你的资金。

现代安全:PKCE

移动应用和 Web 应用有一个弱点:它们无法很好地隐藏密钥。为了解决这个问题,我们使用了 PKCE (Proof Key for Code Exchange)。

它的工作原理就像预订系统:

  • 应用创建一个秘密代码(验证器 verifier)。
  • 应用将该代码的哈希版本(挑战值 challenge)发送给 Google。
  • 当应用请求令牌时,它会发送原始的秘密代码。
  • Google 检查该代码是否与挑战值匹配。

如果它们匹配,Google 就知道是同一个应用。如果不匹配,Google 就会拦截请求。这可以防止黑客窃取你的授权码 (authorization code)。

OAuth 的发展路线图

  • 2007 (OAuth 1.0):非常复杂,使用了大量的数学运算。
  • 2012 (OAuth 2.0):更快、更简单。它使用了令牌并要求使用 HTTPS。
  • 2016 (OAuth 2.0 + PKCE):为移动端和现代 Web 应用增加了安全性。
  • 2023 (OAuth 2.1):新的黄金标准。它移除了旧的、不安全的方法。

核心教训: 永远不要把密码交给另一个应用。给它们一个会过期的受限凭证。这样你才能保持控制权。

Source: https://dev.to/gophernment/oauth-elaaaebbprawatisaastr-cchaakrhasphaan-suumaatrthaanolk-16b4