HTTP 401: ¿cuál es un valor de encabezado WWW-Authenticate apropiado?

109

La aplicación en la que estoy trabajando en este momento tiene un valor de tiempo de espera de sesión. Si el usuario no ha interactuado durante más tiempo que este valor, en la siguiente página que intenten cargar, se le pedirá que inicie sesión.

Todas las solicitudes realizadas se enrutan a través de este mecanismo, que incluye llamadas AJAX. Originalmente, estábamos enviando un encabezado 200 con la página de inicio de sesión, que presenta algunos problemas con AJAX, ya que el código se ejecuta si se envía una respuesta 200, y la mayoría de los datos enviados desde estas llamadas RPC son JSON o JavaScript sin procesar que se evalúa (no preguntar: |).

He sugerido que un 401 es mejor, ya que nuestro analizador JSON no intentará consumir una página de inicio de sesión HTML .. :)

Cuando la lectura de la especificación , sin embargo, me di cuenta de que el WWW-Authenticatecampo también debe ser enviado.

¿Cuál es un buen valor para este campo? SeráApplication Login suficiente?

Will Morgan
fuente

Respuestas:

67

Al indicar la autenticación básica HTTP devolvemos algo como:

WWW-Authenticate: Basic realm="myRealm"

Mientras Basic es el esquema y el resto depende mucho de ese esquema. En este caso, realm solo proporciona al navegador un literal que se puede mostrar al usuario cuando se le solicita la identificación de usuario y la contraseña.

Sin embargo, obviamente no está usando Basic, ya que no tiene sentido que la sesión expire cuando se usa Basic Auth. Supongo que está utilizando alguna forma de autenticación basada en formularios.

Por lo que recuerdo, Windows Challenge Response usa un esquema diferente y diferentes argumentos.

El truco es que depende del navegador determinar qué esquemas admite y cómo responde a ellos.

Mi intuición si está utilizando la autenticación basada en formularios es permanecer en la página de inicio de sesión 200 + pero agregar un encabezado personalizado que el navegador ignorará pero que su AJAX puede identificar.

Para una experiencia de usuario + AJAX realmente buena, obtenga el script para aferrarse a la solicitud AJAX que encontró que la sesión caducó, inicie una solicitud de reingreso a través de una ventana emergente y, en caso de éxito, vuelva a enviar la solicitud AJAX original y continúe con normalidad.

Evite el truco que hace que el script llegue al sitio cada 5 minutos para mantener viva la sesión porque eso acaba con el punto de vencimiento de la sesión.

La otra alternativa es grabar la solicitud AJAX, pero esa es una mala experiencia de usuario.

Swanny
fuente
2
Gracias amigo, ahora estoy usando un 403 en su lugar, ya que no es una redirección y literalmente incluye el formulario de inicio de sesión en lugar de la página original. También coincide mejor con la especificación W3. Sin embargo, gracias por la información.
Will Morgan
2
Vea esta respuesta sobre cómo aún puede usar HTTP 401: stackoverflow.com/questions/928874/…
lanoxx
Sí, solo ponga cualquier cosa en el encabezado WWW-Authenticate, supongo. Otra respuesta similar es stackoverflow.com/a/1088127/689161 O simplemente viola las especificaciones y no se moleste en enviar el encabezado (al menos algunos sitios hacen esto); 401 sigue siendo más apropiado que 403.
gengkev
No estoy seguro de si "simplemente pondría algo" en el encabezado WWW-Authenticate porque no puedo estar seguro de si la solicitud es manejada por mi ajax o el navegador. Más allá del título de esta pregunta, dado el detalle que sugiere la autenticación basada en formularios, no enviaría ningún encabezado WWW-Authenticate. Esto se debe a que no le estoy pidiendo al navegador que participe en el desafío de autenticación / credencial. Solo quiero que muestre un formulario que resulta ser un formulario de inicio de sesión, pero con algo que el ajax puede usar para identificarlo es un formulario de inicio de sesión para que pueda manejarlo de manera diferente a la anterior.
Swanny
Debe crear un esquema de autenticación para usar con el encabezado. Entonces el navegador no se involucrará porque no entenderá el esquema. Algunos clientes se molestan o confunden si no incluye el encabezado.
KayEss
-7

Cuando la sesión de usuario se agota, envío un código de estado HTTP 204. Tenga en cuenta que el estado HTTP 204 no tiene contenido. En el lado del cliente hago esto:

xhr.send(null);
if (xhr.status == 204) 
    Reload();
else 
    dropdown.innerHTML = xhr.responseText;

Aquí está la función Reload ():

function Reload() {
    var oForm = document.createElement("form");
    document.body.appendChild(oForm);
    oForm.submit();
    }
Pitufo
fuente
6
¿Por qué estás usando HTTP 204? developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
Will Morgan