PKCE:OAuth 2.0 授权码模式的安全增强机制
PKCE(Proof Key for Code Exchange)机制详解
PKCE 是 OAuth 2.0 授权码模式的安全扩展,用于防范授权码拦截攻击,尤其适用于原生应用和单页应用这类无法安全存储客户端密钥的场景。以下是其核心原理与流程。
一、PKCE 解决的核心安全问题
在传统 OAuth 2.0 授权码模式中,客户端需用授权码 + 客户端密钥换取访问令牌。但原生应用和 SPA 的客户端密钥易泄露,攻击者可拦截授权码或冒充客户端。PKCE 通过动态生成一次性密钥对(Code Verifier 和 Code Challenge),确保授权码仅能被原始客户端使用。
二、PKCE 的核心概念与流程
1. 核心组件
- Code Verifier:客户端随机生成的长字符串(43-128 字符),仅本地持有;
- Code Challenge:由 Code Verifier 经SHA256哈希 + Base64URL编码生成,用于授权请求;
- Code Challenge Method:可选plain(不推荐)或S256(默认)。
2. 完整工作流程
三、关键步骤解析
- 客户端生成 Code Verifier 和 Code Challenge
# Python示例:生成Code Verifier和Code Challenge
import secrets
import hashlib
import base64
# 生成随机Code Verifier (128字节)
code_verifier = base64.urlsafe_b64encode(secrets.token_bytes(96)).rstrip(b'=')
code_verifier_str = code_verifier.decode('ascii')
# 计算Code Challenge (SHA-256 + Base64URL)
challenge_bytes = hashlib.sha256(code_verifier).digest()
code_challenge = base64.urlsafe_b64encode(challenge_bytes).rstrip(b'=')
code_challenge_str = code_challenge.decode('ascii')
print(f"Code Verifier: {code_verifier_str}")
print(f"Code Challenge: {code_challenge_str}")
- 授权请求参数
客户端向授权服务器发送请求时,需包含:
GET /authorize?
response_type=code
&client_id=your_client_id
&redirect_uri=https%3A%2F%2Fyour-app.com%2Fcallback
&scope=openid%20profile
&state=random_state_string
&code_challenge=generated_challenge
&code_challenge_method=S256 HTTP/1.1
Host: authorization-server.com
- 令牌请求验证
客户端用授权码换取令牌时,需发送 Code Verifier:
POST /token HTTP/1.1
Host: authorization-server.com
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code
&code=received_authorization_code
&redirect_uri=https%3A%2F%2Fyour-app.com%2Fcallback
&client_id=your_client_id
&code_verifier=original_verifier
服务器验证逻辑:
- 计算 SHA256(收到的Code Verifier);
- 将结果与授权请求时存储的Code Challenge对比;
- 若匹配,发放令牌;否则拒绝。
四、PKCE 的安全性优势
- 防止授权码盗用;
- 无需客户端密钥;
- 授权码和 Code Verifier 均一次性使用。
相关文章
- 图文并茂,带你梳理一下 OAuth2.0 概念和授权流程
- 理解OIDC协议和认证机制(ociq协议)
- Spring Boot OAuth 2.0整合详解(springbootspringsecurity oauth)
- 授权码 + PKCE 模式|OIDC & OAuth2.0 认证协议最佳实践系列【03】
- 微服务下统一认证解决方案 Spring Cloud OAuth2 + JWT
- 无惧面试官,带你全面了解OAuth2.0
- 干货:分享一个自己开发的oauth2单点登录项目
- 掏出手机,扫一扫,即刻登录——SpringBoot实现二维码扫码登录
- Oauth2.0详解及安全使用(oauth2.0原理)
- 5分钟彻底搞懂"OAuth2.0"协议