OAuth 2.0 是一个授权框架,用来让客户端在资源拥有者同意后,通过访问令牌访问受保护资源,而不需要拿到用户密码。

核心问题

没有 OAuth 时,第三方应用要访问用户数据,常见坏做法是让用户把主站密码交给第三方。OAuth 把“授权访问资源”拆成受控的 token 流程:用户在授权服务器上同意,客户端拿到有范围、有期限、可撤销的访问令牌。

核心对象

对象作用
Resource Owner资源拥有者,通常是用户
Client想访问资源的应用
Authorization Server认证用户、征得同意并签发 token 的服务
Resource Server持有 API 或资源的服务
Access Token客户端访问资源服务器时携带的凭据
Scope限定访问范围的字符串,例如 repo:read

核心机制

最常见的授权码流程是:

  1. 客户端把用户重定向到授权服务器。
  2. 用户登录并同意授权范围。
  3. 授权服务器把一次性授权码 code 发回客户端。
  4. 客户端在后端用 code 换取 access token。
  5. 客户端调用资源服务器 API,并携带 access token。
  6. 资源服务器验证 token 的签名、有效期、受众和 scope。

授权码不是访问凭据,只是一次性中间票据。它把浏览器前端和后端换 token 分开,降低 token 暴露在 URL、日志或浏览器环境中的风险。

工程用途

  • 第三方应用访问 GitHub、Google、飞书等平台 API。
  • 内部微服务用短期 access token 调用资源服务。
  • CLI 或桌面应用通过授权码加 PKCE 获取用户授权。
  • OIDC 复用 OAuth 流程,在其上增加身份认证语义。

边界与常见坑

  • OAuth 2.0 本身不是登录协议:用户身份语义由 OpenID Connect 补上。
  • scope 不是细粒度业务权限的全部:复杂 RBAC、租户边界和审批状态通常仍在业务系统里。
  • access token 不应进前端日志:泄露后在有效期内可被重放。
  • redirect URI 不能宽松匹配:否则授权码可能被转发到攻击者站点。
  • 客户端类型不同,安全假设不同:浏览器、移动端和 CLI 不能像后端服务一样保密 client secret。

相关术语