个人技术日常分享

OAuth:为什么登录要绕一大圈?

2025/09/04

引子:为什么我登录个网站还要跳到别的地方?

想象一下,你在一个新网站上注册时,它说:
👉 “你可以用 Google 账号 登录哦!”

结果你点开后,页面一转,跳去了 Google:

  • Google 问你:“要不要允许这个网站获取你的邮箱?”
  • 你点了“允许”,然后才被带回到原来的网站。

这个过程,看起来绕来绕去,让人一头雾水。为什么不能直接输入邮箱和密码就好了呢?这就是 OAuth 出场的原因。


1. 问题的根源:密码太危险了

以前的网站常用的做法是:

  • 用户把 账号和密码 直接给第三方网站。
  • 这个网站再用这些信息去访问你的资源。

问题在于:

在互联网发展早期,许多网站或应用为了获取用户在其他平台上的信息,会要求用户直接提供在其他平台的用户名和密码。这种做法存在明显的安全隐患和不便之处:

  • 安全风险: 第三方应用会保存用户密码,增加泄露风险,而且服务提供商也不得不开放密码登录,这本身并不安全。
  • 权限不可控: 一旦提供了密码,第三方应用相当于获得了用户在该平台上的完全访问权,用户无法限制其访问范围和有效期。
  • 撤销不便: 用户若想收回授权,只能修改密码。这会导致所有已授权的第三方应用全部失效,影响正常使用。
  • 牵一发而动全身: 任一第三方应用被攻破,都会导致用户密码泄漏,进而威胁用户在所有平台上的数据安全。

这就是 共享密码的风险

正是为了解决上述问题,OAuth 应运而生。OAuth 提供了一种安全的授权机制,让用户可以给予第三方应用有限的访问权限,而无需透露账号密码。这种机制类似于给第三方应用一把“有限权限的钥匙”而非直接交出主钥匙:第三方只能在授权范围和有效期内行使权限,用户也可随时收回授权。

OAuth 的目标就是:
✅ 不要再把密码交给第三方网站。

2. OAuth 的基本思路:借一把“门禁卡”

门禁

OAuth 的核心思想就像“门禁卡”:

  • 你要进某个写字楼的办公室(= 访问用户的资源)。
  • 但是你不能直接拿楼主的钥匙(= 密码)。
  • 楼主(Google)可以给你一张 临时的门禁卡(= token)。
  • 门禁卡只能开指定的门(= 只允许访问邮箱)。
  • 卡还可以设置 有效期,过期了就无效。

这样,既保证了安全性,也给了用户更细的控制。


3. OAuth 的核心概念与角色

要理解 OAuth 的工作原理,需要认识其中的几个核心角色:

  • 用户(资源所有者,Resource Owner): 拥有受保护资源的终端用户,例如照片、联系人等数据的拥有者。用户通过授权决定第三方应用能否访问其资源。
  • 客户端(第三方应用,Client): 请求访问受保护资源的应用程序。它可以是网站、移动App等。
  • 授权服务器(Authorization Server): 授权服务提供商用于处理认证和授权的服务器。它负责验证用户身份、记录用户授权意愿,并在用户同意后颁发令牌。
  • 资源服务器(Resource Server): 存储用户受保护资源的服务器。资源服务器根据令牌所包含的权限范围向客户端开放相应资源。

4. 一次 OAuth 登录的“绕圈之旅”

OAuth 登录流程

整个流程大概分 5 步:

  1. 客户端请求授权
    第三方网站跳转你到 Google,问你要不要授权。

  2. 用户同意授权
    你点了“允许”。

  3. 授权服务器发放授权码
    Google 给了客户端一个“授权码”(一次性、短期)。

  4. 客户端换取令牌
    网站用这个授权码去 Google 换取一个 访问令牌(Access Token)

  5. 使用令牌访问资源
    网站拿着令牌,就能去请求你的邮箱地址或头像。

👉 整个过程,密码从来没离开 Google,安全性就大大提高了。


OAuth 的实际用途

1. 第三方登录

例如“使用微信登录”、“Sign in with Google”,让用户无需记住多个密码,应用通过 OAuth 获取有限的用户信息。

2. API 授权

用户可以授权第三方应用访问其在另一平台的数据(如 Google 日历、GitHub 仓库)。

3. 微服务内部认证

企业微服务架构中,通过统一认证服务颁发令牌,实现服务间安全通信。


OAuth 与 OpenID Connect 的关系

  • OAuth 专注于授权:解决“应用能不能访问我的数据”的问题。
  • OIDC 专注于认证:解决“你是谁”的问题。
  • OIDC 在 OAuth 基础上增加了 ID Token(通常是 JWT),用于传递用户身份信息,实现单点登录。

常见误区与最佳实践

  1. 令牌安全

    • 始终使用 HTTPS 传输令牌。
    • 令牌有效期应尽可能短。
    • 不要在 URL 参数中传递令牌。
  2. 作用域管理

    • 遵循最小权限原则。
    • 按需请求权限,避免一次性请求过多权限。
  3. 刷新令牌机制

    • 访问令牌短期有效,刷新令牌长期有效。
    • 刷新令牌必须安全存储。
    • 支持刷新令牌轮换,降低泄露风险。

5. 常见的几种 OAuth 授权方式

OAuth 有几种“授权模式”,常见的有:

  • 授权码模式(Authorization Code Flow):最安全,常见于 Web 应用。
  • 隐式模式(Implicit Flow):早期为单页应用准备,现在已不推荐。
  • 客户端模式(Client Credentials Flow):适合应用自己和 API 沟通。
  • 密码模式(Resource Owner Password Flow):直接用用户名密码,几乎不用了。

6. OAuth 带来的好处

  1. 用户不用把密码交给第三方。
  2. 用户可以精确控制权限,比如只给“读取邮箱”,不允许“删除邮件”。
  3. 用户可以随时在 Google 安全中心撤销某个应用的访问。
  4. 网站开发者也不用管理复杂的密码存储问题。

7. 总结

OAuth 看起来流程复杂,其实就是一个安全设计:

  • 别交出钥匙,只给对方一张 临时门禁卡
  • 用户可控,随时撤销权限;
  • 安全性更高,即使门禁卡被偷,也只是部分权限,且很快失效。

下次你在新网站点“用 Google 登录”的时候,就知道为什么它要带你绕一圈了。😉


CATALOG
  1. 1. 引子:为什么我登录个网站还要跳到别的地方?
  2. 2. 1. 问题的根源:密码太危险了
    1. 2.1. OAuth 的目标就是:✅ 不要再把密码交给第三方网站。
  3. 3. 2. OAuth 的基本思路:借一把“门禁卡”
  4. 4. 3. OAuth 的核心概念与角色
  5. 5. 4. 一次 OAuth 登录的“绕圈之旅”
  6. 6. OAuth 的实际用途
    1. 6.1. 1. 第三方登录
    2. 6.2. 2. API 授权
    3. 6.3. 3. 微服务内部认证
  7. 7. OAuth 与 OpenID Connect 的关系
  8. 8. 常见误区与最佳实践
  9. 9. 5. 常见的几种 OAuth 授权方式
  10. 10. 6. OAuth 带来的好处
  11. 11. 7. 总结