401

Unauthorized

Cuando el servidor dice "¿quién eres tú y por qué debería dejarte pasar?". Autenticación, tokens y credenciales.

🚫 Client Error

🔐 ¿Qué narices es esto?

El código 401 Unauthorized es el "papers, please" de HTTP. Es la respuesta del servidor cuando intentas acceder a algo pero no has demostrado quién eres, o tus credenciales están mal. Es como intentar entrar a un club exclusivo sin estar en la lista, o peor aún, con un DNI falsificado que ni siquiera está bien hecho.

A pesar del nombre "Unauthorized", realmente debería llamarse "Unauthenticated". No es que no tengas permisos (eso sería 403), sino que no has probado tu identidad correctamente. Es el equivalente digital de que el portero del antro te diga "no sé quién eres, así que no pasas".

El 401 aparece típicamente cuando:

  • No incluyes un token de autenticación en la petición
  • El token está mal formado o es inválido
  • El token ha expirado (ya no es válido)
  • Las credenciales de usuario/contraseña son incorrectas
  • La sesión ha caducado o fue invalidada

🎯 Dato curioso

El 401 DEBE incluir un header WWW-Authenticate que le diga al cliente cómo autenticarse. Si no lo incluye, técnicamente está mal implementado. Es como rechazar a alguien sin decirle qué documentos necesita.

Lo tricky del 401 es que puede aparecer incluso cuando piensas que estás autenticado. Tu token puede haberse expirado justo antes de la petición, o el servidor puede haber reiniciado y perdido tu sesión. Es como llegar a una cita y que te digan "perdón, pero ya no te conozco". Por eso es crucial implementar refresh de tokens y manejo graceful de re-autenticación.

🔧 Cómo manejar esto

🖥️ Para servidores (generar 401s útiles)

  1. Incluye WWW-Authenticate header: Especifica el método de auth requerido.
  2. Responde rápido: No hagas que el cliente espere para saber que falló.
  3. Mensaje claro: "Token expirado" vs "Credenciales inválidas".
  4. No expongas info sensible: No digas si el usuario existe o no.
  5. Logea intentos: Para detectar ataques de fuerza bruta.

📱 Para desarrolladores frontend

  1. Redirige al login: Automáticamente cuando recibas 401.
  2. Implementa refresh tokens: Intenta renovar antes de pedir login.
  3. Intercepta todas las requests: Maneja 401s globalmente.
  4. Limpia estado local: Borra tokens inválidos del storage.
  5. UX amigable: "Sesión expirada, por favor inicia sesión".

Problemas típicos con 401

  • Falta el header WWW-Authenticate:
    Sin este header, el cliente no sabe cómo autenticarse. Es obligatorio según el estándar.
  • Tokens expirados o inválidos:
    Si el servidor no diferencia entre token expirado y credenciales incorrectas, la UX se resiente y el usuario no sabe qué hacer.
  • Redirección infinita al login:
    Si el frontend no controla bien los 401, puede entrar en bucle redirigiendo al login una y otra vez.
  • Exposición de información sensible:
    No digas si el usuario existe o no. Solo responde "credenciales inválidas" para evitar filtraciones.

🚀 Respuesta rápida para emergencias

🔥 Si todos los usuarios ven 401:
1. Comprueba expiración de tokens y relojes del servidor.
2. Revisa si el header WWW-Authenticate está presente.
3. Verifica que la base de datos de usuarios esté accesible.
4. Mira los logs de autenticación.
⚡ Si el login nunca funciona:
1. Asegúrate de que el endpoint de login responde 200 al éxito.
2. Comprueba que el frontend guarda y envía el token correctamente.
3. Testea con herramientas como Postman o curl.
🎯 Truco de seguridad:
No reveles si el usuario existe o no. Siempre responde con mensaje genérico para evitar ataques de enumeración.