Saltar al contenido
ecdsa.com
jose (JavaScript)Bibliotecas de JWT

Mensaje de error

Invalid Compact JWS

jose (JavaScript) — JWSInvalid, code ERR_JWS_INVALID

Qué significa

jose no pudo dividir la entrada en los tres segmentos separados por puntos de la serialización compacta de JWS (header.payload.signature). La cadena que le pasas no tiene la estructura de un token firmado; no se llegó a intentar ninguna operación criptográfica. Es el equivalente en jose del error «jwt malformed» de jsonwebtoken y, como ese error, indica que el problema está antes de la biblioteca JWT: en lo que generó o transportó la cadena.

Por qué ocurre

Cómo solucionarlo

  1. 1.

    Sanear la entrada y comprobar los segmentos

    Recorta los espacios, quita el esquema y comprueba el número de segmentos antes de llamar a jose: así obtienes errores precisos a nivel de aplicación en lugar de un fallo de análisis genérico.

    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.

    Derivar los tokens JWE al descifrado

    Si cuentas cinco segmentos, el token está cifrado. Usa jwtDecrypt con la clave privada del destinatario en lugar de jwtVerify.

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

    Rastrear dónde se construyó la cadena

    Si un valor ya saneado sigue fallando, registra su longitud y sus primeros caracteres en cada salto: cliente, pasarela, almacenamiento, manejador. El primer segmento de un JWT firmado es JSON en base64url, así que los tokens reales empiezan por «eyJ» (la codificación de '{"'); el salto en el que eso deja de cumplirse es donde se produce la corrupción.

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

Errores relacionados

Explorar toda la base de datos de errores de firma