Mensaje de error
UnauthorizedError: No authorization token was found
También se muestra como
- No authorization token was found
- Format is Authorization: Bearer [token]
Si no se gestiona, Express imprime el error con su traza de pila, empezando por «UnauthorizedError: No authorization token was found». `err.code` distingue `credentials_required` (sin token) de `credentials_bad_scheme` y `credentials_bad_format` («Format is Authorization: Bearer [token]»).
express-jwt (Node.js) — UnauthorizedError, code credentials_required
Qué significa
express-jwt protege la ruta, pero no encuentra ningún token: la solicitud no tiene encabezado `Authorization` y ninguna función `getToken` personalizada devolvió uno. Como `credentialsRequired` vale `true` de forma predeterminada, el middleware lanza `UnauthorizedError` con `code: "credentials_required"` y `status: 401`, y la solicitud nunca llega a tu controlador. Un encabezado presente pero que no tiene la forma `Bearer <token>` falla, en cambio, con «Format is Authorization: Bearer [token]».
Por qué ocurre
El cliente no envía el encabezado Authorization
frecuenteUn usuario que aún no ha iniciado sesión, un cliente HTTP sin el interceptor que añade el encabezado o un token borrado tras caducar. Revisa la solicitud en el panel de red del navegador.
El token viaja en una cookie o en la cadena de consulta
frecuenteexpress-jwt solo lee `Authorization: Bearer` de forma predeterminada. Los tokens en una cookie HttpOnly, en un parámetro `?access_token=` o en un encabezado personalizado necesitan una función `getToken`, y las cookies además necesitan `cookie-parser`.
Un proxy elimina el encabezado
ocasionalLas pasarelas de API con asignaciones explícitas de encabezados, los proxies que solo reenvían una lista de encabezados permitidos o una regla de reescritura que vacía el encabezado pueden descartar `Authorization` antes de que la solicitud llegue a Node. El navegador muestra el encabezado; el servidor nunca lo recibe.
El middleware también protege las rutas públicas
ocasional`app.use(expressjwt(...))` antes de las rutas lo protege todo, incluidos el endpoint de comprobación de estado, el inicio de sesión y los recursos estáticos. Es normal que las solicitudes a esas rutas no lleven token.
Cómo solucionarlo
- 1.
Indicar a express-jwt dónde está el token
`getToken` recibe la solicitud y devuelve la cadena del token o `null`. Mantenla sencilla y no aceptes tokens de varios sitios a la vez.
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.
Excluir las rutas públicas o hacer opcional la autenticación
`.unless()` omite las rutas indicadas. `credentialsRequired: false` deja pasar las solicitudes sin token, sin `req.auth`, para que cada ruta pueda decidir.
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.
Convertir el error en una respuesta 401 adecuada
El controlador de errores predeterminado de Express usa el `status` del error (401), pero responde con una página HTML —que en desarrollo incluye la traza de pila— y sin el encabezado `WWW-Authenticate`. Convierte tú mismo `UnauthorizedError` en un 401 JSON con ese encabezado.
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); });