Pular para o conteúdo
ecdsa.com
jsonwebtoken (Node.js)Bibliotecas de JWT

Mensagem de erro

secretOrPublicKey must be an asymmetric key when using ES256

O que significa

Você pediu ao jsonwebtoken para verificar (ou assinar — a mensagem irmã diz secretOrPrivateKey) um token ES256, mas o material de chave que você forneceu é um segredo simétrico — uma string comum ou um Buffer que não é PEM/KeyObject. ES256 é ECDSA na P-256: precisa de um par de chaves EC, não de um segredo compartilhado.

Por que acontece

Como corrigir

  1. 1.

    Carregar uma chave pública EC de verdade

    Verifique ES256 com um PEM (SPKI) ou um KeyObject. Se você tem uma JWK — de um endpoint JWKS, por exemplo —, converta-a antes com node:crypto.

    js
    import { createPublicKey } from "node:crypto";
    
    const key = createPublicKey({ key: jwk, format: "jwk" }); // or a PEM string
    jwt.verify(token, key, { algorithms: ["ES256"] });
  2. 2.

    Resolver as chaves do JWKS com uma função auxiliar

    Se o emissor publica as chaves em uma URL de JWKS, não passe a URL como chave — resolva a chave de cada token pelo kid.

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

    Ou: você queria mesmo HS256

    Se o emissor e o verificador são o seu próprio serviço e o segredo compartilhado é intencional, defina algorithm: "HS256" nos dois lados em vez de ES256. Misturar as duas famílias é justamente o que este erro impede — inclusive o cenário clássico de ataque de confusão de chaves.

Erros relacionados

Ver toda a base de erros de assinatura