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

Mensaje de error

Key for the ES256 algorithm must be one of type CryptoKey, KeyObject, or JSON Web Key.

También se muestra como

  • Key for the RS256 algorithm must be one of type CryptoKey, KeyObject, or JSON Web Key.
  • Key for the HS256 algorithm must be one of type CryptoKey, KeyObject, JSON Web Key, or Uint8Array.

El algoritmo de la frase depende de tu token (`ES256`, `RS256`, `EdDSA`…). Para los algoritmos HMAC, la lista termina con «or Uint8Array».

jose (JavaScript) — TypeError from jwtVerify / SignJWT.sign

Qué significa

Estás pasando a jose un valor que no puede usar como clave; casi siempre, una cadena PEM o un secreto como cadena de texto. Desde la versión 4, jose solo acepta objetos de clave: un `CryptoKey` de WebCrypto, un `KeyObject` de Node.js, un objeto JWK o (para algoritmos HMAC) un `Uint8Array`. Los formatos de texto se tienen que importar primero; jose nunca adivina qué contiene una cadena.

Por qué ocurre

Cómo solucionarlo

  1. 1.

    Importar las claves PEM una sola vez, al arrancar

    `importSPKI` e `importPKCS8` reciben el texto PEM y el algoritmo con el que se usará la clave, y devuelven un `CryptoKey` que puedes reutilizar en todas las solicitudes.

    js
    import { importSPKI, importPKCS8, jwtVerify } from "jose";
    
    const publicKey = await importSPKI(process.env.JWT_PUBLIC_KEY_PEM, "ES256");   // -----BEGIN PUBLIC KEY-----
    await jwtVerify(token, publicKey, { algorithms: ["ES256"] });
    
    const privateKey = await importPKCS8(process.env.JWT_PRIVATE_KEY_PEM, "ES256"); // -----BEGIN PRIVATE KEY-----
  2. 2.

    Codificar los secretos HMAC como bytes

    Usa un secreto aleatorio de al menos 32 bytes para HS256 y pásalo como `Uint8Array`. Si el secreto está guardado codificado en base64, decodifícalo a bytes en lugar de codificar el texto base64.

    js
    import { jwtVerify } from "jose";
    
    const secret = new TextEncoder().encode(process.env.JWT_SECRET); // 32+ random bytes for HS256
    await jwtVerify(token, secret, { algorithms: ["HS256"] });
  3. 3.

    Verificar con un conjunto de claves, no con una URL

    Para tokens de un proveedor de identidad, pasa la función que devuelve `createRemoteJWKSet`; jose elige entonces la clave por `kid` para cada token.

    js
    import { createRemoteJWKSet, jwtVerify } from "jose";
    
    const jwks = createRemoteJWKSet(new URL("https://issuer.example.com/.well-known/jwks.json"));
    await jwtVerify(token, jwks, { algorithms: ["ES256"] });

Errores relacionados

Explorar toda la base de datos de errores de firma