Error HTTP 401 No Autorizado: Guía Completa de Diagnóstico y Solución
El código de estado HTTP 401 Unauthorized significa que el servidor recibió tu solicitud pero se niega a procesarla porque las credenciales de autenticación válidas estaban ausentes, eran incorrectas o habían expirado. A diferencia de un error 403 Forbidden — donde el servidor te reconoce pero deniega el acceso basándose en permisos — un 401 señala específicamente un fallo de autenticación: el servidor no sabe quién eres, o no puede verificarlo.
Esta distinción importa. Una respuesta 401 siempre incluye un encabezado WWW-Authenticate en la respuesta del servidor, indicando al cliente qué esquema de autenticación debe usar. Si ese encabezado está ausente, es posible que estés tratando con un servidor mal configurado en lugar de un problema de credenciales. Conocer el modo de fallo exacto antes de comenzar a solucionar problemas ahorra tiempo significativo.
Cómo se ve realmente una respuesta 401
El error aparece bajo varias variantes de mensaje dependiendo del software del servidor, el framework o el CDN frente a la aplicación:
401 UnauthorizedHTTP Error 401 – Unauthorized401 Unauthorized: Access is denied due to invalid credentialsAuthorization Required
401 Authorization Required (común en NGINX)
HTTP 401 (clientes API, Postman, curl)
Todos estos corresponden al mismo código de estado definido por RFC 9110. La variación en el texto es puramente cosmética — impulsada por el servidor web, el proxy inverso o el framework de aplicación que genera la respuesta.
La anatomía técnica de un error 401
Entender qué sucede a nivel de protocolo evita las conjeturas. Cuando un cliente envía una solicitud a un recurso protegido sin credenciales, el servidor responde con:
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer realm="example", error="invalid_token"
Content-Type: application/json
El encabezado WWW-Authenticate es el desafío del servidor. Le indica al cliente exactamente qué esquema — Basic, Bearer, Digest, NTLM, o un esquema personalizado — es requerido. Un cliente que ignora este encabezado y reintenta sin ajustar su solicitud entrará en un bucle indefinido.
401 vs. 403 vs. 407: Conocer la diferencia
Código de estado
Nombre
Causa raíz
Encabezado `WWW-Authenticate`
—
—
—
—
401
Unauthorized
Credenciales de autenticación ausentes o inválidas
Requerido por especificación
403
Forbidden
Autenticado pero sin permiso
No presente
407
Proxy Auth Required
El servidor proxy requiere credenciales
Encabezado `Proxy-Authenticate`
511
Network Auth Required
Portal cautivo (Wi-Fi de hotel, etc.)
No aplica
Confundir un 403 con un 401 es un error común de los desarrolladores. Si tu servidor devuelve 401 pero omite WWW-Authenticate, técnicamente no cumple con RFC 9110 — y algunos clientes HTTP estrictos tratarán la respuesta como malformada.
Causas raíz de un error 401 Unauthorized
Problemas de credenciales y tokens
Nombre de usuario o contraseña incorrectos — la causa más frecuente para el acceso basado en navegador
Tokens de acceso expirados — los tokens Bearer de OAuth 2.0 tienen un valor expires_in finito; una vez transcurrido, cada solicitud devuelve 401 hasta que el token se actualiza
Claves API revocadas — las claves pueden ser invalidadas del lado del servidor sin que el cliente sea notificado
Discrepancia en la firma JWT — si el secreto de firma rota y el cliente tiene un token firmado con el secreto anterior, la verificación falla silenciosamente
Desviación del reloj — los JWT incluyen reclamaciones iat (emitido en) y exp (expiración) validadas contra la hora del servidor; un reloj del cliente desviado más de unos pocos minutos puede causar que tokens válidos sean rechazados
Encabezados de autorización ausentes o malformados
Cada esquema de autenticación tiene un formato de encabezado preciso. Desviarse de él — incluso por un solo espacio o un relleno Base64 incorrecto — produce un 401:
# Correct Basic Auth header
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
# Correct Bearer token header
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...
Un error común es enviar Authorization: bearer <token> (b en minúsculas). Aunque RFC 6750 establece que el nombre del esquema no distingue entre mayúsculas y minúsculas, muchas bibliotecas del lado del servidor realizan coincidencia de cadenas estricta y rechazan la variante en minúsculas.
Mala configuración del lado del servidor
Método de autenticación incorrecto aplicado — un servidor configurado para OAuth 2.0 que recibe encabezados Basic Auth los rechazará
Directivas .htaccess — en Apache, una directiva AuthType, AuthName o Require mal configurada en .htaccess bloqueará cada solicitud detrás de una solicitud de contraseña
Bloques auth_basic de NGINX — una directiva auth_basic aplicada al bloque location incorrecto puede bloquear a usuarios legítimos
Proxy inverso eliminando encabezados — los balanceadores de carga y proxies inversos (NGINX, HAProxy, Cloudflare) pueden eliminar o reescribir los encabezados Authorization antes de que lleguen al servidor de origen
Interferencia del navegador y del lado del cliente
Cookies corruptas — las cookies de sesión que llevan el estado de autenticación pueden corromperse o desincronizarse después de una invalidación de sesión del lado del servidor
Extensiones de navegador agresivas — los bloqueadores de anuncios, extensiones de privacidad y extensiones VPN pueden modificar o eliminar los encabezados de solicitud
Fallos en el preflight de CORS — en llamadas API de origen cruzado, el navegador envía una solicitud de preflight OPTIONS; si el servidor no responde correctamente a ella, la solicitud autenticada real nunca se ejecuta
Factores de infraestructura y red
Reglas de firewall bloqueando endpoints de autenticación — los WAF (Web Application Firewalls) con reglas demasiado agresivas pueden marcar y descartar solicitudes que contienen encabezados Authorization como posibles ataques de inyección
CDN almacenando en caché respuestas autenticadas — si un CDN almacena en caché una respuesta 401 y la sirve a usuarios posteriores, incluso las credenciales válidas parecerán fallar
Limitación de velocidad basada en IP — los intentos de autenticación fallidos repetidos pueden activar un bloqueo temporal que devuelve 401 para todas las solicitudes desde esa IP
Cómo corregir un error 401: paso a paso
Para usuarios finales y acceso mediante navegador
Paso 1: Verificar las credenciales con precisión
Comprueba que Bloq Mayús esté desactivado. Confirma que estás usando la contraseña actual — no una guardada antes de un restablecimiento reciente. Si tu cuenta usa autenticación multifactor (MFA), asegúrate de que el código de un solo uso no haya expirado (los códigos TOTP son válidos por 30 segundos de forma predeterminada).
Paso 2: Borrar cookies y caché del navegador
Las cookies de sesión obsoletas son una fuente persistente de bucles 401. En Chrome, navega a chrome://settings/clearBrowserData, establece el intervalo de tiempo en Todo el tiempo, marca Cookies y otros datos del sitio y Imágenes y archivos en caché, luego borra. En Firefox, usa about:preferences#privacy y haz clic en Borrar datos.
Después de borrar, cierra todas las pestañas del navegador del dominio afectado antes de reintentar — algunos navegadores mantienen el estado de sesión en memoria que sobrevive a un borrado de caché si la pestaña permanece abierta.
Paso 3: Probar en una ventana privada/incógnito
Una ventana privada comienza sin cookies, sin datos en caché y con la mayoría de las extensiones desactivadas. Si el 401 desaparece en modo incógnito, el problema es definitivamente del lado del cliente: ya sea una cookie corrupta, una respuesta incorrecta en caché o una extensión del navegador.
Paso 4: Desactivar extensiones selectivamente
Navega a chrome://extensions/ y desactiva todas las extensiones. Recarga la página. Si la autenticación tiene éxito, vuelve a activar las extensiones una a la vez para aislar al culpable. Privacy Badger, uMatrix y ciertas extensiones VPN son infractores frecuentes.
Paso 5: Verificar la URL en busca de errores
Asegúrate de no estar navegando a una ruta que requiera permisos elevados. Una URL como /admin/dashboard devolverá 401 si tu sesión carece de privilegios de administrador — incluso si tu inicio de sesión básico es válido. Verifica la ruta exacta con el propietario del sitio o la documentación.
Paso 6: Restablecer tu contraseña
Si se sospecha que las credenciales han expirado, usa el flujo de Olvidé mi contraseña. Después de restablecer, borra las cookies nuevamente antes de intentar iniciar sesión — la cookie de sesión antigua puede entrar en conflicto con el nuevo estado de credenciales.
Para desarrolladores e integraciones API
Paso 7: Inspeccionar la respuesta HTTP sin procesar
Antes de cambiar cualquier cosa, captura la respuesta exacta del servidor usando curl con salida detallada:
curl -v -H "Authorization: Bearer YOUR_TOKEN" https://api.example.com/endpoint
El indicador -v muestra tanto los encabezados de solicitud enviados como los encabezados de respuesta recibidos, incluido el desafío WWW-Authenticate. Esto te indica con precisión qué esquema espera el servidor.
Paso 8: Validar el estado del token
Para tokens JWT, decodifica el payload sin verificar la firma para inspeccionar las reclamaciones:
echo "YOUR_JWT_PAYLOAD_BASE64" | base64 --decode | python3 -m json.tool
Verifica el campo exp (marca de tiempo Unix). Compáralo con la hora actual:
date +%s
Si exp es menor que la marca de tiempo actual, el token ha expirado. Implementa un flujo de actualización usando el endpoint de token de tu proveedor OAuth antes de que el token alcance su expiración.
Paso 9: Auditar la configuración de autenticación del lado del servidor
En Apache, inspecciona el .htaccess relevante o la configuración del host virtual:
AuthType Basic
AuthName "Restricted Area"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
Confirma que la ruta AuthUserFile existe y es legible por el proceso del servidor web. En NGINX, verifica el bloque de servidor o ubicación relevante:
location /secure/ {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
}
Verifica que el archivo .htpasswd contiene las credenciales hasheadas correctas. Usa htpasswd -v /etc/nginx/.htpasswd username para probar una contraseña contra el hash almacenado.
Paso 10: Verificar los registros del servidor
Los registros del servidor proporcionan la verdad absoluta. En Apache:
tail -f /var/log/apache2/error.log | grep 401
En NGINX:
tail -f /var/log/nginx/error.log | grep 401
Para la autenticación a nivel de aplicación (Node.js, Django, Laravel), verifica la salida de registro propia de la aplicación. La entrada del registro a menudo especificará si el fallo fue un encabezado ausente, un token inválido o un fallo en la búsqueda de base de datos.
Paso 11: Verificar el reenvío de encabezados del proxy inverso
Si tu aplicación está detrás de NGINX actuando como proxy inverso, asegúrate de que el encabezado Authorization se reenvíe a la aplicación upstream:
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Authorization $http_authorization;
proxy_pass_header Authorization;
}
Sin proxy_pass_header Authorization, NGINX elimina el encabezado antes de que llegue a tu servidor de aplicaciones — causando un 401 que parece un error del cliente pero es completamente causado por la infraestructura.
Paso 12: Inspeccionar las reglas del WAF y del firewall
Si estás ejecutando un WAF (ModSecurity, Cloudflare WAF, AWS WAF), verifica si alguna regla está coincidiendo y bloqueando solicitudes que contienen encabezados Authorization. Establece temporalmente el WAF en modo de solo detección y reintenta. Si el 401 desaparece, refina la regla infractora en lugar de deshabilitar el WAF por completo.
Paso 13: Auditar el comportamiento de caché del CDN
Asegúrate de que tu CDN no esté almacenando en caché las respuestas 401. En Cloudflare, establece una regla de caché para omitir la caché en los endpoints autenticados. En AWS CloudFront, configura el comportamiento para reenviar el encabezado Authorization al origen — de forma predeterminada, CloudFront lo elimina, lo que significa que tu origen nunca recibe credenciales y siempre devuelve 401.
Implementación de autenticación robusta: mejores prácticas para propietarios de servidores
Si administras una aplicación web o API — ya sea en un entorno de Hosting VPS o un Servidor Dedicado — estas prácticas evitan que los errores 401 lleguen a tus usuarios en primer lugar.
Gestión del ciclo de vida de los tokens
Nunca emitas tokens sin una expiración definida. Para OAuth 2.0, usa tokens de acceso de corta duración (15–60 minutos) combinados con tokens de actualización de larga duración. Implementa la actualización proactiva de tokens: activa una actualización cuando el token de acceso tenga menos del 20% de su vida útil restante, no después de que ya haya expirado.
Access Token TTL: 15 minutes
Refresh Token TTL: 30 days (rotated on each use)
Refresh trigger: < 3 minutes remaining on access token
Para sistemas basados en JWT, implementa la rotación de claves con un período de gracia. Al rotar el secreto de firma, mantén el secreto anterior válido durante una vida útil adicional del token para que los tokens en vuelo no sean invalidados inmediatamente.
Respuestas de error significativas
Una respuesta 401 siempre debe incluir un cuerpo que ayude al cliente a entender qué hacer a continuación:
{
"error": "invalid_token",
"error_description": "The access token expired at 2024-01-15T10:30:00Z",
"error_uri": "https://api.example.com/docs/authentication"
}
Las respuestas 401 vagas que devuelven solo un código de estado obligan a los desarrolladores a adivinar el motivo del fallo, aumentando drásticamente la carga de soporte.
Registro y alertas de autenticación
Registra cada fallo de autenticación con contexto suficiente: marca de tiempo, dirección IP, agente de usuario, recurso solicitado y motivo del fallo. Configura alertas para patrones anómalos — un pico de 401 desde una sola IP indica ya sea una mala configuración o un ataque de relleno de credenciales. Las plataformas que se ejecutan en Servidores Dedicados tienen acceso completo a los registros a nivel de sistema y pueden implementar pipelines de alertas personalizados sin restricciones.
Transmisión segura de credenciales
Las credenciales de autenticación solo deben viajar a través de conexiones cifradas. Si tu aplicación maneja inicios de sesión de usuarios, un Certificado SSL es innegociable — transmitir credenciales Basic Auth a través de HTTP plano expone nombres de usuario y contraseñas codificados en Base64 en texto claro en la red.
Alcance y rotación de claves API
Emite claves API con el alcance mínimo requerido. Implementa una política de rotación de claves y proporciona a los clientes un mecanismo de rotación que les permita intercambiar claves sin tiempo de inactividad. Revoca las claves comprometidas de inmediato y notifica a los clientes afectados a través de un canal documentado.
Pruebas de flujos de autenticación en CI/CD
Integra pruebas de flujo de autenticación en tu pipeline de despliegue. Un conjunto de pruebas que ejercite credenciales válidas, tokens expirados, encabezados ausentes y claves revocadas detectará regresiones antes de que lleguen a producción. Esto es especialmente crítico después de actualizaciones de dependencias que afectan al middleware de autenticación.
Errores 401 en entornos específicos
WordPress
WordPress devuelve 401 en su API REST (/wp-json/) cuando las contraseñas de aplicación están mal configuradas o cuando un plugin de seguridad (Wordfence, iThemes Security) bloquea el acceso a la API REST. Verifica Settings > Permalinks y vuelve a guardar — esto vacía las reglas de reescritura que pueden romper los endpoints de autenticación. Si administras WordPress en un VPS con cPanel, verifica que mod_rewrite esté habilitado y que .htaccess sea escribible.
cPanel y paneles de control de alojamiento web
Los directorios protegidos con contraseña configurados a través de cPanel usan mod_authn_file de Apache. Si la ruta del archivo .htpasswd en el .htaccess generado es absoluta y la raíz del documento cambia (común después de migraciones de cuentas), la ruta se rompe y cada solicitud devuelve 401. Usa siempre rutas relativas o verifica las rutas absolutas después de cualquier migración. Los entornos que usan Paneles de Control VPS proporcionan acceso directo al sistema de archivos para corregir estas rutas sin abrir un ticket de soporte.
Clientes de correo electrónico y autenticación SMTP
Los servidores SMTP devuelven un equivalente a nivel de protocolo del 401 (535 Authentication credentials invalid) cuando las credenciales del cliente de correo electrónico son incorrectas o cuando el servidor requiere STARTTLS y el cliente intenta autenticación simple. Si estás configurando Hosting de Correo Electrónico, asegúrate de que tu cliente de correo esté configurado con el método de autenticación correcto (PLAIN, LOGIN o CRAM-MD5) y que TLS esté aplicado antes de que se transmitan las credenciales.
Aplicaciones móviles
Las aplicaciones móviles frecuentemente encuentran errores 401 después de que un usuario cambia su contraseña en la web — el token de actualización almacenado de la aplicación es invalidado del lado del servidor pero la aplicación no tiene mecanismo para detectar esto hasta que la siguiente llamada API falla. Implementa un interceptor HTTP global que capture las respuestas 401, intente una actualización del token exactamente una vez, y si la actualización también devuelve 401, redirija al usuario a la pantalla de inicio de sesión con un mensaje claro.
Matriz de decisión: diagnosticar tu error 401
Síntoma
Causa más probable
Primera acción
—
—
—
401 en todas las solicitudes, incluidas las que funcionaban antes
Token expirado o revocado
Inspeccionar la reclamación `exp` del token; activar actualización
401 solo en el navegador, no en curl
Cookie corrupta o interferencia de extensión
Borrar cookies; probar en incógnito
401 solo desde una IP específica
Límite de velocidad del firewall o bloqueo de IP
Verificar registros del WAF; incluir en lista blanca si es legítimo
401 después de migración del servidor
Ruta `.htpasswd` rota
Verificar la ruta `AuthUserFile` en `.htaccess`
401 en preflight OPTIONS
Mala configuración de CORS
Agregar `Authorization` a `Access-Control-Allow-Headers`
401 a pesar de credenciales correctas
Proxy inverso eliminando encabezados
Agregar `proxy_pass_header Authorization` a la configuración de NGINX
401 en recursos almacenados en caché por CDN
CDN sirviendo respuesta 401 en caché
Omitir caché para rutas autenticadas
401 después de actualización de dependencia
Cambio disruptivo en middleware de autenticación
Revisar el registro de cambios; verificar la lógica de análisis de encabezados
Lista de verificación práctica antes de escalar un error 401
Usa esta lista de verificación antes de presentar un ticket de soporte o escalar a tu equipo de infraestructura:
Capturar la respuesta HTTP sin procesar con curl -v y confirmar el valor del encabezado WWW-Authenticateexp contra la hora actual del servidorAuthorization coincide con el esquema que el servidor anunciaAuthorizationAuthorizationPreguntas frecuentes
¿Cuál es la diferencia entre HTTP 401 y HTTP 403?
Un 401 significa que el servidor no puede identificar quién eres — la autenticación está ausente o es inválida. Un 403 significa que el servidor sabe quién eres pero ha decidido que no tienes permiso para acceder al recurso. Corrige un 401 proporcionando o corrigiendo credenciales; corrige un 403 ajustando las reglas de control de acceso o los permisos.
¿Por qué mi API devuelve 401 incluso cuando envío el token correcto?
Las causas más comunes son la expiración del token (verifica la reclamación exp), la desviación del reloj entre el cliente y el servidor (sincroniza NTP), un secreto de firma rotado que invalida los tokens existentes, o el encabezado Authorization siendo eliminado por un proxy inverso o CDN antes de llegar al servidor de origen.
¿Puede un error 401 ser causado por una mala configuración del servidor en lugar de un error del cliente?
Sí. Un archivo .htaccess mal configurado, un bloque auth_basic de NGINX aplicado a la ubicación incorrecta, un proxy inverso que elimina el encabezado Authorization, o una regla del WAF que bloquea solicitudes autenticadas pueden producir respuestas 401 incluso cuando el cliente envía credenciales perfectamente válidas.
¿Cómo puedo prevenir los errores 401 causados por la expiración del token en una aplicación en producción?
Implementa la actualización proactiva del token — monitorea la vida útil restante del token y actualízalo antes de que expire, no después. Para OAuth 2.0, usa el endpoint del token de actualización para obtener un nuevo token de acceso cuando el actual tenga menos del 20% de su TTL restante. Agrega un interceptor de respuesta HTTP global que maneje automáticamente las respuestas 401 intentando una única actualización del token antes de reintentar la solicitud original.
¿Borrar las cookies siempre soluciona un error 401 en un navegador?
Solo si la causa raíz es una cookie de sesión corrupta u obsoleta. Si el 401 es causado por una mala configuración del servidor, una clave API expirada o un bloqueo del firewall, borrar las cookies no tendrá ningún efecto. Usa una ventana incógnito como paso de diagnóstico — si el 401 persiste en incógnito, el problema es del lado del servidor o de la red, no del navegador.
