Fehlermeldung
Invalid Compact JWS
jose (JavaScript) — JWSInvalid, code ERR_JWS_INVALID
Was der Fehler bedeutet
jose konnte deine Eingabe nicht in die drei durch Punkte getrennten Segmente der kompakten Serialisierung von JWS (header.payload.signature) zerlegen. Der übergebene String ist schon strukturell kein signiertes Token; kryptografisch wurde nichts versucht. Das ist das jose-Gegenstück zu „jwt malformed“ von jsonwebtoken – und wie bei diesem Fehler liegt das Problem nicht in der JWT-Bibliothek, sondern weiter vorn: bei dem, was den String erzeugt oder transportiert hat.
Warum der Fehler auftritt
Das Token wurde abgeschnitten oder mit einem anderen zusammengefügt
häufigEin Wert, der sein letztes Segment verloren hat (in einer Datenbankspalte, einer Logzeile, einer unvollständigen Kopie), oder zwei in einem Header aneinandergehängte Tokens haben nicht mehr genau drei Segmente. Ein Präfix „Bearer “ oder JSON-Anführungszeichen um ein intaktes Token lösen diese Meldung nicht aus – der String hat dann weiterhin drei Segmente, und jose meldet stattdessen „JWS Protected Header is invalid“; ein Zeilenumbruch am Ende wird toleriert.
Die Variable enthält kein Token
häufigEin zu „undefined“ umgewandeltes undefined, ein leerer String wegen eines fehlenden Cookies oder ein opakes OAuth-Access-Token (kein JWT) – nichts davon hat JWS-Struktur. Der Fehler entsteht schon vor jose.
Ein JWE wurde an eine JWS-API übergeben
gelegentlichVerschlüsselte Tokens (JWE) haben fünf Segmente, nicht drei. Verschlüsselt dein Aussteller Tokens, lehnen jwtVerify/compactVerify sie an dieser Stelle ab – der richtige Einstiegspunkt ist die Entschlüsselung (jwtDecrypt), danach gegebenenfalls die Prüfung des verschachtelten JWS.
So behebst du den Fehler
- 1.
Eingabe bereinigen und Segmentanzahl prüfen
Schneide Whitespace an den Rändern ab, entferne das Schema und prüfe die Anzahl der Segmente, bevor du jose aufrufst – so bekommst du präzise Fehler auf Anwendungsebene statt eines allgemeinen Parse-Fehlers.
js const token = raw.replace(/^Bearer\s+/i, "").trim(); const segments = token.split(".").length; if (segments !== 3) throw new Error(`expected JWS (3 segments), got ${segments}`); - 2.
JWE-Tokens zur Entschlüsselung weiterleiten
Zählst du fünf Segmente, ist das Token verschlüsselt. Verwende jwtDecrypt mit dem privaten Schlüssel des Empfängers statt jwtVerify.
js import { jwtDecrypt } from "jose"; const { payload } = await jwtDecrypt(token, privateKey); // 5-segment JWE - 3.
Nachverfolgen, wo der String entstanden ist
Scheitert auch ein bereinigter Wert, protokolliere an jeder Station seine Länge und die ersten Zeichen – Client, Gateway, Speicher, Handler. Das erste Segment eines signierten JWT ist base64url-kodiertes JSON, echte Tokens beginnen also mit „eyJ“ (der Kodierung von „{"“); an der Station, ab der das nicht mehr stimmt, wird der Wert beschädigt.
js console.log(token.length, JSON.stringify(token.slice(0, 12))); // healthy: 300+ 'eyJhbGciOiJF'