Mensagem de erro
Key for the ES256 algorithm must be one of type CryptoKey, KeyObject, or JSON Web Key.
Também aparece 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.
O algoritmo na frase muda conforme o token (`ES256`, `RS256`, `EdDSA`…). Para algoritmos HMAC, a lista termina com “or Uint8Array”.
jose (JavaScript) — TypeError from jwtVerify / SignJWT.sign
O que significa
Você passou para o jose um valor que ele não consegue usar como chave — na maioria das vezes, uma string PEM ou um segredo em forma de string simples. Desde a versão 4, o jose aceita apenas objetos de chave: um `CryptoKey` do WebCrypto, um `KeyObject` do Node.js, um objeto JWK ou (para algoritmos HMAC) um `Uint8Array`. Formatos de texto precisam ser importados antes; o jose nunca tenta adivinhar o que uma string contém.
Por que acontece
Uma string PEM foi passada diretamente
comumCódigo migrado do jsonwebtoken, que aceita texto PEM, muitas vezes passa `process.env.PUBLIC_KEY` direto para `jwtVerify`. O jose exige antes `importSPKI` (chaves públicas), `importPKCS8` (chaves privadas) ou `importX509` (certificados).
Um segredo HMAC foi passado como string
comumPara HS256/HS384/HS512, o segredo precisa estar em bytes: `new TextEncoder().encode(secret)`. A string em si é rejeitada, mesmo sendo o segredo certo.
Uma string com a URL do JWKS em vez de uma função de conjunto de chaves
ocasional`"https://issuer/.well-known/jwks.json"` é uma string, não uma chave. Envolva-a com `createRemoteJWKSet(new URL(...))`, que retorna a função que o `jwtVerify` espera.
Falta o valor de configuração
ocasionalUma variável de ambiente não definida resulta em `undefined`, que falha na mesma verificação de tipo. Valide a configuração na inicialização para que, em vez disso, o erro cite a variável ausente.
Como corrigir
- 1.
Importar chaves PEM uma vez, na inicialização
`importSPKI` e `importPKCS8` recebem o texto PEM e o algoritmo com que a chave será usada, e retornam um `CryptoKey` que você pode reutilizar em todas as requisições.
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 segredos HMAC como bytes
Use um segredo aleatório de pelo menos 32 bytes para HS256 e passe-o como `Uint8Array`. Se o segredo estiver armazenado codificado em base64, decodifique-o para bytes em vez de codificar o texto em 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 com um conjunto de chaves, não com uma URL
Para tokens de um provedor de identidade, passe a função retornada por `createRemoteJWKSet`; o jose então escolhe a chave pelo `kid` de 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"] });