Message d’erreur
Invalid Compact JWS
jose (JavaScript) — JWSInvalid, code ERR_JWS_INVALID
Ce que cela signifie
jose n’a pas pu découper votre entrée en trois segments séparés par des points, ceux de la sérialisation compacte JWS (header.payload.signature). La chaîne que vous avez passée n’est structurellement pas un jeton signé ; aucune opération cryptographique n’a été tentée. Cette erreur est l’équivalent dans jose du « jwt malformed » de jsonwebtoken et, comme lui, elle signifie que le problème se situe en amont de la bibliothèque JWT, dans ce qui a produit ou transporté la chaîne.
Pourquoi cela se produit
Le jeton a été tronqué ou accolé à un autre
fréquenteUne valeur qui a perdu son dernier segment (colonne de base de données, ligne de journal, copie partielle) ou deux jetons concaténés dans un même en-tête n’ont plus exactement trois segments. Un préfixe « Bearer » ou des guillemets JSON autour d’un jeton intact ne déclenchent pas ce message : la chaîne a toujours trois segments, et jose signale plutôt « JWS Protected Header is invalid » ; un saut de ligne final est toléré.
La variable ne contient pas de jeton
fréquenteundefined converti en chaîne « undefined », une chaîne vide due à un cookie absent, ou un jeton d’accès OAuth opaque (non JWT) : rien de tout cela n’a la structure d’un JWS. L’échec se situe en amont de jose.
Un JWE passé à une API JWS
occasionnelleLes jetons chiffrés (JWE) ont cinq segments, pas trois. Si votre émetteur chiffre les jetons, jwtVerify/compactVerify les rejetteront ici : le bon point d’entrée est le déchiffrement (jwtDecrypt), suivi de la vérification du JWS imbriqué s’il y en a un.
Comment corriger l’erreur
- 1.
Nettoyer l’entrée et vérifier ses segments
Supprimez les espaces superflus, retirez le schéma et vérifiez le nombre de segments avant d’appeler jose : vous obtenez des erreurs applicatives précises au lieu d’un échec d’analyse générique.
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.
Diriger les jetons JWE vers le déchiffrement
Si vous comptez cinq segments, le jeton est chiffré. Utilisez jwtDecrypt avec la clé privée du destinataire au lieu de jwtVerify.
js import { jwtDecrypt } from "jose"; const { payload } = await jwtDecrypt(token, privateKey); // 5-segment JWE - 3.
Retrouver l’endroit où la chaîne a été construite
Si une valeur nettoyée échoue encore, journalisez sa longueur et ses premiers caractères à chaque étape : client, passerelle, stockage, gestionnaire. Le premier segment d’un JWT signé est du JSON encodé en base64url, donc les vrais jetons commencent par « eyJ » (l’encodage de '{"') ; l’étape où cela cesse d’être vrai est celle où la corruption se produit.
js console.log(token.length, JSON.stringify(token.slice(0, 12))); // healthy: 300+ 'eyJhbGciOiJF'