当前位置: 首页 > news >正文

【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 流程中,新增了三个关键参数:

  1. Code Verifier (代码验证器)
    • 客户端生成的一个随机、足够长的加密随机字符串。
  2. Code Challenge (代码挑战)
    • Code Verifier进行变换后的值。
    • 计算方法:Code Challenge = BASE64URL-ENCODE(SHA256(Code Verifier))
  3. Code Challenge Method (挑战方法)
    • 通常设为S256(推荐使用 SHA-256 哈希算法)。

3. 标准交互流程 (Protocol Flow)

PKCE 流程主要分为三个阶段:准备授权请求令牌请求

阶段 A:准备

客户端在发起登录前,本地生成一组密钥:

  1. 生成随机字符串code_verifier
  2. code_verifier进行 SHA-256 哈希处理并进行 Base64Url 编码,得到code_challenge

阶段 B:授权请求 (Authorization Request)

客户端将用户引导至授权服务器的/authorize端点,并在 URL 参数中额外携带 PKCE 信息:

  • response_type=code
  • client_id=...
  • redirect_uri=...
  • code_challenge={CHALLENGE_VALUE}
  • code_challenge_method=S256

服务器行为:此时服务器会记录下code_challenge与该次授权请求的关联关系,然后完成用户登录并颁发授权码 (code)。

阶段 C:令牌请求 (Token Request)

客户端拿到code后,向服务器的/token端点发起 POST 请求。如果是公共客户端,此时不需要client_secret,但必须携带原始秘密:

  • grant_type=authorization_code
  • code={RECEIVED_CODE}
  • client_id=...
  • redirect_uri=...
  • code_verifier={ORIGINAL_VERIFIER_SECRET}

服务器校验逻辑

  1. 服务器接收到code_verifier
  2. 根据之前记录的code_challenge_method(如 S256),对这个code_verifier执行哈希计算。
  3. 将计算结果与阶段 B 记录下来的code_challenge进行比对。
  4. 只有匹配成功,服务器才会发放access_tokenid_token

4. 为什么 PKCE 更安全?

在没有 PKCE 的传统流程中,如果攻击者在中途拦截了授权码 (code),由于公共客户端没有secret保护,攻击者可以直接用code换取access_token

有了 PKCE 后:
即使攻击者截获了授权码code,因为他不知道客户端本地产生的原始code_verifier字符串,所以无法通过服务器在/token阶段的哈希校验。由于code_challenge是单向哈希,攻击者也无法反推出原始值。


5. 总结流程表

步骤参与方动作关键参数
1客户端生成随机秘密code_verifier
2客户端计算哈希挑战code_challenge
3客户端 -> 服务器发起授权页跳转code_challenge
4用户 -> 服务器完成登录授权-
5服务器 -> 客户端返回授权码code
6客户端 -> 服务器换取令牌code+code_verifier
7服务器执行哈希比对校验比对verifierchallenge
8服务器 -> 客户端返回令牌access_token,id_token

http://www.jsqmd.com/news/583029/

相关文章:

  • Kali Linux 虚拟机安装与基础配置保姆级图文教程_虚拟机安装kali教程
  • OFA图像描述系统实战:快速搭建图片转文字工具,避免常见权限错误
  • 偏振不敏感 宽带消色差长波红外超构透镜模型 色散补偿设计 FDTD仿真 超表面 复现论文:20...
  • 长生露模式系统开发
  • 成本对比:OpenClaw调用自部署SecGPT-14B与商用API的实测数据
  • 用 AI 做鸿蒙游戏 NPC,是一种什么体验?
  • 20260403 找工作感受 - 枝-致
  • # 发散创新:基于Python与OpenCV的智能交通流量实时监测系统实现 在智慧城市建设浪潮中,**智能交通系统(ITS)*
  • 米哈游2026春招(附内推):刷了200题C++,一面还是被问倒了
  • 原神帧率解锁终极指南:三步轻松突破60FPS限制
  • 基于微信小程序在线考试系统-计算机项目设计学习项目
  • 20260403_153320_通过_Claude_Code_源码,来分析_Anthropi
  • Spring AI 实战系列(十):MCP深度集成 —— 工具暴露与跨服务调用
  • 零基础友好:跟着快马生成的交互式脚本轻松完成openclaw安装入门
  • 3个场景告诉你:为什么跨平台文本编辑器Notepad--值得一试
  • thinkphp8官方文档
  • 强力突破语言障碍:Screen Translator如何重塑跨语言工作流程
  • 提升前端效率:用快马实践vibe coding快速生成沉浸式番茄钟应用
  • 用ColabFold打破蛋白质结构预测壁垒:从学术研究到工业应用的完整指南
  • 微软亚洲研究院团队开发的MSA技术让AI拥有人类级别的终生记忆
  • 通达信缠论可视化插件:5步快速掌握专业K线分析技术
  • 提升开发效率:用快马一键生成自动化twitter x数据采集工具
  • 全球辅助动力装置(APU):稳增6.0%,2032年剑指106.47亿美元
  • 炸了!3月中国AI彻底翻盘:大模型反超美国,国产算力芯片打破垄断
  • PHP 8新特性盘点
  • 2026年制造业6S管理数字化落地:行业标杆机构实践方案盘点
  • 基于S7-200 PLC和组态王的混凝土搅拌站配料
  • 微软老员工称部分“被更新损坏“的电脑实际早已注定失败
  • **发散创新:用Python构建可解释的AI伦理审查系统**在人工智
  • Spring-AI 第 11 章 - 拦截器功能开发详解