Fehlermeldung
UnauthorizedError: No authorization token was found
Auch ausgegeben als
- No authorization token was found
- Format is Authorization: Bearer [token]
Bleibt der Fehler unbehandelt, gibt Express ihn samt Stack aus, beginnend mit „UnauthorizedError: No authorization token was found“. `err.code` unterscheidet `credentials_required` (kein Token) von `credentials_bad_scheme` und `credentials_bad_format` („Format is Authorization: Bearer [token]“).
express-jwt (Node.js) — UnauthorizedError, code credentials_required
Was der Fehler bedeutet
express-jwt schützt die Route, hat aber kein Token gefunden: Die Anfrage hat keinen Header `Authorization`, und keine eigene Funktion `getToken` hat eines geliefert. Weil `credentialsRequired` standardmäßig `true` ist, wirft die Middleware `UnauthorizedError` mit `code: "credentials_required"` und `status: 401`, und die Anfrage erreicht deinen Handler nie. Ist ein Header vorhanden, hat aber nicht die Form `Bearer <token>`, scheitert sie stattdessen mit „Format is Authorization: Bearer [token]“.
Warum der Fehler auftritt
Der Client hat keinen Authorization-Header gesendet
häufigNoch nicht angemeldet, ein HTTP-Client ohne den Interceptor, der den Header hinzufügt, oder ein Token, das nach seinem Ablauf gelöscht wurde. Prüfe die Anfrage im Netzwerk-Tab des Browsers.
Das Token steckt in einem Cookie oder Query-String
häufigexpress-jwt liest standardmäßig nur `Authorization: Bearer`. Für Tokens in einem HttpOnly-Cookie, einem Parameter `?access_token=` oder einem eigenen Header brauchst du eine Funktion `getToken` – und für Cookies zusätzlich `cookie-parser`.
Ein Proxy hat den Header entfernt
gelegentlichAPI-Gateways mit expliziten Header-Mappings, Proxys, die nur Header von einer Allowlist weiterleiten, oder eine Rewrite-Regel, die den Header leert, können `Authorization` verwerfen, bevor die Anfrage Node erreicht. Der Browser zeigt den Header an, beim Server kommt er nie an.
Die Middleware schützt auch öffentliche Routen
gelegentlich`app.use(expressjwt(...))` vor den Routen schützt alles, auch Health Checks, Login und statische Assets. Anfragen an diese Routen tragen berechtigterweise kein Token.
So behebst du den Fehler
- 1.
express-jwt mitteilen, wo das Token steckt
`getToken` erhält die Anfrage und gibt den Token-String oder `null` zurück. Halte die Funktion einfach und akzeptiere Tokens nicht aus mehreren Quellen gleichzeitig.
js import cookieParser from "cookie-parser"; import { expressjwt } from "express-jwt"; app.use(cookieParser()); app.use( expressjwt({ secret: getSigningKey, // e.g. jwks-rsa's expressJwtSecret(...) algorithms: ["RS256"], getToken: (req) => req.cookies.access_token ?? null, }), ); - 2.
Öffentliche Routen ausnehmen oder Authentifizierung optional machen
`.unless()` überspringt die aufgeführten Pfade. `credentialsRequired: false` lässt Anfragen ohne Token ohne `req.auth` durch, sodass jede Route selbst entscheiden kann.
js app.use( expressjwt({ secret, algorithms: ["HS256"] }).unless({ path: ["/health", "/login", /^\/public\//] }), ); // Or keep authentication optional and decide per route: app.use(expressjwt({ secret, algorithms: ["HS256"], credentialsRequired: false })); - 3.
Fehler in eine korrekte 401-Antwort umwandeln
Der Standard-Handler von Express übernimmt den `status` des Fehlers (401), antwortet aber mit einer HTML-Seite – in der Entwicklung samt Stacktrace – und ohne Header `WWW-Authenticate`. Bilde `UnauthorizedError` selbst auf eine JSON-Antwort mit Status 401 und diesem Header ab.
js app.use((err, req, res, next) => { if (err.name === "UnauthorizedError") { return res.status(401).set("WWW-Authenticate", "Bearer").json({ error: err.code }); } next(err); });