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
Se pasó directamente una cadena PEM
frecuenteEl código migrado desde jsonwebtoken, que acepta texto PEM, suele pasar `process.env.PUBLIC_KEY` directamente a `jwtVerify`. jose exige antes `importSPKI` (claves públicas), `importPKCS8` (claves privadas) o `importX509` (certificados).
Se pasó un secreto HMAC como cadena
frecuentePara HS256/HS384/HS512, el secreto tiene que ser bytes: `new TextEncoder().encode(secret)`. La cadena en sí se rechaza aunque sea el secreto correcto.
Una cadena con la URL del JWKS en lugar de una función de conjunto de claves
ocasional`"https://issuer/.well-known/jwks.json"` es una cadena, no una clave. Envuélvela con `createRemoteJWKSet(new URL(...))`, que devuelve la función que espera `jwtVerify`.
Falta el valor de configuración
ocasionalUna variable de entorno sin definir da `undefined`, que no supera la misma comprobación de tipo. Valida la configuración al arrancar para que el error indique, en cambio, la variable que falta.
Cómo solucionarlo
- 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.
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.
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"] });