PKCE:OAuth 2.0 授权码模式的安全增强机制

PKCE:OAuth 2.0 授权码模式的安全增强机制

解决方案goocz2025-07-09 14:36:132A+A-

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. 完整工作流程


三、关键步骤解析

  1. 客户端生成 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}")
  1. 授权请求参数

客户端向授权服务器发送请求时,需包含:

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
  1. 令牌请求验证

客户端用授权码换取令牌时,需发送 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

服务器验证逻辑:

  1. 计算 SHA256(收到Code Verifier)
  1. 将结果与授权请求时存储Code Challenge对比;
  1. 若匹配,发放令牌;否则拒绝。

四、PKCE 的安全性优势

  • 防止授权码盗用;
  • 无需客户端密钥;
  • 授权码和 Code Verifier 均一次性使用。
点击这里复制本文地址 以上内容由goocz整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!

果子教程网 © All Rights Reserved.  蜀ICP备2024111239号-5