practices example best http rest restful-authentication

http - example - rest authentication



HTTP 401 no autorizado o 403 prohibido para un usuario "deshabilitado"? (3)

Un servicio de autenticación permite desactivar las cuentas de usuario (una especie de eliminación suave).

Si el servidor recibe una solicitud de autenticación para un usuario deshabilitado que de otro modo sería válido, ¿debería el servidor devolver 401 o 403? Con cualquiera de los códigos de estado, devolvería un mensaje que indicaba que la cuenta había sido deshabilitada.

Para una referencia rápida, citas relevantes de la especificación HTTP / 1.1 (el énfasis es mío):

401 no autorizado

La solicitud requiere autenticación de usuario. La respuesta DEBE incluir un campo de encabezado WWW-Authenticate (sección 14.47) que contenga un desafío aplicable al recurso solicitado. El cliente PUEDE repetir la solicitud con un campo de encabezado de Autorización adecuado (sección 14.8). Si la solicitud ya incluía credenciales de autorización , entonces la respuesta 401 indica que se ha rechazado la autorización para esas credenciales . Si la respuesta 401 contiene el mismo desafío que la respuesta anterior, y el agente de usuario ya ha intentado la autenticación al menos una vez, entonces se DEBE presentar al usuario la entidad que recibió la respuesta , ya que esa entidad podría incluir información de diagnóstico relevante. La autenticación de acceso HTTP se explica en "Autenticación HTTP: Autenticación de acceso básica y resumida" [43].

403 Prohibido

El servidor entendió la solicitud, pero se niega a cumplirla. La autorización no ayudará y la solicitud NO DEBE repetirse . Si el método de solicitud no era HEAD y el servidor desea hacer público el motivo por el cual la solicitud no se ha cumplido, DEBE describir el motivo de la denegación en la entidad . Si el servidor no desea que esta información esté disponible para el cliente, se puede usar el código de estado 404 (No encontrado) en su lugar.


Basado en un correo electrónico escrito por Roy T. Fielding , aparentemente hay un error en la especificación HTTP actual.

La forma en que se pretende leer la especificación es la siguiente (utilizando las citas del correo electrónico anterior):

401 "No autenticado" :

No puedes hacer esto porque no te has autenticado.

403 "no autorizado" :

El agente de usuario envió credenciales válidas pero no tiene acceso

Entonces, en el caso de un usuario discapacitado, 403 es la respuesta correcta (y 404 también es una opción).


Técnicamente, ambos son correctos, realmente se reduce a cuánto quieres revelar.

devolver un 401 le dice a la persona que llama que la cuenta no es válida, lo cual es correcto, pero si se va a volver a llamar a su API para registrar un usuario con las mismas credenciales, esa llamada también fallará. lo que podría no ser de mucha utilidad para la persona que llama.

por lo tanto, realmente depende de cómo se usará su API y de quién / cuál es el público objetivo.


Tengo dos respuestas diferentes sobre qué devolver en este caso.

Elección semántica - 401 no autorizada. En este caso, su cliente ha proporcionado credenciales y la solicitud ha sido rechazada en función de las credenciales específicas. Si el cliente intentara nuevamente con un conjunto diferente de credenciales, o si la cuenta se volviera a habilitar en el futuro, la misma solicitud podría tener éxito.

Elección de seguridad - 404 No encontrado. Muchos servicios simplemente devolverán un 404 por cualquier falla, para evitar la fuga de información. Github viene a mi mente de inmediato.

De la información general de la API , en los documentos del desarrollador de github:

Las solicitudes no autenticadas devolverán 404 para evitar cualquier tipo de fuga de información privada.

Para algo que estaba implementando como un servicio público, probablemente usaría 404 para evitar dar pistas a un atacante sobre sus intentos de obtener credenciales. Si fuera solo para consumo interno o en pruebas, probablemente devolvería 401.