引子:为什么我登录个网站还要跳到别的地方?
想象一下,你在一个新网站上注册时,它说:
👉 “你可以用 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 登录的“绕圈之旅”

整个流程大概分 5 步:
客户端请求授权
第三方网站跳转你到 Google,问你要不要授权。用户同意授权
你点了“允许”。授权服务器发放授权码
Google 给了客户端一个“授权码”(一次性、短期)。客户端换取令牌
网站用这个授权码去 Google 换取一个 访问令牌(Access Token)。使用令牌访问资源
网站拿着令牌,就能去请求你的邮箱地址或头像。
👉 整个过程,密码从来没离开 Google,安全性就大大提高了。
OAuth 的实际用途
1. 第三方登录
例如“使用微信登录”、“Sign in with Google”,让用户无需记住多个密码,应用通过 OAuth 获取有限的用户信息。
2. API 授权
用户可以授权第三方应用访问其在另一平台的数据(如 Google 日历、GitHub 仓库)。
3. 微服务内部认证
企业微服务架构中,通过统一认证服务颁发令牌,实现服务间安全通信。
OAuth 与 OpenID Connect 的关系
- OAuth 专注于授权:解决“应用能不能访问我的数据”的问题。
- OIDC 专注于认证:解决“你是谁”的问题。
- OIDC 在 OAuth 基础上增加了 ID Token(通常是 JWT),用于传递用户身份信息,实现单点登录。
常见误区与最佳实践
令牌安全
- 始终使用 HTTPS 传输令牌。
- 令牌有效期应尽可能短。
- 不要在 URL 参数中传递令牌。
作用域管理
- 遵循最小权限原则。
- 按需请求权限,避免一次性请求过多权限。
刷新令牌机制
- 访问令牌短期有效,刷新令牌长期有效。
- 刷新令牌必须安全存储。
- 支持刷新令牌轮换,降低泄露风险。
5. 常见的几种 OAuth 授权方式
OAuth 有几种“授权模式”,常见的有:
- 授权码模式(Authorization Code Flow):最安全,常见于 Web 应用。
- 隐式模式(Implicit Flow):早期为单页应用准备,现在已不推荐。
- 客户端模式(Client Credentials Flow):适合应用自己和 API 沟通。
- 密码模式(Resource Owner Password Flow):直接用用户名密码,几乎不用了。
6. OAuth 带来的好处
- 用户不用把密码交给第三方。
- 用户可以精确控制权限,比如只给“读取邮箱”,不允许“删除邮件”。
- 用户可以随时在 Google 安全中心撤销某个应用的访问。
- 网站开发者也不用管理复杂的密码存储问题。
7. 总结
OAuth 看起来流程复杂,其实就是一个安全设计:
- 别交出钥匙,只给对方一张 临时门禁卡;
- 用户可控,随时撤销权限;
- 安全性更高,即使门禁卡被偷,也只是部分权限,且很快失效。
下次你在新网站点“用 Google 登录”的时候,就知道为什么它要带你绕一圈了。😉