跳到主要内容
ecdsa.com
jose (JavaScript)JWT 库

错误信息

Invalid Compact JWS

jose (JavaScript) — JWSInvalid, code ERR_JWS_INVALID

含义

jose 无法把你的输入拆分成 JWS 紧凑序列化所要求的三个以点分隔的段(header.payload.signature)。从结构上看,你传入的字符串根本不是签名令牌;jose 没有执行任何密码学运算。它相当于 jsonwebtoken 的“jwt malformed”——和那个错误一样,它说明问题出在 JWT 库的上游,即生成或传输这个字符串的环节。

原因

修复方法

  1. 1.

    清理输入并检查段数

    在调用 jose 之前,先去除首尾空白、去掉认证方案前缀(如 Bearer),并断言段数——这样得到的是精确的应用层错误,而不是笼统的解析失败。

    js
    const token = raw.replace(/^Bearer\s+/i, "").trim();
    const segments = token.split(".").length;
    if (segments !== 3) throw new Error(`expected JWS (3 segments), got ${segments}`);
  2. 2.

    把 JWE 令牌交给解密流程

    如果数出来是五段,说明令牌是加密的。应使用 jwtDecrypt 和接收方的私钥,而不是 jwtVerify。

    js
    import { jwtDecrypt } from "jose";
    
    const { payload } = await jwtDecrypt(token, privateKey); // 5-segment JWE
  3. 3.

    追查字符串是在哪里构造的

    如果清理后的值仍然报错,就在每一跳——客户端、网关、存储、处理程序——记录它的长度和开头几个字符。签名 JWT 的第一段是 base64url 编码的 JSON,因此真正的令牌以“eyJ”开头(即 '{"' 的编码);从哪一跳开始不再如此,损坏就发生在哪一跳。

    js
    console.log(token.length, JSON.stringify(token.slice(0, 12)));
    // healthy: 300+ 'eyJhbGciOiJF'

相关错误

浏览完整的签名错误库