在 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 会给你同样的东西。

压缩相同的数据有很多种方法,相同的压缩代码设置不同,不同版本的压缩代码设置相同,或者只是不同的压缩代码,都可以对相同的数据给出不同的压缩输出。不知道什么版本的压缩代码和什么设置让你收到了什么,你不太可能准确地重建它。而且没有理由也没有必要。

如果您想尝试再压缩一点,请将deflateRawSynclevel 选项设置为9

【讨论】:

以上是关于在 JavaScript 中创建压缩的 JWT 有效负载的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP 可读的 javascript 中创建 PEM 密钥对

使用 JWT 在 Code Igniter 4 中创建登录系统的过程

如何在java中创建jwt [关闭]

在 Spring Cloud Gateway 中创建 JWT 黑名单

如何在 Symfony 5 中创建 JWT 令牌?

在 Java 中创建 JWT,在 Node 中验证很热门?