高 进阶
OAuth2认证流程#
一句话答案#
OAuth2 是授权框架(非认证),核心思想是用户授权第三方应用获取资源,而非直接给出密码;四种授权模式中最常用的是授权码模式(Authorization Code),通过 code → access_token 两步交换避免 Token 暴露在前端。
核心要点
四种角色#
| 角色 | 说明 | 举例 |
|---|---|---|
| Resource Owner | 资源所有者(用户) | 你 |
| Client | 第三方应用 | 某网站 |
| Authorization Server | 授权服务器 | 微信开放平台 |
| Resource Server | 资源服务器 | 微信用户信息 API |
授权码模式(最安全最常用)#
┌──────┐ 1. 重定向到授权页 ┌─────────────────┐
│ User │ ──────────────────────────→│ Authorization │
│ │ ←─ 2. 用户授权同意 ────────│ Server (微信) │
└──┬───┘ └───────┬─────────┘
│ │
│ 3. 重定向回 Client(带 code) │ 5. 验证 code → 返回 access_token
↓ ↑
┌──────────┐ 4. code + client_secret │
│ Client │ ──────────────────────────────→│
│ (后端) │ ←── 6. access_token ───────────│
└──────────┘
│
│ 7. 携带 access_token 请求资源
↓
┌────────────────┐
│ Resource Server │ → 返回用户信息
└────────────────┘plaintext为什么需要 code 中转?
- code 通过浏览器 URL 传递(可能被截获)
- 但 code 换 Token 需要 client_secret(后端保存,不暴露)
- 即使 code 被截获,没有 client_secret 也无法换取 Token
四种授权模式#
| 模式 | 安全性 | 适用场景 |
|---|---|---|
| Authorization Code | 高 | Web 后端应用(有服务端) |
| Authorization Code + PKCE | 高 | SPA / 移动端(无法安全存 secret) |
| Client Credentials | 中 | 服务间通信(无用户参与) |
| 低 | 已废弃(Token 暴露在 URL) | |
| 低 | 已不推荐(用户直接给密码) |
Spring Security OAuth2 集成#
# application.yml
spring:
security:
oauth2:
client:
registration:
github:
client-id: xxx
client-secret: xxx
scope: read:user
provider:
github:
authorization-uri: https://github.com/login/oauth/authorize
token-uri: https://github.com/login/oauth/access_token
user-info-uri: https://api.github.com/useryamlToken 管理#
Access Token: 短有效期(1h),用于访问资源
Refresh Token: 长有效期(30d),用于刷新 Access Token
Scope: 限制 Token 能访问的资源范围
Token 撤销:
POST /oauth/revoke {"token": "xxx"}
→ Authorization Server 将 Token 加入黑名单plaintext面试回答(2分钟版)
OAuth2 是授权框架,核心解决”第三方应用如何安全获取用户资源”的问题。最常用的授权码模式分两步:第一步用户在授权服务器(如微信)登录并授权,重定向回应用时带一个 code;第二步应用后端用 code + client_secret 去换取 access_token。这样设计的安全考虑是:code 虽然经过浏览器可能泄露,但没有 client_secret 无法换 Token,而 client_secret 只存在后端不暴露。拿到 access_token 后用它请求资源服务器获取用户信息。SPA 和移动端没有后端存 secret,就用 PKCE 扩展(动态生成 code_verifier 替代 secret)。实际项目中用 Spring Security OAuth2 Client 集成,配置好 registration 和 provider 就自动走完整流程。
追问与易错
追问方向:
- “OAuth2 和 JWT 什么关系?”→ OAuth2 是授权框架,JWT 是 Token 格式;OAuth2 的 access_token 可以是 JWT 也可以是 opaque token
- “为什么授权码模式要两步?”→ 防止 Token 暴露在前端 URL,code 只是一次性中转凭证
- “Client Credentials 什么场景?”→ 服务间调用,无用户参与,用客户端自己的身份获取 Token
- “PKCE 是什么?”→ SPA/移动端无法安全存 secret,用 code_verifier 的 hash 替代
易错点:
- ❌ “OAuth2 是认证协议”——它是授权框架,解决的是”能访问什么资源”而非”你是谁”
- ❌ “Implicit 模式安全”——已废弃,Token 暴露在 URL fragment 中
- ❌ “有了 OAuth2 就不需要 JWT”——OAuth2 定义流程,JWT 是 Token 的一种实现格式