javascript - example - set header basic authentication
http autenticación básica "cerrar sesión" (7)
Acabo de terminar una implementación que me funcionó bien: en el servidor evalúo la sesión, el nombre de usuario y la contraseña, así que hago un seguimiento de esa información, el algoritmo de inicio de sesión es el siguiente:
1.Verifique si el usuario y la contraseña no están vacíos, de lo contrario, devuelva 401.
2.Verifique si hemos registrado la sesión en nuestra lista de usuarios registrados, si no, verifique si el usuario y la contraseña son válidos y, en caso afirmativo, guarde la identificación de la sesión en nuestra lista, luego devuelva 401. Explicaré este paso: si el La identificación de la sesión es diferente. Ocurrió una de tres cosas: a) El usuario está abriendo otra ventana. b) La sesión del usuario ha finalizado, es decir, la sesión del usuario ha finalizado. c) La sesión expiró debido a inactividad. Pero queremos guardar la sesión siempre y cuando las credenciales del usuario sean válidas, pero devuelven un 401 para pedir una vez la contraseña, si no guardamos la sesión, entonces el usuario nunca podría iniciar sesión porque no tenemos la nueva identificación de la sesión en nuestra lista.
3.Compruebe si las credenciales del usuario son correctas, de ser así, guarde la información de la sesión y continúe publicando páginas, de lo contrario, devuelva 401.
Por lo tanto, lo único que tengo que cerrar la sesión de un usuario es cerrar la sesión en el servidor cuando el usuario solicita la página de cierre de sesión y el navegador web muestra nuevamente el cuadro de diálogo de inicio de sesión.
Mientras escribo esto, pienso que debe haber un paso donde el programa compruebe si el usuario ya está conectado para evitar la suplantación, tal vez pueda guardar más de una identificación de sesión por usuario para permitir varias sesiones, bueno, me gustaría tus comentarios al respecto
Espero que entiendas la idea y comentes si ves alguna falla de seguridad;)
Las credenciales de autenticación básica HTTP se almacenan hasta que se cierra el navegador, pero ¿hay alguna manera de eliminar las credenciales antes de que se cierre el navegador?
Leí sobre un truco con el código de estado HTTP 401 , pero parece que no funciona correctamente (ver comentario para responder). Tal vez el mecanismo que Trac usa es la solución .
¿Se pueden eliminar las credenciales con JavaScript? ¿O con una combinación de JavaScript y el truco de estado 401?
Ampliando la respuesta de enero y actualizando la respuesta de owyongsk:
Aquí hay un ejemplo de código jquery java-script para hacer que el navegador esencialmente envíe una solicitud de inicio de sesión falsa a la página que intenta proteger, que en todos los navegadores probados hizo que se eliminen las credenciales en caché, luego redirecciona al usuario a un sitio no protegido página.
La alerta () cuando algo va mal probablemente debería cambiarse a otra cosa.
//Submits an invalid authentication header, causing the user to be ''logged out''
function logout() {
$.ajax({
type: "GET",
url: "PUT_YOUR_PROTECTED_URL_HERE",
dataType: ''json'',
async: true,
username: "some_username_that_doesn''t_exist",
password: "any_stupid_password",
data: ''{ "comment" }''
})
//In our case, we WANT to get access denied, so a success would be a failure.
.done(function(){
alert(''Error!'')
})
//Likewise, a failure *usually* means we succeeded.
//set window.location to redirect the user to wherever you want them to go
.fail(function(){
window.location = "/";
});
}
Luego fue tan fácil como hacer que el enlace de cierre de sesión llame a la función de cierre de sesión (), y pareció funcionar sin problemas para el usuario, aunque técnicamente sigue siendo un trabajo de hackeo.
Lo que funcionó para mí en Chrome (Versión 66) es enviar una solicitud de Ajax a una URL que devuelve 401. De esta forma, la memoria caché de autenticación básica parece borrarse.
var xhttp = new XMLHttpRequest();
xhttp.open("GET", "/url_that_returns_401", true);
xhttp.send();
Puede eliminar credenciales con JavaScript:
$("#logout").click(function(){
try {
document.execCommand("ClearAuthenticationCache");
window.location.href(''/logout.html''); // page with logout message somewhere in not protected directory
} catch (exception) {}
});
Este código solo funciona en IE. Esta es la razón por la cual el bloque try / catch se agrega allí. Además, por la misma razón, el enlace de cierre de sesión debe mostrar solo para usuarios de IE:
<!--[if IE]>
<div id="logout">[Logout]</div>
<![endif]-->
Y para otros usuarios, mi sugerencia es algo así como:
<div id="logout2" onclick="alert(''Please close your browser window to logout'')">[Logout]</div>
Puedes probar un truco que está funcionando en este momento con los últimos Chrome y Firefox. Cree una página "/ logout" en su servidor que solo acepte una determinada credencial, como nombre de usuario: falso, contraseña: falso. Luego, utilizando esta solicitud de AJAX a continuación, puede enviar al usuario a esa página.
$("#logout").click(function(e){
e.preventDefault();
var request = new XMLHttpRequest();
request.open("get", "/logout", false, "false", "false");
request.send();
window.location.replace("WHEREVER YOU WANT YOUR LOGGED OUT USER TO GO");
});
Lo que sucede es que el nombre de usuario y la contraseña falsos se almacenan en caché de la XMLHttpRequest válida en lugar de las credenciales del usuario actual, y cuando un usuario intenta iniciar sesión en cualquier página, utiliza las credenciales falsas almacenadas en caché, sin autenticar, se lo preguntará al usuario para entrar en otro. ¡Espero que esto ayude!
Si tiene control sobre el código del servidor, puede crear una función de "cierre de sesión" que responda "401 no autorizado" independientemente de las credenciales proporcionadas. Esta falla obliga a los navegadores a eliminar las credenciales guardadas.
Acabo de probar esto con Chrome 34, IE 11, Firefox 25, utilizando el servidor Express.js y la autenticación HTTP básica.
Actualización : esta solución ya no parece funcionar en muchos navegadores. El comentario de Kaitsu:
Esta solución de envío de credenciales falsas para hacer que el navegador olvide las credenciales autenticadas correctas no funciona en Chrome (16) e IE (9). Funciona en Firefox (9).
De hecho, puede implementar una solución mediante el envío de credenciales falsas al servicio. Esto funciona en los navegadores al enviar otro nombre de usuario (¿inexistente?) Sin una contraseña. El buscador pierde la información sobre las credenciales autenticadas.
Ejemplo:
https://www.example.com/ => Inicie sesión con autenticación básica como "usuario1"
Ahora abierto
Has cerrado la sesión. ;)
Saludos
Ps: Pero prueba esto con todos los navegadores necesarios antes de confiar en la información dada.