Fehlermeldung
jwt issuer invalid. expected: https://login.example.com/
Der Text nach „expected:“ ist das, was du konfiguriert hast; bei einem Array von Ausstellern werden die Werte mit Kommas verbunden.
jsonwebtoken (Node.js) — JsonWebTokenError from jwt.verify()
Was der Fehler bedeutet
Der Claim `iss` des Tokens ist nicht gleich der Option `issuer`, die du `jwt.verify()` übergeben hast (oder das Token hat überhaupt kein `iss`). Der Text nach „expected:“ ist dein konfigurierter Wert, nicht der des Tokens. jsonwebtoken vergleicht Strings exakt: Die Signatur ist gültig, aber das Token gibt an, von einer Stelle zu stammen, der dein Dienst nicht vertraut.
Warum der Fehler auftritt
Derselbe Aussteller, andere Schreibweise
häufigEin Schrägstrich am Ende, http gegenüber https, ein Host in Großbuchstaben oder ein fehlendes Pfadsegment (`/realms/main`, `/v2.0`, `/oauth2/default`). Identity Provider schreiben `iss` genau so wie `issuer` in ihrem Discovery-Dokument; der Prüfer muss denselben String verwenden.
Das Token hat keinen Claim iss
gelegentlichInterne Token-Dienste lassen `iss` oft weg. Ist die Option `issuer` gesetzt, scheitert ein fehlender Claim mit derselben Meldung, weil es nichts zu vergleichen gibt.
Das Token stammt tatsächlich von einem anderen Aussteller
gelegentlichEin Token von einem anderen Mandanten, aus einer anderen Umgebung oder von einem anderen Provider. Hier ist der Fehler der Schutz, der greift: Lehne solche Tokens weiterhin ab.
So behebst du den Fehler
- 1.
iss des Tokens als JSON ausgeben
`JSON.stringify` macht unsichtbare Unterschiede sichtbar – Schrägstriche am Ende, Whitespace, einen anderen Pfad. Kopiere danach den `issuer` des Providers aus `/.well-known/openid-configuration` in deine Konfiguration.
js const { iss } = jwt.decode(token) ?? {}; console.log(JSON.stringify(iss)); // compare byte for byte with your issuer option - 2.
Mehrere Aussteller nur bewusst akzeptieren
Die Option `issuer` akzeptiert ein Array. Nutze es für eine geplante Migration zwischen zwei Schreibweisen oder zwischen Ausstellern, die du selbst betreibst – und ordne jedem Aussteller seine eigenen Schlüssel zu.
js jwt.verify(token, publicKey, { algorithms: ["ES256"], issuer: ["https://login.example.com/", "https://login.example.com"], // during a migration only });