客户端用 URL 非保留字符生成长度为 43~128 个字符的 code_verifier,在授权请求中发送 code_challenge = BASE64URL(SHA256(code_verifier)) 和 code_challenge_method=S256,之后把 code_verifier 发送到令牌端点,以证明自己持有它。plain 方法直接把 code_verifier 本身作为挑战值发送,不应使用。
PKCE 最初是为移动应用设计的,因为在移动端其他应用可能截获重定向 URI;它同样能阻止 Web 应用中的授权码注入,因此 RFC 9700 建议所有客户端都使用它,OAuth 2.1 草案则强制要求使用。对于机密客户端,它不能取代客户端身份验证;如果之前发送过挑战值,授权服务器必须拒绝缺少 code_verifier 的令牌请求。