一、概述
在 OAuth 2.0 授权框架中,response_type 是客户端向授权端点(Authorization Endpoint)发起请求时必须携带的参数 ,它决定了授权服务器以何种方式向客户端返回凭证。不同的 response_type 值对应不同的授权流程,安全特性和适用场景也截然不同。
本文将覆盖 OAuth 2.0 核心规范(RFC 6749)以及 OpenID Connect(OIDC)扩展定义的所有 response_type 值。
二、OAuth 2.0 核心定义的 response_type
2.1 response_type=code --- 授权码模式
规范来源: RFC 6749 §4.1
流程概览:
┌──────────┐ ┌───────────────┐
│ Client │──(1) redirect ──────────────▶│ Authorization │
│ (浏览器) │ response_type=code │ Server │
│ │◀──(2) redirect ──────────────│ │
│ │ ?code=abc123&state=xyz │ │
└────┬─────┘ └───────┬───────┘
│ │
│ (3) POST /token │
│ grant_type=authorization_code │
│ code=abc123 │
│ client_secret=*** │
├───────────────────────────────────────────▶│
│ │
│ (4) { access_token, refresh_token } │
│◀───────────────────────────────────────────┤
核心特点:
- 授权服务器返回一个一次性、短生命周期的授权码(通常有效期 1~10 分钟)
- 客户端后端使用该授权码 +
client_secret通过后端通道 (back-channel)换取access_token access_token永远不会出现在浏览器地址栏,大幅降低令牌泄露风险- 支持签发
refresh_token,实现长期会话
安全增强 --- PKCE(RFC 7636):
对于无法安全存储 client_secret 的公开客户端(SPA、移动端),应搭配 PKCE 使用:
# 请求阶段附加参数
code_challenge=BASE64URL(SHA256(code_verifier))
code_challenge_method=S256
# 换取 token 时附加
code_verifier=原始随机字符串
PKCE 确保即使授权码被拦截,攻击者也无法换取 token,因为他不持有 code_verifier。
适用场景: 几乎所有场景。Web 后端应用、SPA(配合 PKCE)、移动应用(配合 PKCE)、CLI 工具。这是 OAuth 2.1 唯一保留的浏览器授权流程。
2.2 response_type=token --- 隐式模式
规范来源: RFC 6749 §4.2
流程概览:
┌──────────┐ ┌───────────────┐
│ Client │──(1) redirect ──────────────▶│ Authorization │
│ (浏览器) │ response_type=token │ Server │
│ │◀──(2) redirect ──────────────│ │
│ │ #access_token=eyJ... │ │
└──────────┘ &token_type=bearer └───────────────┘
&expires_in=3600
核心特点:
- 授权服务器直接 在重定向 URI 的 Fragment(#) 中返回
access_token - 没有中间的授权码交换步骤,流程更短
access_token暴露在浏览器端,存在被浏览器历史、Referer 头、恶意脚本截获的风险- 不签发
refresh_token - token 生命周期到期后必须重新授权
安全风险:
| 风险 | 说明 |
|---|---|
| 令牌泄露 | token 出现在 URL fragment 中,可被浏览器扩展、日志系统捕获 |
| 令牌替换攻击 | 攻击者可将自己获取的合法 token 注入受害者的回调流程 |
| 无法验证来源 | 客户端难以确认 token 确实是为自己签发的 |
现状: OAuth 2.1 草案(draft-ietf-oauth-v2.1)已正式弃用 隐式模式。所有原本使用 response_type=token 的场景应迁移到 response_type=code + PKCE。
三、OpenID Connect 扩展的 response_type
OpenID Connect 1.0 在 OAuth 2.0 的基础上引入了 id_token(身份令牌),并定义了多种组合形式的 response_type。根据返回内容的位置(前端通道 vs 后端通道),OIDC 将授权流程分为三类:
| 分类 | response_type 值 | 特点 |
|---|---|---|
| 授权码流程 | code |
所有 token 通过后端通道获取 |
| 隐式流程 | id_token、id_token token |
所有 token 通过前端通道返回 |
| 混合流程 | code id_token、code token、code id_token token |
部分前端、部分后端 |
3.1 response_type=id_token --- OIDC 隐式(仅身份令牌)
返回内容: 仅 id_token(JWT 格式)
#id_token=eyJhbGciOiJSUzI1NiIs...
核心特点:
- 仅用于身份认证,不获取 API 访问权限
id_token包含用户身份信息(sub、email、name等)- 客户端必须验证 JWT 签名、
iss、aud、exp、nonce等声明 nonce参数必须提供,用于防止重放攻击
适用场景: 仅需要确认用户身份、不需要调用资源 API 的轻量认证场景,如"使用 Google 账号登录"。
3.2 response_type=id_token token --- OIDC 隐式(身份 + 访问令牌)
返回内容: id_token 和 access_token,均通过 Fragment 返回
#id_token=eyJ...&access_token=ya29...&token_type=bearer
核心特点:
- 一次请求同时获得身份信息和 API 访问能力
id_token中包含at_hash(access token hash),客户端可据此验证access_token与id_token的绑定关系- 继承了隐式模式的所有安全风险
适用场景: 纯前端应用需要同时认证用户并调用 API(但更推荐迁移至 code + PKCE)。
3.3 response_type=code id_token --- OIDC 混合模式(推荐的混合形式)
返回内容:
-
前端通道:
code+id_token -
后端通道:用
code换取access_token和refresh_token#code=SplxlOBeZQ...&id_token=eyJ...
核心特点:
- 前端立即 获得
id_token,可以马上知道用户身份,无需等待后端 token 交换 access_token仍然通过后端安全获取id_token中包含c_hash(code hash),客户端可验证code的完整性- 兼顾了用户体验 (快速身份确认)和安全性(token 不走前端)
适用场景: 后端应用需要快速展示用户信息,同时安全获取 API 访问权限。这是最常用的混合模式。
3.4 response_type=code token --- OIDC 混合模式
返回内容:
-
前端通道:
code+access_token -
后端通道:用
code换取完整 token 集#code=SplxlOBeZQ...&access_token=ya29...&token_type=bearer
核心特点:
- 前端立即获得一个
access_token,可以马上开始调用 API - 后端使用
code换取可能权限范围更大或生命周期更长的access_token,以及refresh_token - 前端获得的 token 通常权限受限、生命周期较短
适用场景: 需要前端立即具备 API 调用能力,后端稍后获取持久化 token 的场景。
3.5 response_type=code id_token token --- OIDC 混合模式(全量返回)
返回内容:
-
前端通道:
code+id_token+access_token -
后端通道:用
code换取完整 token 集#code=SplxlOBeZQ...&id_token=eyJ...&access_token=ya29...&token_type=bearer
核心特点:
- 前端同时获得身份信息和 API 访问能力
- 后端获得持久化 token 和
refresh_token id_token同时包含c_hash和at_hash,可以验证code和access_token的完整性- 流程最复杂,攻击面也最大
适用场景: 极少使用。仅在确实需要前端同时具备身份验证和 API 调用能力,且后端也需要长期 token 时才考虑。
3.6 response_type=none --- 无响应模式
规范来源: OAuth 2.0 Multiple Response Types(RFC 扩展)
返回内容: 不返回任何 token 或 code
?state=xyz
核心特点:
- 授权服务器仅执行认证,确认用户身份并建立会话
- 不向客户端传递任何凭证
- 客户端通过后续请求(如 session cookie)与授权服务器交互
适用场景: 在授权服务器上触发用户登录/会话建立,而不需要获取任何 token。常见于跨域单点登录(SSO)的辅助流程。
四、Response Mode:返回方式的控制
与 response_type 配合的还有 response_mode 参数,它控制授权响应通过什么方式传回客户端:
| response_mode | 传输方式 | 默认用于 |
|---|---|---|
query |
URL 查询参数 ?code=xxx |
response_type=code |
fragment |
URL Fragment #token=xxx |
包含 token 或 id_token 的类型 |
form_post |
通过 POST 表单自动提交到 redirect_uri | 可用于任何类型,安全性更好 |
form_post 模式值得关注:它将 token 通过 HTTP POST body 发送,避免了 URL 泄露风险,是隐式/混合模式下的安全改进方案。
五、安全性对比与选型建议
安全性排序(从高到低):
code + PKCE(OAuth 2.1 标准)
▲ access_token 不经过浏览器,有 PKCE 保护
│
code(经典授权码模式)
▲ access_token 不经过浏览器
│
code id_token(混合模式)
▲ access_token 不经过浏览器,id_token 可做即时验证
│
code token / code id_token token
▲ access_token 经过浏览器但有 code 兜底
│
id_token
▲ 仅身份信息,无 access_token 泄露风险
│
id_token token / token
▼ access_token 完全暴露在前端通道
选型决策树
需要访问受保护的 API 吗?
├── 是 → 有后端服务器吗?
│ ├── 是 → response_type=code + PKCE ✅
│ └── 否(纯 SPA)→ response_type=code + PKCE ✅
│ (使用 BFF 模式或公开客户端)
└── 否 → 只需要用户身份?
├── 是 → response_type=code + PKCE ✅
│ (在 token 端点请求 openid scope)
└── 否 → 为什么要用 OAuth?🤔
核心结论:在 2024 年及以后,绝大多数场景应统一使用 response_type=code + PKCE。 隐式模式和混合模式仅在维护遗留系统时需要了解。
六、各 response_type 速查表
| response_type | 前端获得 | 后端获得 | 支持 refresh_token | 安全等级 | 状态 |
|---|---|---|---|---|---|
code |
授权码 | access_token, refresh_token | ✅ | ⭐⭐⭐⭐⭐ | 推荐 |
token |
access_token | --- | ❌ | ⭐⭐ | 已弃用 |
id_token |
id_token | --- | ❌ | ⭐⭐⭐ | OIDC |
id_token token |
id_token, access_token | --- | ❌ | ⭐⭐ | OIDC |
code id_token |
授权码, id_token | access_token, refresh_token | ✅ | ⭐⭐⭐⭐ | OIDC 混合 |
code token |
授权码, access_token | access_token, refresh_token | ✅ | ⭐⭐⭐ | OIDC 混合 |
code id_token token |
授权码, id_token, access_token | access_token, refresh_token | ✅ | ⭐⭐⭐ | OIDC 混合 |
none |
无 | 无 | ❌ | ⭐⭐⭐⭐ | 特殊用途 |
七、参考规范
- RFC 6749 --- The OAuth 2.0 Authorization Framework
- RFC 7636 --- Proof Key for Code Exchange (PKCE)
- RFC 6819 --- OAuth 2.0 Threat Model and Security Considerations
- OpenID Connect Core 1.0 --- §3 Authentication
- OAuth 2.0 Multiple Response Type Encoding Practices
- OAuth 2.1 Draft --- draft-ietf-oauth-v2.1