Skip to content

Pkce

什么是Pkce,这里引用CSDN博客的话 https://blog.csdn.net/weixin_43333483/article/details/126256938

PKCE 全称是 Proof Key for Code Exchange(代码交换证明密钥), 在2015年发布, 它是 OAuth 2.0 核心的一个扩展协议, 所以可以和现有的授权模式结合使用,比如 Authorization Code + PKCE, 这也是最佳实践,PKCE 最初是为移动设备应用和本地应用创建的, 主要是为了减少公共客户端的授权码拦截攻击。

PKCE其实主要是通过在授权的过程中增加了code_challengecode_verifier两个元素来对整个流程进行验证,防止code被第三方截取的情况。 实际上它的原理是客户端提供一个自创建的证明给授权服务器, 授权服务器通过它来验证客户端,把访问令牌(access_token) 颁发给真实的客户端而不是伪造的。

授权码+Pkce流程

  1. OAuth2客户端生成 code_verifier,并使用 code_challenge_method (一般指Sha256) 计算 code_challenge

  2. OAuth2客户端发起/oauth2/authorize授权请求,携带 code_challenge 和 code_challenge_method 这两个参数。

  3. OAuth2授权服务器对OAuth2客户端/oauth2/authorize的授权请求进行验证。

  4. OAuth2授权服务器检查 code_challenge 和 code_challenge_method 是否存在。如果存在这两个参数,授权服务器会持久化code_challenge 和 code_challenge_method这两个参数。然后返回授权码

  5. OAuth2客户端收到授权码响应开始调用/oauth2/token请求访问令牌,该请求需要额外附加初始请求中生成的code_verifier参数。

  6. OAuth2授权服务器收到访问令牌请求,用该请求中携带的code_verifier和步骤4持久化的code_challenge_method进行摘要计算生成一个校验串,该校验串必须和步骤4持久化的code_challenge进行匹配校验。

  7. 如果步骤6中的匹配校验成功,则发放访问令牌access_token,否则该请求被拒绝。

可以看到大致的流程和授权码模式中是一致的,就是多了code_verifier 以及 code_challenge

上次更新于: