直接回答:PKCE(RFC 7636)为授权码流程增加一个一次性密钥对:客户端发起授权前生成随机 code_verifier,把它的哈希 code_challenge 随授权请求发出;拿到 code 换 token 时再出示 code_verifier,服务器验证其哈希与之前登记的一致才发 token。这样即使授权码被截获,攻击者没有 verifier 也无法换出 token。

展开解析:它主要解决公开客户端(SPA、移动 App)的两个痛点:这类客户端无法安全保存 client_secret;授权码经重定向或自定义 scheme 返回时可能被截获(授权码拦截攻击)。PKCE 把"发起授权"和"兑换 token"绑定到同一次会话,secret 只存在内存、一次一密。参数上 code_challenge_method 必须选 S256plain 形同虚设。注意 PKCE 不替代 client_secret,也不替代 state 防 CSRF 的职责。OAuth 2.1 已把 PKCE 列为授权码客户端的强制要求,隐式模式因 token 暴露在 URL 中而被废弃。

追问方向:statenonce 参数分别防什么?移动端该用哪种方式接收回调 code?refresh token 如何安全存储?

(约 410 字)