JWT 计算签名 SHA256withRSA

2024-03-17

我试图

使用 SHA256withRSA 对输入的 UTF-8 表示形式进行签名(也可以 称为带有 SHA-256 哈希函数的 RSASSA-PKCS1-V1_5-SIGN) 从API控制台获取的私钥。输出将是 字节数组。

所以让我们将 Header 和 Claim 设置并将它们放入数组中

{"alg":"RS256","typ":"JWT"}.
{
  "iss":"761326798069-r5mljlln1rd4lrbhg75efgigp36m78j5@developer.gserviceaccount.com",
  "scope":"https://www.googleapis.com/auth/prediction",
  "aud":"https://accounts.google.com/o/oauth2/token",
  "exp":1328554385,
  "iat":1328550785
}

就像服务帐户:计算签名 https://developers.google.com/accounts/docs/OAuth2ServiceAccount#computingsignature

JSON Web 签名 (JWS) 是指导 为 JWT 生成签名的机制。签名的输入是字节数组包含以下内容:

{Base64url 编码标题}.{Base64url 编码声明集}

所以我构建数组只是为了测试它

  $seg0 = array(
    "alg" => "RS256",
    "typ" => "JWT"
  );
  $seg1 = array(
    "iss" => "761326798069-r5mljlln1rd4lrbhg75efgigp36m78j5@developer.gserviceaccount.com",
    "scope" => "https://www.googleapis.com/auth/prediction",
    "aud" => "https://accounts.google.com/o/oauth2/token",
    "exp" => 1328554385,
    "iat" => 1328550785
  );

  $segs = array(
    json_encode($seg0),
    stripslashes(json_encode($seg1))
  );
  $segments = array(
    rtrim(strtr(base64_encode($segs[0]), '+/', '-_'), '='),
    rtrim(strtr(base64_encode($segs[1]), '+/', '-_'), '='),
  );

这里是。前 2 个数组编码成功。

Output
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9
eyJpc3MiOiI3NjEzMjY3OTgwNjktcjVtbGpsbG4xcmQ0bHJiaGc3NWVmZ2lncDM2bTc4ajVAZGV2ZWxvcGVyLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzY29wZSI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvcHJlZGljdGlvbiIsImF1ZCI6Imh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9vL29hdXRoMi90b2tlbiIsImV4cCI6MTMyODU1NDM4NSwiaWF0IjoxMzI4NTUwNzg1fQ

我继续对签名进行编码

签名必须经过 Base64url 编码。那么签名就是 用“.”字符连接到 Base64url 的末尾 输入字符串的表示。结果就是 JWT。它应该 如下:
{Base64url 编码标题}.{Base64url 编码声明集}.{Base64url 编码签名}

  $signature = makeSignedJwt($segments);
  //$signature = makeSignedJwt($segs);
  echo $signature .'<br /><br />';
  $segments[] = rtrim(strtr(base64_encode($signature), '+/', '-_'), '=');
  echo '<pre>'; print_r($segments); echo '</pre>';  

function makeSignedJwt($segments)
{
    $data = implode('.', $segments);
    if (!openssl_sign($data, $signature, privateKey, "sha256"))
    {
        exit("Unable to sign data");
    }
    return $signature;
}

Output
    Array
(
    [0] => eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9
    [1] => eyJpc3MiOiI3NjEzMjY3OTgwNjktcjVtbGpsbG4xcmQ0bHJiaGc3NWVmZ2lncDM2bTc4ajVAZGV2ZWxvcGVyLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzY29wZSI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvcHJlZGljdGlvbiIsImF1ZCI6Imh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9vL29hdXRoMi90b2tlbiIsImV4cCI6MTMyODU1NDM4NSwiaWF0IjoxMzI4NTUwNzg1fQ
    [2] => xFS6iZdJku5RKJ5_XdH3W5A8e9V3wsaFeQhAXoJtuxzW-xvqZq1CdEJJAo60VvK1UFONElVf_pthezEyz-eyWsoRGVZFibUQBaKXLI8eR28eFlaCAKH7bKh820uR7IwuRx4xr8MPmnC8so9u9TEY153gkU6Mz9e--pQPlcLlGY
)

一定是缺少了什么。。


我不确定你的问题是什么,但以下内容对我有用:

//helper function
function base64url_encode($data) { 
    return rtrim(strtr(base64_encode($data), '+/', '-_'), '='); 
}

//Google's Documentation of Creating a JWT: https://developers.google.com/identity/protocols/OAuth2ServiceAccount#authorizingrequests

//{Base64url encoded JSON header}
$jwtHeader = base64url_encode(json_encode(array(
    "alg" => "RS256",
    "typ" => "JWT"
)));
//{Base64url encoded JSON claim set}
$now = time();
$jwtClaim = base64url_encode(json_encode(array(
    "iss" => "761326798069-r5mljlln1rd4lrbhg75efgigp36m78j5@developer.gserviceaccount.com",
    "scope" => "https://www.googleapis.com/auth/prediction",
    "aud" => "https://www.googleapis.com/oauth2/v4/token",
    "exp" => $now + 3600,
    "iat" => $now
)));
//The base string for the signature: {Base64url encoded JSON header}.{Base64url encoded JSON claim set}
openssl_sign(
    $jwtHeader.".".$jwtClaim,
    $jwtSig,
    $your_private_key_from_google_api_console,
    "sha256WithRSAEncryption"
);
$jwtSig = base64url_encode($jwtSig);

//{Base64url encoded JSON header}.{Base64url encoded JSON claim set}.{Base64url encoded signature}
$jwtAssertion = $jwtHeader.".".$jwtClaim.".".$jwtSig;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JWT 计算签名 SHA256withRSA 的相关文章

  • 管理产品页面自定义字段显示在购物车和结账中

    我在产品页面的常规设置选项卡上的 WooCommerce 管理中创建了一个自定义字段 以插入几天的制造时间 我想在购物车和结帐页面上每个产品名称上方显示此自定义字段值 这是我的代码 Insert a Custom Admin Field f
  • PHP使用c++扩展会更快吗?

    我现在正在构建一个推荐系统 一个网站 我想使用PHP作为脚本语言 推荐系统可能会进行复杂的矩阵计算或其他操作 考虑到性能 我想用C 来做矩阵计算或者其他复杂的计算 所以我需要PHP调用C 函数 获取结果并进行其他处理 我知道我可以使用 PH
  • Yii:使用多重上传文件扩展时如何管理视频

    我是yiibie 正在努力上传视频 我已经用过uploadmultifile扩展并根据此链接进行了更改http www yiiframework com extension uploadmultifiles in my video view
  • 在php中设置数据库中的会话

    如何使用 php 和 mysql 在数据库表中使用会话 您需要创建一个像这样的对象 class SessionHandler private static lifetime 0 private function construct obje
  • 如何仅在 PHP 中使用 str_replace() 删除文本一定次数?

    我试图从字符串中删除单词 John 一定次数 我在 php 手册上读到 str replace 除了第四个参数 count 所以我想可以用来指定应该删除多少个搜索实例 但事实似乎并非如此 因为以下情况 string Hello John h
  • 如何通过 md5 比较图像?

    该方法是否比较图像的像素值 我猜它不会起作用 因为它们的尺寸彼此不同 但如果它们相同但格式不同怎么办 例如 我截图并保存为 jpg另一个并保存为 gif MD5哈希是实际的二进制数据 因此不同的格式将具有完全不同的二进制数据 因此 要使 M
  • 通过 exec() 的 Crontab 不适用于 PHP 7.4 / Deb 10

    调试有点困难 因为我正在使用新版本的 PHP 和新服务器上的新操作系统 我有一个 PHP 的 cron 管理系统 它也允许我添加 删除或启用 禁用 cronjobs 在另一台当前使用 PHP 7 2 的 Deb 8 服务器上 它可以使用以下
  • 为数据库生成随机 ID

    我对一个项目有一个要求 我需要生成唯一的 ID ID 必须大写 我无法检查数据库以查看 ID 是否已被使用过 我们预计每个月都会有数百万条记录添加到数据库中 我在这里尝试过解决方案 PHP 如何生成随机的 唯一的字母数字字符串 https
  • 在 WordPress 中挂钩 AJAX

    我一直在深入研究 Javascript 和 AJAX 的世界 我非常接近 但由于某种原因 我认为我没有正确地连接到 wordpress ajax 函数 我已经仔细阅读了文档和这个 认为 99 都在那里 这个应用程序的作用是有一个项目列表 每
  • Doctrine2 与条件的关联映射

    是否可以与教义 2 4 中的条件进行关联映射 我有实体文章和评论 评论需要管理员批准 评论的批准状态存储在布尔字段 approved 中 现在我有 OneToMany 关联映射到实体文章中的评论 它映射了所有评论 但我只想映射批准的评论 就
  • 在路线中使用中间件的车队购物车,但我在项目中找不到任何 $routemiddleware...甚至在 kernel.php 中也找不到...我在哪里可以找到它?

    在路线中使用中间件的车队购物车 但我在项目中找不到任何 routemiddleware 甚至在 kernel php 中也找不到 我在哪里可以找到它 Laravel 版本 5 7 护照版本 7 5 CMS 舰队购物车 内核 php name
  • 传递表单变量的安全方式

    我正在为我的 WordPress 主题构建联系表单 我希望能够从后端输入接收者地址 目前我正在传递带有隐藏输入字段的变量
  • 使用 php 将 swf 转为 pdf

    有没有办法使用 php 将 SWF 转换为 pdf 我的意思是该页面有一个按钮 单击它必须将 swf 内容导出为 pdf 格式 您可以尝试的一种方法是使用ffmpeg http www ffmpeg org 使用 image2 输出编解码器
  • 不要回显 cURL

    当我使用这段代码时 ch curl init url statuses curl exec ch curl close ch 我得到了我想要的东西 但如果我只是使用它 statuses被回显到页面上 我怎样才能阻止这个 将其放在第 2 行
  • 为简单应用程序生成 PHAR

    我正在尝试使用 Symfony2 控制台库构建 CLI 工具 我已经有了一些基本的工作 现在我想将其打包为一个 Phar 我读过一些示例 但我看到的示例非常简单 3 个文件 没有命名空间等 In my src 目录我有以下内容 Above
  • 根据用户的时间设置问候语(早上好,下午好......)

    任何人都可以推断如何根据用户的时间设置实现基本的 晚上好 或 早上好 也许 PHP 会获取服务器时间 但我希望用基于时间的适当问候语来问候网站访问者 并考虑到他们一天中的时间 E G 早上好 晚上好 下午好 基于它 getHours 日期对
  • PHP:如何使用 nl2br() 和 HTML Purifier 保持换行?

    Issue 使用时HTML 净化器 http htmlpurifier org 为了处理用户输入的内容 换行符不会被转换为 br tags 考虑以下用户输入的内容 Lorem ipsum dolor sit amet This is ano
  • 使用 PHP MySql 进行关键字搜索?

    我的 mysql 表中有标题 varchar 描述 text 关键字 varchar 字段 我保留了关键字字段 因为我认为我只会在这个字段中搜索 但我现在需要在所有三个字段中进行搜索 所以对于关键字 word1 word2 word3 我的
  • APC 将数据存储在哪里?

    我想用apc store 缓存一些结果 但我需要知道数据将存储在哪里 以及限制是什么 它总是存储在内存中吗 或者也写入磁盘 我希望将不经常访问的数据存储在磁盘上 我应该为此使用不同的缓存系统吗 这就是极限了吗 apc shm size 32
  • cUrl 在本地主机上工作正常,但在服务器上不起作用,仅显示空白页面

    当我在服务器上运行以下代码时 它只显示空白页面并突然停止进一步执行 我还检查了已安装的服务器上的 cUrl 这是我的代码 ftp server ftps server Voorraadtonen link csv ch curl init

随机推荐

  • 转换文件:Android 中的 Uri 到文件

    转换的最简单方法是什么android net Uri https developer android com reference android net Uri持有一个对象file 键入一个java io File https develo
  • “在源 Y 中找不到事件 ID X 的描述。”

    我正在尝试将自定义事件从我的 Web 应用程序写入 Windows 事件日志 我没有运气让消息字符串正常工作 我不断收到 无法找到源 Y 中事件 ID X 的描述 为了缩小范围 我决定将一个事件写入我的机器上已存在的源 我只是查看了已经写出
  • Nginx 配置中静态位置的多个位置

    我的应用程序将在两个位置提供静态文件 一个是 my path project static 另一个是 my path project jsutils static 我很难让网络服务器在两个目录中查找静态内容 这是我的应用程序的 nginx
  • UICollectionView 动画(插入/删除项目)

    我想在插入和 或删除 UICollectionViewCell 时自定义动画样式 我需要这个的原因是 默认情况下 我看到插入单元格的动画具有平滑的淡入淡出效果 但是删除单元格具有向左移动 淡出动画的组合 如果不是因为一个问题 我会对此感到非
  • 使用具有多个比较器的比较器

    我可以使用此代码中的所有简单比较器进行排序 但不能ComplexComparator 我不知道如何编码才能使其正常工作 任何建议 解释将不胜感激 这是我的主要程序 package pkgTest import java util Array
  • 如何使用 Elasticsearch 编写条件查询?

    我有一个简单的 Elasticsearch JSON 查询 如下所示 query bool must match id 1 must match tags name a1 仅当值 本例中为 a1 不为空时 如何执行第二个 必须 条件 您可以
  • IBM Blockchain Marble 演示中的交易存储在哪里?

    我正在运行下面链接中提到的 IBM 提供的区块链演示 https github com IBM Blockchain marbles https github com IBM Blockchain marbles 我在一个 Linux 系统
  • 如何从 Firestore 查询中排除元素?

    我有一个用户集合 我想从数据库中查询所有用户并将它们显示在RecyclerView除了一个 mine 这是我的数据库架构 users collection uid document uid fR5bih7SysccRu2Gu9990TeSS
  • 如何像对象一样操作Json响应?

    我的 jQuery ajax 返回 JSon 对象 我首先阅读了其他文章 但他们的回复文字不喜欢我的 我的回复内容 来自萤火虫响应 item country USA lan EN country Turkiye lan TR 现在我试图提醒
  • 通过内省打印 ctypes“Structure”的所有字段

    test c include
  • 在 XAML (WPF) 中将图标放入文本框中

    我想将一个小图标 一个 png 文件 放在文本框的一角 我的意思的草图位于http dosketch com view php k mIPeHLSBLx0e2YpoVpYO http dosketch com view php k mIPe
  • 创建自定义链轮处理器的文档?

    我正在尝试为 Rails 创建一个链轮预处理器 它会发现 png rb资产管道中的文件 并使用它们生成我的应用程序中各个页面的 png 屏幕截图 我已经阅读了很多关于这个主题的内容 但我似乎找不到任何关于如何进行此设置的简单文档 请帮助 这
  • 在 Active Record 中使用 find() 和多个 where 子句

    我想将 Active Record 查询后的内容 使用括号 分为 3 组 第一组是从第一个 Where 子句到最后一个 orWhere 第二个和第三个将使用 andWhere 请给我关于如何使用括号分隔所有 3 个部分的建议 query B
  • UICollectionView 不调用委托方法

    我已经设置了一个UICollectionView在故事板中并连接数据源和委托出口 我已经通过笔尖注册了一个单元格 我将其出队cellForItemAtIndexPath 方法 所有工作都完美地期望委托方法永远不会被调用 例如 当触摸一个单元
  • 如何在 Javascript 中实现应用模式

    Javascript 中引用函数调用模式的应用调用模式是什么 我该如何使用它 使用这种调用模式有什么好处 指某东西的用途apply与函数上下文相关 this关键字 和参数传递 首先 我想你应该知道在什么情况下this关键字是隐含地 set
  • 如何从 ~/.aws/config 加载配置

    变更日志 https github com aws aws sdk js blob master CHANGELOG md 2440 says Load config from aws config if AWS SDK LOAD CONF
  • ListField 在编辑/创建帖子中显示

    我正在一个项目中使用 Flask mongoengine 我正在尝试从中获取基本的东西http docs mongodb org manual tutorial write a tumblelog application with flas
  • 如何在MASM中为一个项目编写和组合多个源文件?

    对于组装来说还是个新手 玩起来很有趣 我想将程序的功能拆分到多个文件中 特别是通过将类似的功能分组在一起进行组织 这些其他文件将由主文件 甚至希望其他非主文件 调用 我还没有成功 希望得到帮助 我不使用 IDE 更喜欢使用 notepad
  • Excel VBA 用于匹配和排列行

    我有一个 Excel 文档 其中包含 A 到 J 列 K 到 N 列包含相关数据 但未对齐 我需要将 F 列中的值与 K 列中的值进行匹配 以便它们对齐 当我移动K时 我必须一起移动L M N 我无法对 A 到 J 列进行排序 它们必须保留
  • JWT 计算签名 SHA256withRSA

    我试图 使用 SHA256withRSA 对输入的 UTF 8 表示形式进行签名 也可以 称为带有 SHA 256 哈希函数的 RSASSA PKCS1 V1 5 SIGN 从API控制台获取的私钥 输出将是 字节数组 所以让我们将 Hea