Message d’erreur
jwt signature is required
jsonwebtoken (Node.js) — JsonWebTokenError from jwt.verify()
Ce que cela signifie
Le troisième segment du jeton est vide (c’est un JWT non sécurisé, `alg: "none"`, ou un jeton signé dont la signature a été coupée), mais vous avez appelé `verify()` avec une clé : une signature est donc obligatoire. jsonwebtoken refuse plutôt que d’accepter des claims que personne n’a signés. Si de tels jetons atteignent votre API depuis l’extérieur, quelqu’un est peut-être en train de tester la faiblesse classique « alg none ».
Pourquoi cela se produit
Un jeton non sécurisé avec alg « none »
fréquenteLa RFC 7519 autorise les JWT non signés dans les contextes où l’intégrité est garantie par d’autres moyens ; une API n’est jamais un tel contexte. Un jeton comme `eyJhbGciOiJub25lIn0.eyJzdWIiOiJhZG1pbiJ9.` peut se prévaloir de n’importe quelle identité.
Jetons construits à la main dans des tests ou des outils
occasionnelleLes fixtures de test assemblées par encodage base64 d’un en-tête et d’une charge utile, ou les jetons produits par des outils de débogage dont la signature est désactivée, ont une signature vide.
La signature a été supprimée en transit
occasionnelleUn outil de caviardage des journaux, une limite de longueur d’URL ou une colonne de stockage qui a coupé le jeton juste après le second point laisse un en-tête et une charge utile d’apparence valide, sans rien à vérifier.
Comment corriger l’erreur
- 1.
Conserver le rejet et la liste d’algorithmes autorisés
Vérifiez avec une liste `algorithms` explicite qui ne nomme que ce qu’utilise votre émetteur. Journalisez la source de la requête si des jetons non signés arrivent de l’extérieur ; n’ajoutez pas de chemin de code qui les accepte.
js // Always pass an explicit allow-list; "none" must never be in it. const claims = jwt.verify(token, publicKey, { algorithms: ["ES256"] }); - 2.
Signer les jetons de test avec une clé jetable
Générez une paire de clés lors de la mise en place des tests et signez les fixtures avec elle, afin que les tests empruntent le même chemin de vérification qu’en production.
js import { generateKeyPairSync } from "node:crypto"; // Test setup: a throwaway key pair, real signatures, same verification path as production. const { privateKey, publicKey } = generateKeyPairSync("ec", { namedCurve: "P-256" }); const token = jwt.sign({ sub: "test-user" }, privateKey, { algorithm: "ES256", expiresIn: "5m" });