【OIDC】PKCE流程

张开发
2026/4/3 20:46:12 15 分钟阅读
【OIDC】PKCE流程
OIDC PKCE (Proof Key for Code Exchange) 标准流程1. 概述 (Overview)PKCE(全称 Proof Key for Code Exchange读作 “pixie”) 是对标准OAuth 2.0 Authorization Code Flow的安全扩展。它最初是为了解决移动应用Native Apps和单页应用SPA这类“公共客户端”Public Clients无法安全存储client_secret的问题而设计的现在已成为所有类型客户端包括 Web 应用推荐的最佳实践。PKCE 的核心思想是客户端在请求授权码时动态生成一个只有自己知道的“秘密”并将其哈希值传给授权服务器在随后换取令牌时再出示原始的“秘密”供服务器校验。2. 核心术语 (Key Terms)在 PKCE 流程中新增了三个关键参数Code Verifier (代码验证器)客户端生成的一个随机、足够长的加密随机字符串。Code Challenge (代码挑战)对Code Verifier进行变换后的值。计算方法Code Challenge BASE64URL-ENCODE(SHA256(Code Verifier))。Code Challenge Method (挑战方法)通常设为S256推荐使用 SHA-256 哈希算法。3. 标准交互流程 (Protocol Flow)PKCE 流程主要分为三个阶段准备、授权请求和令牌请求。阶段 A准备客户端在发起登录前本地生成一组密钥生成随机字符串code_verifier。对code_verifier进行 SHA-256 哈希处理并进行 Base64Url 编码得到code_challenge。阶段 B授权请求 (Authorization Request)客户端将用户引导至授权服务器的/authorize端点并在 URL 参数中额外携带 PKCE 信息response_typecodeclient_id...redirect_uri...code_challenge{CHALLENGE_VALUE}code_challenge_methodS256服务器行为此时服务器会记录下code_challenge与该次授权请求的关联关系然后完成用户登录并颁发授权码 (code)。阶段 C令牌请求 (Token Request)客户端拿到code后向服务器的/token端点发起 POST 请求。如果是公共客户端此时不需要client_secret但必须携带原始秘密grant_typeauthorization_codecode{RECEIVED_CODE}client_id...redirect_uri...code_verifier{ORIGINAL_VERIFIER_SECRET}服务器校验逻辑服务器接收到code_verifier。根据之前记录的code_challenge_method(如 S256)对这个code_verifier执行哈希计算。将计算结果与阶段 B 记录下来的code_challenge进行比对。只有匹配成功服务器才会发放access_token和id_token。4. 为什么 PKCE 更安全在没有 PKCE 的传统流程中如果攻击者在中途拦截了授权码 (code)由于公共客户端没有secret保护攻击者可以直接用code换取access_token。有了 PKCE 后即使攻击者截获了授权码code因为他不知道客户端本地产生的原始code_verifier字符串所以无法通过服务器在/token阶段的哈希校验。由于code_challenge是单向哈希攻击者也无法反推出原始值。5. 总结流程表步骤参与方动作关键参数1客户端生成随机秘密code_verifier2客户端计算哈希挑战code_challenge3客户端 - 服务器发起授权页跳转code_challenge4用户 - 服务器完成登录授权-5服务器 - 客户端返回授权码code6客户端 - 服务器换取令牌codecode_verifier7服务器执行哈希比对校验比对verifier和challenge8服务器 - 客户端返回令牌access_token,id_token

更多文章