Skip to content

参考

基于 RFC 6749 / RFC 9700(BCP 284)/ RFC 7636 / RFC 6750 官方文档编写,对照 RFC 9700 现行 BCP 安全建议

速查

  • 4 种主要 grant:Authorization Code(含 PKCE)/ Client Credentials / Refresh Token / Implicit(已废弃)
  • Authorization Code:response_type=code,code 经 query 回传,推荐 + 强制 PKCE(RFC 9700)
  • Client Credentials:grant_type=client_credentials无 user、无 refresh token
  • Refresh Token:grant_type=refresh_token,public client 必须 rotation 或 sender-constrain
  • PKCE:code_verifier 43–128 unreserved(≥256 位熵);code_challenge_method=S256
  • Bearer Token:Authorization 头 MUST 支持、推荐 > POST body SHOULD NOT > URI query SHOULD NOT
  • 错误码:invalid_request=400、invalid_token=401、insufficient_scope=403
  • redirect_uri:精确字符串匹配 + 绝对 URI + 无 fragment;唯一例外 native app loopback
  • 现行规范:RFC 6749 + RFC 9700(BCP 284);OAuth 2.1 仍为草案
  • 完整说明见 入门 / 核心流程与最佳实践

4 流程对比表

维度Authorization Code+ PKCEClient CredentialsRefresh TokenImplicitPassword
response_typecodecodetoken
grant_typeauthorization_codeauthorization_codeclient_credentialsrefresh_tokenpassword
user 参与否(续期)
签发 refresh token可选可选旋转出新MUST NOT可选
推荐场景有 user 的 web appSPA / Mobile / NativeM2M / 服务间续期已废弃已废弃
现状(RFC 9700)推荐强制推荐推荐§2.1.2 废弃§2.4 MUST NOT
code 回传位置queryqueryfragment

Authorization Endpoint 参数

参数必填作用
response_typeREQUIREDcode(推荐)/ token(已废弃)
client_idREQUIRED客户端标识
redirect_uriREQUIRED(若注册多个)精确字符串匹配
scopeOPTIONAL空格分隔权限
stateRECOMMENDEDCSRF 防护 + 维持状态
code_challengePKCE 流程必填BASE64URL(SHA256(verifier)) 或 plain
code_challenge_methodPKCE 流程必填S256(推荐)/ plain(不推荐)

Token Endpoint 参数

参数必填grant
grant_typeREQUIRED所有
codeauthorization_code 必填authorization_code
redirect_uriauthorization_code 必填(且与 /authorize 一致)authorization_code
code_verifierPKCE 必填authorization_code + PKCE
refresh_tokenrefresh_token 必填refresh_token
scopeOPTIONAL(不得扩大原 scope)refresh_token
client_id + 客户端认证REQUIRED所有

Token 响应字段

字段必填作用
access_tokenREQUIRED访问令牌
token_typeREQUIRED通常 Bearer
expires_inRECOMMENDED秒数
refresh_tokenOPTIONALClient Credentials 不签发
scope实际与请求不一致时 REQUIRED服务端实际签发的 scope

Authorization Endpoint 错误码

错误码HTTP含义
invalid_request400缺参数 / 重复参数 / 格式错 / redirect_uri 缺
unauthorized_client400客户端无权用此 response_type
access_denied400用户或 AS 拒绝
unsupported_response_type400AS 不支持此 response_type
invalid_scope400scope 无效 / 越界
server_error500AS 内部错误(应返回 HTML)
temporarily_unavailable503AS 暂时不可用

Token Endpoint 错误码

错误码HTTP含义
invalid_request400缺参数 / 重复 / 格式错
invalid_client401客户端认证失败(含 WWW-Authenticate
invalid_grant400code 过期 / 已用 / verifier 不匹配 / refresh_token 失效
unauthorized_client400客户端无权用此 grant_type
unsupported_grant_type400AS 不支持此 grant_type
invalid_scope400scope 无效

Bearer Token 错误码(RFC 6750 §3.1)

错误码HTTP触发场景
invalid_request400缺 token / 多个 token 来源 / 格式错
invalid_token401token 过期 / 被吊销 / 格式错 / 签名错
insufficient_scope403token 有效但 scope 不足

RS 必须在 401 / 403 响应中带 WWW-Authenticate: Bearer realm="...", error="...", error_description="...", scope="..."

Bearer Token 三种传递方式

方式形式RFC 6750推荐度
Authorization 头Authorization: Bearer mF_9.B5f-4.1JqM§2.1MUST 支持、推荐
表单 body 参数POST access_token=mF_9.B5f-4.1JqM§2.2SHOULD NOT(不得 GET)
URI query 参数?access_token=mF_9.B5f-4.1JqM§2.3SHOULD NOT(易泄露)

PKCE 参数速查

参数出现位置作用
code_verifier/token 请求客户端生成的随机串:43–128 字符,RFC 3986 unreserved 集,≥256 位熵
code_challenge/authorize 请求BASE64URL(SHA256(ASCII(code_verifier)))(S256)或与 verifier 相同(plain)
code_challenge_method/authorize 请求S256(推荐)/ plain(不推荐)
text
code_verifier 长度: 43 ≤ len ≤ 128
字符集: ALPHA / DIGIT / "-" / "." / "_" / "~"(RFC 3986 unreserved)
熵: ≥ 256 位(推荐 32 字节随机 → base64url 编码得 43 字符)
S256 算法: code_challenge = BASE64URL-ENCODE(SHA256(ASCII(code_verifier)))

降级检测:客户端 MUST NOT 从 S256 降级到 plain;AS MUST 拒绝无 code_challenge 的请求里带 code_verifier

scope ABNF(RFC 6749 §3.3)

text
scope       = scope-token *( SP scope-token )
scope-token = 1*NQCHAR
NQCHAR      = %x21 / %x23-5B / %x5D-7E
  • 空格分隔(不是逗号)
  • 大小写敏感
  • 不可含 "\、控制字符
  • 实际签发与请求不同 MUST 回传 scope
  • 省略时 AS 用默认值或返回 invalid_scope

客户端认证方式

方式RFC推荐度适用
noneRFC 6749SPA/Mobile(必须 PKCEpublic client
client_secret_basicRFC 6749 §2.3.1传统confidential client
client_secret_postRFC 6749 §2.3.1不推荐confidential client
client_secret_jwtRFC 7523中等confidential client
private_key_jwtRFC 7523推荐confidential client(非对称)
mTLS(TLS 客户端证书)RFC 8705推荐confidential client

角色与端点术语

术语全称作用
ROResource Owner能授权访问的实体(用户)
Client代表 RO 访问受保护资源的应用
ASAuthorization Server签发 token
RSResource Server受保护资源所在服务器
UAUser Agent浏览器 / App 内嵌 webview
Authorization EndpointGET /authorize,UA 与 RO 直接交互
Token EndpointPOST /token,Client 与 AS 直接交互
Redirect EndpointClient 接收 callback
Resource EndpointRS 的 API 端点

RFC 索引

RFC标题状态
RFC 6749The OAuth 2.0 Authorization Framework现行(核心)
RFC 9700Best Current Practice for OAuth 2.0 Security(BCP 284)现行(安全基线
RFC 7636PKCE现行
RFC 6750Bearer Token Usage现行(被 9700 更新)
RFC 7662Token Introspection现行
RFC 8252OAuth 2.0 for Native Apps现行 BCP
RFC 8705mTLS Client Authentication现行
RFC 8707Resource Indicators (audience)现行
RFC 9068JWT Access Tokens现行
RFC 9126PAR (Pushed Authorization Requests)现行
RFC 9101JAR (JWT-Secured Authorization Requests)现行
RFC 9396Rich Authorization Requests现行
RFC 9449DPoP现行
RFC 8628Device Flow现行
draft-ietf-oauth-v2-1-15OAuth 2.1草案(2026-03)

关键 RFC 速记

  • RFC 9700(BCP 284,2025-01):当前权威安全基线;废弃 Implicit(§2.1.2)、Password(§2.4);强制 PKCE;推荐 sender-constraining
  • RFC 6749(2012-10):核心框架;4 种 grant、refresh、scope、state、redirect_uri;安全条款已被 9700 更新
  • RFC 7636(2015):PKCE;S256 vs plain;code_verifier 43–128 unreserved
  • RFC 6750(2012-10):Bearer Token;三种传递方式;error 码

版本演进时间线

时间事件
2012-10RFC 6749 / RFC 6750 发布,OAuth 2.0 正式标准化
2015RFC 7636 PKCE 发布
2018RFC 8252 Native Apps BCP
2019RFC 8705 mTLS、RFC 8628 Device Flow
2022RFC 9068 JWT Access Token、RFC 9126 PAR
2023RFC 9396 Rich Authorization Requests、RFC 9449 DPoP
2025-01RFC 9700(BCP 284)发布,废弃 Implicit / Password,强制 PKCE
2026-03OAuth 2.1 draft-15(仍是草案)

与相邻主题的边界

  • OIDC(OpenID Connect):在 OAuth 之上加 id_token/userinfo,是认证协议;nonce / at_hash / iss 属 OIDC 范畴
  • Token Introspection(RFC 7662):RS 反向查询 AS 验证 token,属 RS-AS 协议
  • JWT Access Token(RFC 9068):token 的格式,不限定 token 用法
  • PAR / JAR / RAR(RFC 9126/9101/9396):授权请求的安全增强扩展
  • Device Flow(RFC 8628):受限设备(智能电视 / CLI)的认证流程
  • 客户端库(openid-client / passport-oauth2 / @react-oauth/oidc):协议的具体实现

本主题聚焦 RFC 6749 / 9700 / 7636 / 6750 的核心授权框架与安全基线;OIDC / introspection / JAR / device flow 属相邻主题,仅作为防御机制引用。

官方资源