在 JavaScript 中创建压缩的 JWT 有效负载
Posted
技术标签:
【中文标题】在 JavaScript 中创建压缩的 JWT 有效负载【英文标题】:Creating Compressed JWT Payload in JavaScript 【发布时间】:2021-11-16 14:57:15 【问题描述】:我有一个函数可以将压缩的 JWT Payload 解析为 JSON。该功能的工作方式对我来说很有意义。我想创建一个完全相反的函数:获取一个 JSON 对象并将其转换为 COMPRESSED JWT Payload。
解析解压函数:
function parseJwtPayload(payload)
const buffer = Buffer.from(payload, "base64");
const payloadJson = zlib.inflateRawSync(buffer);
return JSON.parse(payloadJson);
...输出 JSON。
...输入 JSON。 我尝试创建有效负载并对其进行压缩的功能:
function makeJwtPayload(json) // Where json is a String from JSON.stringify().
const buffer = Buffer.from(json, 'utf8');
var payload = zlib.deflateRawSync(buffer).toString('base64');
payload = payload.replace(/=+$/, '');
payload = payload.replace(/\+/g, '-');
payload = payload.replace(/\//g, '_');
return payload;
现在这个函数可以工作了,因为压缩后的编码字符串可以在原始函数中使用并解码,它将继续输出相同的 JSON 对象。但是重新编码时,Base64 字符串看起来不同。它比原版更长,只有部分字符保持一致。
【问题讨论】:
能否请您添加一个示例 JSON,原始,压缩,重新编码,以说明您的意思 重新编码时,Base64 字符串看起来不同 @jps 我想添加它,但我正在使用的特定示例如果共享会带来安全风险。我无法创建演示 JSON / JWT,因为这会破坏我的问题的目的。 【参考方案1】:如果您能够准确地解压缩并获得原始有效负载,那么您没有问题。永远不能保证 decompress-compress 会给你同样的东西。唯一的保证是 compress-decompress 会给你同样的东西。
压缩相同的数据有很多种方法,相同的压缩代码设置不同,不同版本的压缩代码设置相同,或者只是不同的压缩代码,都可以对相同的数据给出不同的压缩输出。不知道什么版本的压缩代码和什么设置让你收到了什么,你不太可能准确地重建它。而且没有理由也没有必要。
如果您想尝试再压缩一点,请将deflateRawSync
的level
选项设置为9
。
【讨论】:
以上是关于在 JavaScript 中创建压缩的 JWT 有效负载的主要内容,如果未能解决你的问题,请参考以下文章
在 PHP 可读的 javascript 中创建 PEM 密钥对
使用 JWT 在 Code Igniter 4 中创建登录系统的过程