Message d’erreur
jwt must be provided
jsonwebtoken (Node.js) — JsonWebTokenError from jwt.verify()
Ce que cela signifie
`jwt.verify()` n’a reçu aucun jeton : le premier argument valait `undefined`, `null` ou une chaîne vide. jsonwebtoken le vérifie avant l’analyse, si bien que ni la clé ni le format du jeton n’entrent encore en jeu. Le problème se situe en amont : le code qui extrait le jeton de la requête n’a rien trouvé.
Pourquoi cela se produit
Le client n’a pas envoyé d’en-tête Authorization
fréquenteLa requête a atteint la route sans jeton : l’utilisateur n’était pas connecté, le client a oublié de joindre l’en-tête, ou le jeton a expiré côté client et a été effacé. Un code comme `req.headers.authorization.split(" ")[1]` renvoie alors `undefined`.
Le jeton est lu au mauvais endroit
fréquenteDes propriétés mal orthographiées (`authorisation`, `Authorization` sur une table d’en-têtes en minuscules), un en-tête personnalisé tel que `x-access-token`, ou un paramètre de chaîne de requête que le code ne lit pas. Node met en minuscules les noms des en-têtes entrants : `req.headers.Authorization` vaut donc toujours `undefined`.
Le cookie de session n’a pas été transmis
occasionnelleLes requêtes multi-origines omettent les cookies, sauf si le client définit `credentials: "include"` et que le cookie est en `SameSite=None; Secure`. Sans le middleware cookie-parser, `req.cookies` est également vide.
Le jeton n’était pas encore prêt
occasionnelleLes front-ends qui récupèrent des données avant que le flux de connexion n’ait stocké le jeton, ou qui lisent le jeton depuis le stockage de manière asynchrone, envoient les premières requêtes avec une valeur vide.
Comment corriger l’erreur
- 1.
Extraire le jeton de manière défensive et répondre 401
Vérifiez l’absence de jeton avant d’appeler `verify` et renvoyez un 401 avec un en-tête `WWW-Authenticate: Bearer`. Les clients voient alors « non authentifié » au lieu d’une erreur 500 due à une exception non interceptée.
js function bearerToken(req) { const [scheme, token] = (req.headers.authorization ?? "").split(" "); return scheme?.toLowerCase() === "bearer" && token ? token : null; } app.use((req, res, next) => { const token = bearerToken(req); if (!token) return res.status(401).set("WWW-Authenticate", "Bearer").end(); try { req.user = jwt.verify(token, publicKey, { algorithms: ["ES256"] }); next(); } catch { res.status(401).set("WWW-Authenticate", 'Bearer error="invalid_token"').end(); } }); - 2.
Faire joindre le jeton par le client
Vérifiez dans le panneau Réseau du navigateur que la requête porte `Authorization: Bearer …` (ou le cookie). Si l’en-tête est visible dans le navigateur mais absent sur le serveur, c’est qu’un proxy intermédiaire le supprime.
js // Browser / Node 18+ fetch: the token must be attached explicitly. await fetch("https://api.example.com/orders", { headers: { Authorization: "Bearer " + accessToken }, }); // Cookies cross origins only with credentials and SameSite=None; Secure. await fetch("https://api.example.com/orders", { credentials: "include" });