standard restful possible codigos codes code http rest http-status-codes

http - restful - rest api



¿Corregir el código de estado HTTP para el formulario de inicio de sesión? (4)

Estoy implementando la autenticación para una aplicación y estoy usando un sistema conectable con "métodos de autenticación". Esto me permite implementar tanto HTTP Basic como la autenticación basada en HTML.

Con HTTP Basic / Digest auth, el servidor envía un encabezado de respuesta 401 Unauthorized . Sin embargo, según el RFC HTTP / 1.1 :

La respuesta DEBE incluir un campo de encabezado WWW-Authenticate (sección 14.47) que contenga un desafío aplicable al recurso solicitado.

Como no conozco ningún encabezado WWW-Authenticate "html", el envío de un 401 con un formulario de inicio de sesión HTML parece inapropiado. ¿Hay alguna alternativa a esto? Quiero diseñar mi aplicación de forma REST.

¿Cuál es el código de estado HTTP correcto (y los encabezados) para un formulario de inicio de sesión basado en HTML? ¿Y cuál es el código correcto cuando falla el inicio de sesión?

Nota : No estoy interesado en Autenticación Digest.


¿Qué hay de este?

Cuando solicita el formulario de inicio de sesión que es una página pública, obtiene lo que desea, por lo que es un código de estado 200:

GET /login -> 200

Al solicitar una página que necesita una autenticación de nivel http que no inició (http básico, certificado ssl, etc.), la aplicación debe informarle al navegador que necesita iniciar esta autenticación por usted:

GET /secured -> 401 with WWW-Authenticate header

Cuando la autenticación es una sesión basada en cookies, ya tiene una cookie (si no es así, obtendrá una con el encabezado set-cookie cuando solicite la página), pero esta cookie no indica que tiene permiso para acceder. el /secured uri. Entonces, si intentas acceder a este uri, deberías obtener un estado "403 prohibido". Entonces, la acción de "inicio de sesión" no es más que cambiar el estado de la aplicación con una solicitud POST para que la aplicación otorgue acceso para esta cookie, así que ...

Inicia sesión con malas credenciales:

GET /secured -> 403 with HTML login form (with action="/login") POST /login -> 403 with HTML login form, displaying errors

Inicie sesión con buenas credenciales pero no con suficientes permisos:

GET /secured -> 403 with HTML login form (with action="/login") POST /login -> 403 with HTML page saying "I know you are John, but you can''t get this page"

Inicie sesión con buenas credenciales y permisos suficientes:

GET /secured -> 403 with HTML login form (with action="/login") POST /login -> 302 (temporary redirection to /secured) GET /secured -> 200


@ 2016-02-17 Actualizado

El estado http del login form debe ser 200 OK .

El error estado de http mejor uso 401 Unauthorized . (El nombre puede estar confundido, 401 es sobre autenticación. RFC7235

3.1. 401 no autorizado

El código de estado 401 (no autorizado) indica que la solicitud no se ha aplicado porque carece de credenciales de autenticación válidas para el recurso de destino. El servidor que genera una respuesta 401 DEBE enviar un campo de encabezado WWW-Authenticate (Sección 4.1) que contenga al menos un desafío aplicable al recurso de destino.

Si la solicitud incluía credenciales de autenticación, la respuesta 401 indica que se ha rechazado la autorización para esas credenciales. El agente de usuario PUEDE repetir la solicitud con un campo de encabezado de Autorización nuevo o reemplazado (Sección 4.2). 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 el agente de usuario DEBERÍA presentar la representación adjunta al usuario, ya que generalmente contiene información de diagnóstico relevante.

Si desea manejarlo si no tiene permiso, puede necesitar 403 Forbidden [RFC7231]

HTTP 422 se utiliza para WebDAV, pero el significado puede ajustarse a las necesidades. (No sugerido para la mayoría de los casos)

Para obtener más información, consulte el comentario de Cássio Mazzochi Molin continuación.

@ 2016-02-12 Actualizado (esta es la referencia a la respuesta aceptada)

El estado de http del login form debe ser 200 .

El estado de error http mejor uso 400 .

HTTP 422 se utiliza para WebDAV, pero el significado puede ajustarse a las necesidades. HTTP 401 es para autorización. Y no es adecuado para la autenticación.

@ 2016-02-12 Original

HTTP 422 es ahora una mejor opción que no sea 400 / 401. HTTP 422 es una opción alternativa.

Porque significa que el servidor entiende los datos pero no es correcto para parte de los datos. Es decir, puede mostrar al cliente que el nombre de usuario / contraseña es incorrecto.

11.2. 422 Entidad no procesable

El código de estado 422 (entidad no procesable) significa que el servidor entiende el tipo de contenido de la entidad de solicitud (por lo tanto, un código de estado 415 (tipo de medio no admitido) es inadecuado), y la sintaxis de la entidad de solicitud es correcta (por lo tanto, un código de estado 400 (solicitud incorrecta) ) el código de estado es inapropiado) pero no pudo procesar las instrucciones contenidas. Por ejemplo, esta condición de error puede ocurrir si un cuerpo de solicitud XML contiene instrucciones XML bien formadas (es decir, sintácticamente correctas), pero semánticamente erróneas.

RFC4918


Esta es una pregunta difícil, en gran parte porque los clientes HTTP mejor establecidos que utilizan las personas son los navegadores. Según el RFC, el encabezado WWW-Authenticate puede contener cualquier cosa. La autenticación básica y la digestión son solo dos ejemplos de otros mecanismos de desafío / respuesta estandarizados. Simplemente puede especificar un desafío como html-form id=foo y devolver el 401 junto con un formulario HTML. Además, recuerde de la especificación que se pueden especificar múltiples desafíos dentro del mismo encabezado WWW-Authenticate , pero no tengo experiencia probando extensivamente los navegadores con diferentes esquemas.


Para HTML creo que deberías responder con un 400.

Esto también puede ser cierto para las solicitudes que no son HTML, ya que 401 es, según tengo entendido, más diseñado para responder a una solicitud de contenido que requiere autenticación, no para responder a una solicitud de autenticación.

HTML no siempre permite el uso puro de las API REST, por lo que está bien cortar esquinas aquí y allá, pero quizás haya una mejor manera de no estar viendo en este caso particular.