OAuth 2.0

OAuth 2.0 是授权框架,允许第三方应用在用户授权下有限访问受保护资源,不暴露用户密码。

#type / concept #status / evergreen #tech / security #resource / http

[!info] related notes

OAuth 2.0

一句话定义

OAuth 2.0 是授权框架,允许第三方应用(Client)在用户(Resource Owner)授权下,有限访问受保护资源(Resource Server),不暴露用户密码

核心角色

角色说明
Resource Owner资源所有者(通常是用户)
Client客户端应用(Web App / 原生 App / SPA)
Authorization Server授权服务器,签发 access_token
Resource Server资源服务器,持有受保护资源,校验 access_token

四种授权模式

1. 授权码模式(Authorization Code)

最推荐,最安全。

用户 → Client: 访问应用
Client → 用户: 重定向到授权服务器(带 client_id, redirect_uri, scope, state)
用户 → 授权服务器: 登录并授权
授权服务器 → 用户: 重定向回 Client(带 code, state)
Client → 授权服务器: 用 code + client_secret 换 token(后端调用)
授权服务器 → Client: 返回 access_token(可选 refresh_token)

特点:

  • code 通过浏览器传递,token 通过后端交换(不暴露给前端)
  • 适合有后端的 Web 应用

2. 授权码 + PKCE(Proof Key for Code Exchange)

授权码模式的增强版,专为 SPA 和原生 App 设计。

Client 生成 code_verifier 和 code_challenge
授权时带上 code_challenge
换 token 时发送 code_verifier
授权服务器校验两者匹配
  • 不需要 client_secret(public client 无法安全存储密钥)
  • 防止授权码拦截攻击
  • 现代 App 和 SPA 的标准做法

3. 客户端凭证模式(Client Credentials)

服务对服务认证,没有用户参与。

Client → 授权服务器: client_id + client_secret
授权服务器 → Client: access_token
  • 适合微服务间调用、后台任务
  • 不产生 id_token,不涉及用户身份

4. 资源所有者密码凭证模式(Resource Owner Password Credentials)

不推荐,用户密码直接交给客户端。

Client → 授权服务器: username + password + client_id
授权服务器 → Client: access_token
  • 仅用于极度信任的第一方客户端迁移场景
  • 新系统不要使用

Token 类型

Token用途有效期
access_token访问受保护资源短(通常 1 小时)
refresh_token续签 access_token长(天/周/月),可撤销

access_token 的格式

  • 不透明 token:授权服务器内部格式,资源服务器需调用 introspection 接口校验
  • JWT:自包含,资源服务器可直接校验签名和声明

安全要点

  • state 参数防 CSRF
  • redirect_uri 必须精确白名单匹配
  • code 短时有效且一次性使用
  • client_secret 绝不能暴露给前端
  • public client(SPA/App)必须用 PKCE
  • access_token 不应存 localStorage(XSS 风险)
  • 使用 HTTPS 传输

与 OIDC 的关系

OAuth 2.0 只解决授权(你能访问什么资源),不解决认证(你是谁)。

oidc(OpenID Connect)在 OAuth 2.0 之上增加了身份层,通过 id_token 提供用户身份信息。

参考

创建于 2026/4/1 更新于 2026/5/27