Message d’erreur
secretOrPublicKey must be an asymmetric key when using ES256
Ce que cela signifie
Vous avez demandé à jsonwebtoken de vérifier (ou de signer – le message jumeau mentionne alors secretOrPrivateKey) un jeton ES256, mais le matériel de clé que vous avez fourni est un secret symétrique : une simple chaîne ou un Buffer qui n’est ni un PEM ni un KeyObject. ES256 est ECDSA sur P-256 : il lui faut une paire de clés EC, pas un secret partagé.
Pourquoi cela se produit
Un secret de l’époque HMAC resté dans la configuration
fréquenteLe service utilisait HS256 avec un secret partagé, quelqu’un a passé alg à ES256, et JWT_SECRET contient toujours « supersecret ». Une chaîne aléatoire n’est pas une clé EC, et jsonwebtoken refuse de faire comme si c’en était une.
La mauvaise variable de configuration est branchée
fréquenteLe PEM existe, mais le code lit une variable qui contient autre chose : un identifiant de clé ou une URL JWKS (« https://issuer/.well-known/jwks.json » est une chaîne, pas une clé). Une variable vide est signalée autrement, par « secret or public key must be provided ».
Le PEM a été abîmé en passant par la configuration
fréquenteUn PEM qui arrive avec des séquences \n littérales, entouré de guillemets ou indenté par un fichier YAML ne s’analyse plus comme une clé : jsonwebtoken 9 traite alors la chaîne comme un secret partagé et signale cette erreur. Rétablissez les sauts de ligne et retirez les guillemets avant de le transmettre.
Une JWK passée là où un PEM ou un KeyObject est attendu
occasionnelleUne JWK est un objet JSON ; la sérialiser en chaîne et la passer à jwt.verify() donne une chaîne qui n’est ni un PEM ni un KeyObject. Elle doit d’abord être convertie (crypto.createPublicKey({ key: jwk, format: "jwk" })).
Comment corriger l’erreur
- 1.
Charger une véritable clé publique EC
Vérifiez ES256 avec un PEM (SPKI) ou un KeyObject. Si vous disposez d’une JWK (provenant par exemple d’un point de terminaison JWKS), convertissez-la d’abord avec 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.
Résoudre les clés JWKS avec un utilitaire
Si votre émetteur publie ses clés à une URL JWKS, ne passez pas l’URL en guise de clé : résolvez la clé pour chaque jeton d’après son 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.
Ou bien : vous vouliez en fait HS256
Si l’émetteur et le vérificateur sont tous deux votre propre service et qu’un secret partagé est voulu, définissez algorithm: "HS256" des deux côtés au lieu d’ES256. Mélanger les deux familles, c’est précisément ce que cette erreur empêche, y compris dans le scénario classique d’attaque par confusion de clés.