在移动客户端或单页应用(SPA)等公开客户端(Public Client)中,Client Secret 极易发生泄露。OAuth 2.1 强制所有授权码模式都必须结合 PKCE(Proof Key for Code Exchange),以抵御授权码拦截攻击。
一、PKCE 代码交换验证逻辑
python
import hashlib
import base64
# 客户端生成 code_verifier 与 code_challenge
code_verifier = "dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk"
code_challenge = base64.urlsafe_b64encode(
hashlib.sha256(code_verifier.encode()).digest()
).decode().rstrip("=")
# 认证服务校验规则
def verify_pkce(received_verifier, stored_challenge):
digest = hashlib.sha256(received_verifier.encode()).digest()
computed_challenge = base64.urlsafe_b64encode(digest).decode().rstrip("=")
return computed_challenge == stored_challenge