Fehlermeldung
jwt signature is required
jsonwebtoken (Node.js) — JsonWebTokenError from jwt.verify()
Was der Fehler bedeutet
Das dritte Segment des Tokens ist leer – es ist ein ungesichertes JWT (`alg: "none"`) oder ein signiertes Token, dessen Signatur abgeschnitten wurde –, aber du hast `verify()` mit einem Schlüssel aufgerufen, also ist eine Signatur Pflicht. jsonwebtoken lehnt ab, statt Claims zu akzeptieren, die niemand signiert hat. Erreichen solche Tokens deine API von außen, sucht womöglich jemand gezielt nach der klassischen Schwachstelle „alg none“.
Warum der Fehler auftritt
Ein ungesichertes Token mit alg „none“
häufigRFC 7519 erlaubt unsignierte JWTs in Kontexten, in denen die Integrität anderweitig gesichert ist; eine API ist nie ein solcher Kontext. Ein Token wie `eyJhbGciOiJub25lIn0.eyJzdWIiOiJhZG1pbiJ9.` kann jede beliebige Identität behaupten.
Von Hand gebaute Tokens in Tests oder Tools
gelegentlichFixtures, für die Header und Payload base64-kodiert und zusammengesetzt wurden, oder Tokens aus Debugging-Tools mit abgeschaltetem Signieren haben eine leere Signatur.
Die Signatur wurde unterwegs entfernt
gelegentlichEin Schwärzungsfilter im Logging, ein Längenlimit für URLs oder eine Datenbankspalte, die das Token direkt nach dem zweiten Punkt abgeschnitten hat, hinterlässt Header und Payload, die gültig aussehen, aber nichts, was sich prüfen ließe.
So behebst du den Fehler
- 1.
Ablehnung und Algorithmen-Allowlist beibehalten
Prüfe mit einer expliziten Liste `algorithms`, die nur das nennt, was dein Aussteller verwendet. Protokolliere die Herkunft der Anfrage, wenn unsignierte Tokens von außen eintreffen; baue keinen Codepfad ein, der sie akzeptiert.
js // Always pass an explicit allow-list; "none" must never be in it. const claims = jwt.verify(token, publicKey, { algorithms: ["ES256"] }); - 2.
Test-Tokens mit einem Wegwerfschlüssel signieren
Erzeuge im Test-Setup ein Schlüsselpaar und signiere die Fixtures damit, sodass die Tests denselben Prüfpfad durchlaufen wie in der Produktion.
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" });