OAuth 2.0 四种授权模式及安全边界
OAuth 2.0 的核心设计是「权限委派」——用户(资源所有者)通过授权服务器将受限的访问权限委派给客户端,客户端永远不接触用户的长期密码凭证。
授权码模式(Authorization Code Grant with PKCE)——当前唯一推荐用于用户参与的授权流程:
- 客户端将用户浏览器重定向到授权服务器的 authorization_endpoint:
?response_type=code&client_id=xxx&redirect_uri=yyy&scope=openid%20profile&code_challenge=zzz&code_challenge_method=S256 - 用户在授权服务器上认证并同意授权范围(如「该应用将访问您的公开个人资料」)。
- 授权服务器将用户浏览器重定向回客户端的 redirect_uri,并在查询参数中附带一次性授权码(code)——授权码有效期通常仅 30 秒至数分钟。
- 客户端(服务器端)凭授权码 + 客户端密钥(client_secret) + code_verifier 向令牌端点换取 Access Token(有效期通常数分钟至数小时)+ Refresh Token(有效期数天至数月)。
- 客户端使用 Access Token(Bearer Token)调用资源服务器 API。
PKCE 的必要性:即使第 4 步的 TLS 加密保护了「授权码→令牌」交换,步骤 3 的 redirect_uri 回调是一个 URL 参数,可能被设备上的其他应用截获(移动端通过注册相同 custom scheme 拦截,Web 端通过 Referer header 泄露)。PKCE 在第 1 步发送 SHA-256(code_verifier),第 4 步必须附上原始 code_verifier,授权服务器验证两者匹配——截获授权码但不持有 code_verifier 的攻击者无法换取令牌。OAuth 安全最佳实践(OAuth 2.0 Security Best Current Practice, RFC 9700, 2025)强制所有客户端(包括有客户端密钥的机密客户端)使用 PKCE。