Pular para o conteúdo
ecdsa.com
jose (JavaScript)Bibliotecas de JWT

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

Como corrigir

  1. 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. 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. 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"] });

Erros relacionados

Ver toda a base de erros de assinatura