Fehlermeldung
jwt must be provided
jsonwebtoken (Node.js) — JsonWebTokenError from jwt.verify()
Was der Fehler bedeutet
`jwt.verify()` hat überhaupt kein Token erhalten: Das erste Argument war `undefined`, `null` oder ein leerer String. jsonwebtoken prüft das vor dem Parsen, daher spielen der Schlüssel und das Format des Tokens noch keine Rolle. Das Problem liegt weiter vorn – der Code, der das Token aus der Anfrage holt, hat nichts gefunden.
Warum der Fehler auftritt
Der Client hat keinen Authorization-Header gesendet
häufigDie Anfrage hat die Route ohne Token erreicht – der Nutzer war nicht angemeldet, der Client hat vergessen, den Header anzuhängen, oder das Token ist clientseitig abgelaufen und wurde gelöscht. Code wie `req.headers.authorization.split(" ")[1]` liefert dann `undefined`.
Das Token wird an der falschen Stelle gelesen
häufigFalsch geschriebene Eigenschaften (`authorisation`, `Authorization` in einer Header-Map mit kleingeschriebenen Namen), ein eigener Header wie `x-access-token` oder ein Query-Parameter, den der Code nicht liest. Node schreibt die Namen eingehender Header klein, deshalb ist `req.headers.Authorization` immer `undefined`.
Das Session-Cookie wurde nicht mitgesendet
gelegentlichCross-Origin-Anfragen senden keine Cookies mit, es sei denn, der Client setzt `credentials: "include"` und das Cookie ist `SameSite=None; Secure`. Ohne die Middleware cookie-parser ist außerdem `req.cookies` leer.
Das Token war noch nicht bereit
gelegentlichFrontends, die Daten abrufen, bevor der Login-Flow das Token gespeichert hat, oder die das Token asynchron aus dem Speicher lesen, senden die ersten Anfragen mit einem leeren Wert.
So behebst du den Fehler
- 1.
Token defensiv auslesen und mit 401 antworten
Prüfe vor dem Aufruf von `verify`, ob das Token fehlt, und antworte mit 401 und einem Header `WWW-Authenticate: Bearer`. Clients sehen dann „nicht authentifiziert“ statt einer 500 durch einen nicht abgefangenen Fehler.
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.
Client das Token anhängen lassen
Vergewissere dich im Netzwerk-Tab des Browsers, dass die Anfrage `Authorization: Bearer …` (oder das Cookie) enthält. Ist der Header im Browser zu sehen, fehlt aber auf dem Server, entfernt ihn ein Proxy dazwischen.
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" });