在 JavaScript 中创建压缩的 JWT 负载

Creating Compressed JWT Payload in JavaScript

我有一个函数可以将压缩的 JWT 有效负载解析为 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 字符串看起来不一样了。它比原来的更长,只有一些字符保持一致。

如果您能够解压并准确获取原始有效负载,那么您没有问题。永远不能保证解压缩压缩会给你同样的东西。唯一的保证是 compress-decompress 会给你同样的东西。

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

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