RFC7636-PKCE

前言

PKCE (RFC 7636) 是授权代码流的扩展,用于防止 CSRF 和授权代码注入攻击。

PKCE 不是客户端身份验证的一种形式,PKCE 不能替代客户端密码或其他客户端身份验证。即使客户端使用客户端密码或其他形式的客户端身份验证(如 private_key_jwt),也建议使用 PKCE

注意:由于PKCE不能替代客户端身份验证,因此它不允许将公共客户端视为机密客户端。

PKCE 最初旨在保护移动应用程序中的授权代码流,但其防止授权代码注入的能力使其对每种类型的 OAuth 客户端都很有用,甚至是使用客户端身份验证的 Web 应用程序。

RFC 7636:代码交换证明密钥(PKCE,发音为“pixy”)是关于针对授权代码拦截攻击的对策的规范。

在这里插入图片描述

该规范于 2015 年 9 月发布。它添加了:

  1. code_challenge 参数和 code_challenge_method 使用授权代码流的授权请求的参数。
  2. code_verifier 参数设置为与授权请求对应的令牌请求。

此机制使授权服务器能够拒绝来自没有代码验证程序的恶意应用程序的令牌请求。


PKCE授权请求

Request Parameters

使用 PKCE 的授权请求会发出 parameter,也可以选择 code_challenge_method parameter 发出 code_challenge

Code Challenge Value

代码验证程序本身是使用 字符的随机字符串,最小长度为 43 个字符 [A-Z] / [a-z] / [0-9] / “-” / “.” / “_” / “~” ,最大长度为 128 个字符。
在这里插入图片描述

Code Challenge Method

定义的代码质询方法是 plain 和 S256 。将代码验证器转换为代码质询的相应计算逻辑如下。

Method 方法Logic 逻辑
plaincode_challenge = code_verifier
S256code_challenge = BASE64URL-ENCODE(SHA256(ASCII(code_verifier))); code_challenge = BASE64URL-ENCODE(SHA256(ASCII(code_verifier)))

plain 方法不会更改输入,因此 的值 code_verifier 和结果 code_challenge 值相等。

S256 方法计算输入的 SHA-256 哈希值,然后使用 Base64-URL 对哈希值进行编码。例如,当 的值为 dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk 时,该 code_challenge 值变 code_verifierE9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM

当使用的代码质询方法是 S256 时,客户端应用程序必须通过在授权请求中包含 code_challenge_method=S256 参数来告知它。如果 code_challenge_method 省略参数,则授权服务器将假定 plain 为默认值。


PKCE Authorization Response

生成授权代码后,授权服务器会将其保存到其数据库中,并在授权请求中包含代码质询和代码质询方法。

授权服务器稍后将使用保存的代码质询和代码质询方法来验证来自客户端应用程序的令牌请求。

来自授权终结点的响应对 PKCE 没有什么特殊之处。像往常一样,这是正常的反应。
在这里插入图片描述


PCKE Token Request

从授权服务器接收授权代码后,客户端应用程序会发出令牌请求。除了授权代码之外,令牌请求还必须包含用于计算代码质询的代码验证程序。

用于指定代码验证程序的请求参数的名称为 code_verifier

在这里插入图片描述


PKCE Token Response

Require Code Verifier

支持 PKCE 的授权服务器的令牌终结点检查令牌请求是否包含有效的代码验证程序。
当然,仅当authorization_code grant_type并且令牌请求中包含的授权代码与代码质询相关联时,才会执行此检查。
如果令牌请求不包含有效的代码验证程序,但满足上述条件,则该请求被视为来自恶意应用程序,授权服务器将返回错误响应。

Verify Code Verifier

通过比较两个代码质询来执行验证。
一个是授权请求中包含的内容,并存储在数据库中。另一个是授权服务器使用令牌请求中包含的代码验证程序和存储在数据库中的代码质询方法计算的内容。
如果两个代码质询相等,则令牌请求可被视为来自发出原始授权请求的合法客户端应用程序。否则,必须将令牌请求视为来自恶意应用程序。

Issue Access Token

如果验证了令牌请求,授权服务器将照常颁发访问令牌。

在这里插入图片描述


参考:
参考1
参考2
参考3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/589792.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

03.QT命名规范及快捷键(部分)

一、命名规范 1.类名 大驼峰规则:首字母大写,单词和单词之间首字母大写。 2.变量名 小驼峰规则:首字母小写,单词和单词之间首字母大写。 二、快捷键 1.代码操作相关 注释:ctrl / 运行:ctrl r 编译…

从入门到精通UNet: 让你快速掌握图像分割算法

文章目录 一、UNet 算法简介1.1 什么是 UNet 算法1.2 UNet 的优缺点1.3 UNet 在图像分割领域的应用 二、准备工作2.1 Python 环境配置2.2 相关库的安装 三、数据处理3.1 数据的获取与预处理3.2 数据的可视化与分析 四、网络结构五、训练模型5.1 模型训练流程5.2 模型评估指标5.…

redis 三主六从高可用docker(不固定ip)

redis集群(cluster)笔记 redis 三主三从高可用集群docker swarm redis 三主六从高可用docker(不固定ip) 此博客解决,redis加入集群后,是用于停掉后重启,将nodes.conf中的旧的Ip替换为新的IP,从而达到不会因为IP变化导致集群无法…

【递归、搜索与回溯】综合练习

欢迎来到Cefler的博客😁 🕌博客主页:那个传说中的man的主页 🏠个人专栏:题目解析 🌎推荐文章:题目大解析(3) 目录 👉🏻找出所有子集的异或总和再求…

测试新字符设备驱动代码

一. 简介 上一篇文章编写了新字符设备驱动框架的代码,并编写了 LED灯IO初始化工作,也编写了Led的开与关函数。文章地址如下: 向新字符设备驱动代码框架中添加Led功能函数-CSDN博客 本文对所完成的新字符设备驱动代码进行测试。通过测试程…

使用anaconda创建notebook工程

1.由于每个工程使用的环境都可能不一样,因此一个好的习惯就是不同的工程都创建属于自己的环境,在anaconda中默认的环境是base: //括号中名字,代表当前的环境 (base)dragonmachine: $ conda create --nameexample2.激活环境 // 环…

14.用户管理

目录 1、权限表 1、user表 1.用户列 2.权限列 3.安全列 4.资源控制列 2、db表和host 表 1.用户列 2.权限列 3. tables_priv 表和 columns _priv 表 4.procs_priv 表 2、账户管理 1. 登录和退出MySQL服务器 2、创建普通用户: 1.使用CREATE USER语创建…

基于Java SSM框架实现健康管理系统项目【项目源码】

基于java的SSM框架实现健康管理系统演示 JSP技术 JSP是一种跨平台的网页技术,最终实现网页的动态效果,与ASP技术类似,都是在HTML中混合一些程序的相关代码,运用语言引擎来执行代码,JSP能够实现与管理员的交互&#xf…

[react]脚手架create-react-app/vite与reac项目

[react]脚手架create-react-app/vite与reac项目 环境问题描述create-react-app 脚手架根据脚手架修改项目结构安装脚手架注入配置文件-config文件夹package.json文件变更删除 serviceWorker.js新增reportWebVitals.js文件更新index.js文件 脚手架creat-react-app 缺点 vite 脚手…

基于Springboot实现天天生鲜销售电商平台

SSM毕设分享 基于Springboot实现天天生鲜销售电商平台 1 项目简介 Hi,各位同学好,这里是郑师兄! 今天向大家分享一个毕业设计项目作品【】 师兄根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 …

中文字符占用字节即相关原理(实现中文(中英混合)字符串的反转)

如有不对欢迎指正。 目录 一.ASCLL字符和中文字符 1.使用无符号数表示的原因(对于中文字符): 2.但是并不是所有情况都是用无符号数(以下目前只是猜测,如有问题欢迎指正) : 1. 什么时候使用无符号数表示: 2. 不需要使用的情况: …

Access数据库C#读写验证

1、数据库简介 Access数据库是一个相当古老的文件型数据库,主打一个简单方便,没有复杂的安装过程,没有庞大的后端管理,整个数据库就是一个文件。可以像普通文件一样复制和修改,可以同时读写。 在小型系统中&#xff0c…

Xgboost分类模型的完整示例

往期精彩推荐 数据科学知识库机器学习算法应用场景与评价指标机器学习算法—分类机器学习算法—回归PySpark大数据处理详细教程 定义问题 UCI的蘑菇数据集的主要目的是为了分类任务,特别是区分蘑菇是可食用还是有毒。这个数据集包含了蘑菇的各种特征,如…

系统学习Python——装饰器:函数装饰器-[装饰器状态保持方案:外层作用域和非局部变量]

分类目录:《系统学习Python》总目录 我们在某些情况下可能想要共享全局状态。如果我们真的想要每个函数都有自己的计数器,要么像前面的文章那样使用类,要么使用Python3.X中的闭包函数(工厂函数)和nonlocal语句。由于这…

听GPT 讲Rust源代码--library/alloc

File: rust/library/alloc/benches/slice.rs 在Rust源代码中,rust/library/alloc/benches/slice.rs文件的作用是对&[T]类型(切片类型)进行性能基准测试。该文件包含了对切片类型的一系列操作的基准测试,例如切片迭代、切片排序…

0101包冲突导致安装docker失败-docker-云原生

文章目录 1 前言2 报错3 解决结语 1 前言 最近在学习k8s,前置条件就是要安装指定版本的docker,命令如下 yum install -y docker-ce-20.10.7 docker-ce-cli-20.10.7 containerd.io-1.4.62 报错 file /usr/libexec/docker/cli-plugins/docker-buildx fr…

用 print 太慢了!强烈推荐这款Python Debug工具~

作为程序员,我们都深知调试(Debug)在编程过程中的重要性。 然而,使用传统的"print"语句进行调试可能效率较低,今天,笔者将推荐一款独具一格的Python调试工具——Reloadium。 Reloadium为IDE添加…

sparkstreamnig实时处理入门

1.2 SparkStreaming实时处理入门 1.2.1 工程创建 导入maven依赖 <dependency><groupId>org.apache.spark</groupId><artifactId>spark-streaming_2.12</artifactId><version>3.1.2</version> </dependency> <dependency…

C++初阶——基础知识(内联函数)

目录 1.内联函数 内联函数的示例代码 1.内联函数 是一种 C 中的函数定义方式&#xff0c;它告诉编译器在每个调用点上插入函数体的副本&#xff0c;而不是像普通函数那样在调用时跳转到函数体所在的地址执行。这样可以减少函数调用的开销&#xff0c;提高程序的执行效率。 …

从入门到精通,30天带你学会C++【第十天:猜数游戏】

目录 Everyday English 前言 实战1——猜数游戏 综合指标 游玩方法 代码实现 最终代码 试玩时间 必胜策略 具体演示 结尾 Everyday English All good things come to those who wait. 时间不负有心人 前言 今天是2024年的第一天&#xff0c;新一年&#xff0c;新…