OAuth 2.0 的 PKCE 解决了什么问题?
从授权码拦截风险理解 code_verifier、code_challenge 与回调校验,区分 PKCE 和客户端身份认证。
参考答案
公共客户端(例如浏览器和移动应用)无法安全保存客户端密钥。PKCE 在授权开始时生成高熵 code_verifier,把它的哈希值作为 code_challenge 发给授权服务器;换取授权码时再提交原始 code_verifier。服务器只有在两者匹配时才发放令牌,从而降低授权码被拦截后被他人兑换的风险。
前端还要使用不可预测的 state 防止请求关联被伪造,并严格校验回调地址、issuer、授权码和令牌的来源。PKCE 不会让浏览器成为可信客户端,也不能替代 HTTPS、正确的令牌存储策略、最小权限和服务端会话控制。
具体授权服务器可能要求 S256、不同的回调方式或额外的同意流程。应按提供方文档实现并锁定配置,不能把“用了 PKCE”当成整套 OAuth 安全已经完成。