tutorial powerapps español ejemplos http authentication basic-authentication http-basic-authentication

http - powerapps - ¿Cómo cerrar la sesión del usuario del sitio web utilizando la autenticación BASIC?



powerapps ejemplos (18)

Actualicé la solución de mthoring para las versiones modernas de Chrome:

function logout(secUrl, redirUrl) { if (bowser.msie) { document.execCommand(''ClearAuthenticationCache'', ''false''); } else if (bowser.gecko) { $.ajax({ async: false, url: secUrl, type: ''GET'', username: ''logout'' }); } else if (bowser.webkit || bowser.chrome) { var xmlhttp = new XMLHttpRequest(); xmlhttp.open(/"GET/", secUrl, true); xmlhttp.setRequestHeader(/"Authorization/", /"Basic logout/");/ xmlhttp.send(); } else { // http://stackoverflow.com/questions/5957822/how-to-clear-basic-authentication-details-in-chrome redirUrl = url.replace(''http://'', ''http://'' + new Date().getTime() + ''@''); } setTimeout(function () { window.location.href = redirUrl; }, 200); }

¿Es posible cerrar la sesión del usuario desde un sitio web si está usando la autenticación básica?

Matar a la sesión no es suficiente, ya que, una vez que el usuario se autentica, cada solicitud contiene información de inicio de sesión, por lo que el usuario inicia sesión automáticamente la próxima vez que acceda al sitio con las mismas credenciales.

La única solución hasta ahora es cerrar el navegador, pero eso no es aceptable desde el punto de vista de la usabilidad.


Aquí hay un ejemplo de Javascript muy simple usando jQuery:

function logout(to_url) { var out = window.location.href.replace(/://///, ''://log:out@''); jQuery.get(out).error(function() { window.location = to_url; }); }

Este usuario de sesión se desconecta sin mostrarle nuevamente el cuadro de inicio de sesión del navegador, luego lo redirige a una página de sesión


En realidad es bastante simple.

Simplemente visite lo siguiente en su navegador y use las credenciales incorrectas: http: // username: [email protected]

Eso debería "desconectarte".


Este JavaScript debe estar funcionando para todos los navegadores de la última versión:

//Detect Browser var isOpera = !!window.opera || navigator.userAgent.indexOf('' OPR/'') >= 0; // Opera 8.0+ (UA detection to detect Blink/v8-powered Opera) var isFirefox = typeof InstallTrigger !== ''undefined''; // Firefox 1.0+ var isSafari = Object.prototype.toString.call(window.HTMLElement).indexOf(''Constructor'') > 0; // At least Safari 3+: "[object HTMLElementConstructor]" var isChrome = !!window.chrome && !isOpera; // Chrome 1+ var isIE = /*@cc_on!@*/false || !!document.documentMode; // At least IE6 var Host = window.location.host; //Clear Basic Realm Authentication if(isIE){ //IE document.execCommand("ClearAuthenticationCache"); window.location = ''/''; } else if(isSafari) {//Safari. but this works mostly on all browser except chrome (function(safeLocation){ var outcome, u, m = "You should be logged out now."; // IE has a simple solution for it - API: try { outcome = document.execCommand("ClearAuthenticationCache") }catch(e){} // Other browsers need a larger solution - AJAX call with special user name - ''logout''. if (!outcome) { // Let''s create an xmlhttp object outcome = (function(x){ if (x) { // the reason we use "random" value for password is // that browsers cache requests. changing // password effectively behaves like cache-busing. x.open("HEAD", safeLocation || location.href, true, "logout", (new Date()).getTime().toString()) x.send(""); // x.abort() return 1 // this is **speculative** "We are done." } else { return } })(window.XMLHttpRequest ? new window.XMLHttpRequest() : ( window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : u )) } if (!outcome) { m = "Your browser is too old or too weird to support log out functionality. Close all windows and restart the browser." } alert(m); window.location = ''/''; // return !!outcome })(/*if present URI does not return 200 OK for GET, set some other 200 OK location here*/) } else{ //Firefox,Chrome window.location = ''http://log:out@''+Host+''/''; }


Esto está funcionando para IE / Netscape / Chrome:

function ClearAuthentication(LogOffPage) { var IsInternetExplorer = false; try { var agt=navigator.userAgent.toLowerCase(); if (agt.indexOf("msie") != -1) { IsInternetExplorer = true; } } catch(e) { IsInternetExplorer = false; }; if (IsInternetExplorer) { // Logoff Internet Explorer document.execCommand("ClearAuthenticationCache"); window.location = LogOffPage; } else { // Logoff every other browsers $.ajax({ username: ''unknown'', password: ''WrongPassword'', url: ''./cgi-bin/PrimoCgi'', type: ''GET'', beforeSend: function(xhr) { xhr.setRequestHeader("Authorization", "Basic AAAAAAAAAAAAAAAAAAA="); }, error: function(err) { window.location = LogOffPage; } }); } } $(document).ready(function () { $(''#Btn1'').click(function () { // Call Clear Authentication ClearAuthentication("force_logout.html"); }); });


Esto no es directamente posible con la autenticación básica.

No hay ningún mecanismo en la especificación HTTP para que el servidor le indique al navegador que deje de enviar las credenciales que el usuario ya presentó.

Hay "hacks" (ver otras respuestas) que generalmente involucran el uso de XMLHttpRequest para enviar una solicitud HTTP con credenciales incorrectas para sobrescribir las que se proporcionaron originalmente.


Haga que el usuario haga clic en un enlace a https://log:[email protected]/ . Eso sobrescribirá las credenciales existentes con las inválidas; desconectándolos.


La autenticación básica no fue diseñada para administrar el cierre de sesión. Puedes hacerlo, pero no de forma completamente automática.

Lo que debe hacer es hacer que el usuario haga clic en un enlace de cierre de sesión y envíe un ''401 no autorizado'' en respuesta, utilizando el mismo dominio y en el mismo nivel de carpeta de URL que el 401 normal que envía para solicitar un inicio de sesión.

Deben dirigirse a ingresar credenciales incorrectas a continuación, por ejemplo. un nombre de usuario y contraseña en blanco, y en respuesta usted envía una página de "Ha cerrado la sesión con éxito". Las credenciales erróneas / en blanco sobrescribirán las credenciales correctas anteriores.

En resumen, la secuencia de comandos de cierre de sesión invierte la lógica de la secuencia de comandos de inicio de sesión, y solo devuelve la página de éxito si el usuario no está pasando las credenciales correctas.

La pregunta es si el cuadro de contraseña "No ingrese su contraseña", que es algo curioso, cumplirá con la aceptación del usuario. Los administradores de contraseñas que intentan completar automáticamente la contraseña también pueden interponerse aquí.

Edite para agregar en respuesta al comentario: volver a iniciar sesión es un problema ligeramente diferente (a menos que necesite un cierre de sesión / inicio de sesión de dos pasos, obviamente). Debe rechazar (401) el primer intento de acceso al enlace de reinicio de sesión, y aceptar el segundo (que presumiblemente tiene un nombre de usuario / contraseña diferente). Hay algunas maneras en que puedes hacer esto. Uno sería incluir el nombre de usuario actual en el enlace de cierre de sesión (por ejemplo, / relogin? Nombre de usuario) y rechazar cuando las credenciales coincidan con el nombre de usuario.


Puedes hacerlo enteramente en JavaScript:

IE tiene (por un largo tiempo) API estándar para borrar la caché de autenticación básica:

document.execCommand("ClearAuthenticationCache")

Debería devolver la verdad cuando funcione. Devuelve falso, indefinido o explota en otros navegadores.

Los nuevos navegadores (a partir de diciembre de 2012: Chrome, FireFox, Safari) tienen un comportamiento "mágico". Si ven una solicitud de autenticación básica exitosa con cualquier otro nombre de usuario falso (digamos logout ), borran la caché de credenciales y posiblemente la configuran para ese nuevo nombre de usuario falso, lo que debe asegurarse de que no sea un nombre de usuario válido para ver el contenido.

Ejemplo básico de eso es:

var p = window.location.protocol + ''//'' // current location must return 200 OK for this GET window.location = window.location.href.replace(p, p + ''logout:password@'')

Una forma "asíncrona" de hacer lo anterior es hacer una llamada AJAX utilizando el nombre de usuario de logout . Ejemplo:

(function(safeLocation){ var outcome, u, m = "You should be logged out now."; // IE has a simple solution for it - API: try { outcome = document.execCommand("ClearAuthenticationCache") }catch(e){} // Other browsers need a larger solution - AJAX call with special user name - ''logout''. if (!outcome) { // Let''s create an xmlhttp object outcome = (function(x){ if (x) { // the reason we use "random" value for password is // that browsers cache requests. changing // password effectively behaves like cache-busing. x.open("HEAD", safeLocation || location.href, true, "logout", (new Date()).getTime().toString()) x.send("") // x.abort() return 1 // this is **speculative** "We are done." } else { return } })(window.XMLHttpRequest ? new window.XMLHttpRequest() : ( window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : u )) } if (!outcome) { m = "Your browser is too old or too weird to support log out functionality. Close all windows and restart the browser." } alert(m) // return !!outcome })(/*if present URI does not return 200 OK for GET, set some other 200 OK location here*/)

También puedes convertirlo en un bookmarklet:

javascript:(function(c){var a,b="You should be logged out now.";try{a=document.execCommand("ClearAuthenticationCache")}catch(d){}a||((a=window.XMLHttpRequest?new window.XMLHttpRequest:window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):void 0)?(a.open("HEAD",c||location.href,!0,"logout",(new Date).getTime().toString()),a.send(""),a=1):a=void 0);a||(b="Your browser is too old or too weird to support log out functionality. Close all windows and restart the browser.");alert(b)})(/*pass safeLocation here if you need*/);


Se confirma que la siguiente función funciona para Firefox 40, Chrome 44, Opera 31 e IE 11.
Bowser se utiliza para la detección del navegador, jQuery también se utiliza.

- secUrl es la url a un área protegida por contraseña desde la cual cerrar sesión.
- redirUrl es la url a un área no protegida por contraseña (página de cierre de sesión exitosa).
- Es posible que desee aumentar el temporizador de redireccionamiento (actualmente 200 ms).

function logout(secUrl, redirUrl) { if (bowser.msie) { document.execCommand(''ClearAuthenticationCache'', ''false''); } else if (bowser.gecko) { $.ajax({ async: false, url: secUrl, type: ''GET'', username: ''logout'' }); } else if (bowser.webkit) { var xmlhttp = new XMLHttpRequest(); xmlhttp.open("GET", secUrl, true); xmlhttp.setRequestHeader("Authorization", "Basic logout"); xmlhttp.send(); } else { alert("Logging out automatically is unsupported for " + bowser.name + "/nYou must close the browser to log out."); } setTimeout(function () { window.location.href = redirUrl; }, 200); }


Según lo que leí anteriormente, obtuve una solución simple que funciona en cualquier navegador:

1) en la página de cierre de sesión, llama a un ajax a su inicio de sesión. Su inicio de sesión debe aceptar el usuario de cierre de sesión. Una vez que el back-end acepta, el navegador borra al usuario actual y asume el usuario de "cierre de sesión".

$.ajax({ async: false, url: ''http://your_login_backend'', type: ''GET'', username: ''logout'' }); setTimeout(function () { window.location.href = ''http://normal_index''; }, 200);

2) Ahora, cuando el usuario regresó al archivo de índice normal, intentará ingresar automáticamente en el sistema con el "cierre de sesión" del usuario, en esta segunda vez debe bloquearlo mediante la respuesta con 401 para invocar el diálogo de inicio de sesión / contraseña.

3) Hay muchas maneras de hacerlo, he creado dos back-end de inicio de sesión, uno que acepta el usuario de cierre de sesión y otro que no. Mi página de inicio de sesión normal usa la que no acepta, mi página de cierre de sesión usa la que la acepta.


Todo lo que necesita es redirigir al usuario en alguna URL de cierre de sesión y devolverle 401 Unauthorized error 401 Unauthorized . En la página de error (que debe ser accesible sin autorización básica) debe proporcionar un enlace completo a su página de inicio (incluido el esquema y el nombre de host). El usuario hará clic en este enlace y el navegador le pedirá credenciales nuevamente.

Ejemplo para Nginx:

location /logout { return 401; } error_page 401 /errors/401.html; location /errors { auth_basic off; ssi on; ssi_types text/html; alias /home/user/errors; }

Página de error /home/user/errors/401.html :

<!DOCTYPE html> <p>You''re not authorised. <a href="<!--# echo var="scheme" -->://<!--# echo var="host" -->/">Login</a>.</p>


Una adición a la respuesta por Bobince ...

Con Ajax puede tener su enlace / botón ''Cerrar sesión'' conectado a una función de Javascript. Haga que esta función envíe el XMLHttpRequest con un nombre de usuario y contraseña incorrectos. Esto debería recuperar un 401. Luego, establezca document.location en la página de preinicio de sesión. De esta manera, el usuario nunca verá el diálogo de inicio de sesión adicional durante el cierre de sesión, ni tendrá que recordar poner credenciales erróneas.


añade esto a tu aplicación:

@app.route(''/logout'') def logout(): return (''Logout'', 401, {''WWW-Authenticate'': ''Basic realm="Login required"''})


function logout(url){ var str = url.replace("http://", "http://" + new Date().getTime() + "@"); var xmlhttp; if (window.XMLHttpRequest) xmlhttp=new XMLHttpRequest(); else xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); xmlhttp.onreadystatechange=function() { if (xmlhttp.readyState==4) location.reload(); } xmlhttp.open("GET",str,true); xmlhttp.setRequestHeader("Authorization","Basic xxxxxxxxxx") xmlhttp.send(); return false; }


function logout(secUrl, redirUrl) { if (bowser.msie) { document.execCommand(''ClearAuthenticationCache'', ''false''); } else if (bowser.gecko) { $.ajax({ async: false, url: secUrl, type: ''GET'', username: ''logout'' }); } else if (bowser.webkit) { var xmlhttp = new XMLHttpRequest(); xmlhttp.open("GET", secUrl, true); xmlhttp.setRequestHeader("Authorization", "Basic logout"); xmlhttp.send(); } else { alert("Logging out automatically is unsupported for " + bowser.name + "/nYou must close the browser to log out."); } setTimeout(function () { window.location.href = redirUrl; }, 200); }

Intenté usar lo anterior de la siguiente manera.

?php ob_start(); session_start(); require_once ''dbconnect.php''; // if session is not set this will redirect to login page if( !isset($_SESSION[''user'']) ) { header("Location: index.php"); exit; } // select loggedin users detail $res=mysql_query("SELECT * FROM users WHERE userId=".$_SESSION[''user'']); $userRow=mysql_fetch_array($res); ?> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Welcome - <?php echo $userRow[''userEmail'']; ?></title> <link rel="stylesheet" href="assets/css/bootstrap.min.css" type="text/css" /> <link rel="stylesheet" href="style.css" type="text/css" /> <script src="assets/js/bowser.min.js"></script> <script> //function logout(secUrl, redirUrl) //bowser = require(''bowser''); function logout(secUrl, redirUrl) { alert(redirUrl); if (bowser.msie) { document.execCommand(''ClearAuthenticationCache'', ''false''); } else if (bowser.gecko) { $.ajax({ async: false, url: secUrl, type: ''GET'', username: ''logout'' }); } else if (bowser.webkit) { var xmlhttp = new XMLHttpRequest(); xmlhttp.open("GET", secUrl, true); xmlhttp.setRequestHeader("Authorization", "Basic logout"); xmlhttp.send(); } else { alert("Logging out automatically is unsupported for " + bowser.name + "/nYou must close the browser to log out."); } window.location.assign(redirUrl); /*setTimeout(function () { window.location.href = redirUrl; }, 200);*/ } function f1() { alert("f1 called"); //form validation that recalls the page showing with supplied inputs. } </script> </head> <body> <nav class="navbar navbar-default navbar-fixed-top"> <div class="container"> <div class="navbar-header"> <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand" href="http://www.codingcage.com">Coding Cage</a> </div> <div id="navbar" class="navbar-collapse collapse"> <ul class="nav navbar-nav"> <li class="active"><a href="http://www.codingcage.com/2015/01/user-registration-and-login-script-using-php-mysql.html">Back to Article</a></li> <li><a href="http://www.codingcage.com/search/label/jQuery">jQuery</a></li> <li><a href="http://www.codingcage.com/search/label/PHP">PHP</a></li> </ul> <ul class="nav navbar-nav navbar-right"> <li class="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"> <span class="glyphicon glyphicon-user"></span>&nbsp;Hi'' <?php echo $userRow[''userEmail'']; ?>&nbsp;<span class="caret"></span></a> <ul class="dropdown-menu"> <li><a href="logout.php?logout"><span class="glyphicon glyphicon-log-out"></span>&nbsp;Sign Out</a></li> </ul> </li> </ul> </div><!--/.nav-collapse --> </div> </nav> <div id="wrapper"> <div class="container"> <div class="page-header"> <h3>Coding Cage - Programming Blog</h3> </div> <div class="row"> <div class="col-lg-12" id="div_logout"> <h1 onclick="logout(window.location.href, ''www.espncricinfo.com'')">MichaelA1S1! Click here to see log out functionality upon click inside div</h1> </div> </div> </div> </div> <script src="assets/jquery-1.11.3-jquery.min.js"></script> <script src="assets/js/bootstrap.min.js"></script> </body> </html> <?php ob_end_flush(); ?>

Pero solo te redirige a una nueva ubicación. No cerrar sesión.


function logout() { var userAgent = navigator.userAgent.toLowerCase(); if (userAgent.indexOf("msie") != -1) { document.execCommand("ClearAuthenticationCache", false); } xhr_objectCarte = null; if(window.XMLHttpRequest) xhr_object = new XMLHttpRequest(); else if(window.ActiveXObject) xhr_object = new ActiveXObject("Microsoft.XMLHTTP"); else alert ("Your browser doesn''t support XMLHTTPREQUEST"); xhr_object.open (''GET'', ''http://yourserver.com/rep/index.php'', false, ''username'', ''password''); xhr_object.send (""); xhr_object = null; document.location = ''http://yourserver.com''; return false; }


  • usar una ID de sesión (cookie)
  • invalidar el ID de sesión en el servidor
  • No acepte usuarios con ID de sesión inválidas