Как выйти из веб-сайта с использованием аутентификации BASIC?

Можно ли вывести пользователя с веб-сайта, если он использует базовую аутентификацию?

Завершение сеанса недостаточно, так как после аутентификации пользователя каждый запрос содержит информацию для входа, поэтому пользователь автоматически регистрируется в следующий раз, когда он / она получает доступ к сайту с использованием тех же учетных данных.

Единственное решение до сих пор – закрыть браузер, но это неприемлемо с точки зрения удобства использования.

    Основная проверка подлинности не была разработана для управления протоколированием. Вы можете это сделать, но не полностью автоматически.

    То, что вам нужно сделать, – это нажать кнопку «Выход из системы» и отправить «401 Unauthorized» в ответ, используя ту же область и на том же уровне, что и обычная 401, которую вы отправляете, запрашивая логин.

    Они должны быть направлены на ввод неверных учетных данных, например, например. пустое имя пользователя и пароль, и в ответ вы отправляете страницу «Вы успешно вышли из системы». Неправильные / пустые учетные данные затем перезапишут предыдущие правильные учетные данные.

    Короче говоря, скрипт logout инвертирует логику сценария входа, только возвращает страницу успеха, если пользователь не передает правильные учетные данные.

    Вопрос в том, будет ли любопытный пароль «не вводить пароль», будет отвечать требованиям пользователя. Менеджеры паролей, которые пытаются автоматически заполнить пароль, также могут попасть сюда.

    Изменить для добавления в ответ на комментарий: повторный вход – это немного другая проблема (если вам не требуется двухэтапный выход из системы / логин). Вы должны отклонить (401) первую попытку доступа к ссылке relogin, чем принять вторую (которая предположительно имеет другое имя пользователя / пароль). Есть несколько способов сделать это. Можно было бы включить текущее имя пользователя в ссылку выхода из системы (например, имя пользователя / relogin?) И отклонить, когда учетные данные совпадут с именем пользователя.

    Добавление к ответу bobince …

    С помощью Ajax у вас может быть ссылка / кнопка «Выход», подключенная к функции Javascript. Попросите эту функцию отправить XMLHttpRequest с плохим именем пользователя и паролем. Это должно вернуть 401. Затем верните документ.location на страницу предварительного входа. Таким образом, пользователь никогда не увидит дополнительное диалоговое окно входа во время выхода из системы и не должен забывать вводить плохие учетные данные.

    Попросите пользователя щелкнуть ссылку на https: // log: [email protected]/ . Это приведет к перезаписи существующих учетных данных с недопустимыми; выписывая их.

    Вы можете сделать это полностью в JavaScript:

    IE имеет (в течение длительного времени) стандартный API для очистки базового кэша аутентификации:

     document.execCommand("ClearAuthenticationCache") 

    Должен возвращаться, когда он работает. Возвращает либо false, undefined или взрывается в других браузерах.

    Новые браузеры (по состоянию на декабрь 2012 года: Chrome, FireFox, Safari) имеют «магическое» поведение. Если они видят успешный базовый auth-запрос с любым фиктивным другим именем пользователя (скажем, logout ), они очищают кеш учетных данных и, возможно, устанавливают его для этого нового имени пользователя, который вам нужен, чтобы убедиться, что это не допустимое имя пользователя для просмотра содержимого.

    Основным примером этого является:

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

    «Асинхронный» способ сделать это – это сделать вызов AJAX, используя имя пользователя logout из logout . Пример:

     (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*/) 

    Вы также можете сделать это букмарклет:

    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*/);

    Подтверждена следующая функция, работающая для Firefox 40, Chrome 44, Opera 31 и IE 11.
    Bowser используется для обнаружения браузера, также используется jQuery.

    – secUrl – это URL-адрес защищенной паролем области, из которой выходить из системы.
    – redirUrl – это URL-адрес области, не защищенной паролем (страница успеха выхода из системы).
    – вы можете увеличить таймер переадресации (в настоящее время 200 мс).

     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); } 

    Это невозможно напрямую с помощью Basic-Authentication.

    В спецификации HTTP нет механизма для того, чтобы сервер сообщал браузеру прекратить отправку учетных данных, которые пользователь уже представил.

    Существуют «хаки» (см. Другие ответы), обычно включающие использование XMLHttpRequest для отправки HTTP-запроса с неправильными учетными данными для перезаписывания первоначально предоставленных.

    Вот простой пример Javascript с помощью jQuery:

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

    Этот пользователь журнала отключился, не показывая ему окно входа в браузер, а затем перенаправит его на удаленную страницу

    На самом деле это довольно просто.

    Просто зайдите в свой браузер и используйте неправильные учетные данные: http: // имя пользователя: [email protected]

    Это должно «вывести вас».

    Это работает для 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"); }); }); 
     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; } 
      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; } 

    Все, что вам нужно, – перенаправить пользователя на некоторый URL выхода и вернуть 401 Unauthorized ошибку. На странице ошибок (которая должна быть доступна без базового auth) вам необходимо предоставить полную ссылку на вашу домашнюю страницу (включая схему и имя хоста). Пользователь нажмет эту ссылку, и браузер снова попросит учетные данные.

    Пример для 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; } 

    Страница ошибки /home/user/errors/401.html :

      

    You're not authorised. ://https://stackoverflow.com/questions/233507/how-to-log-out-user-from-web-site-using-basic-authentication//">Login.

    Основываясь на том, что я прочитал выше, я получил простое решение, которое работает в любом браузере:

    1) на странице выхода из системы вы вызываете ajax на свой логин. Ваш конец входа в систему должен принять пользователя для выхода из системы. Как только задняя часть примет, браузер очистит текущего пользователя и примет пользователя «logout».

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

    2) Теперь, когда пользователь вернется к нормальному индексному файлу, он попытается автоматически войти в систему с пользовательским «выходом из системы», во второй раз вы должны заблокировать его с помощью ответа 401, чтобы вызвать диалог входа / пароля.

    3) Есть много способов сделать это, я создал два конца входа в систему, один, который принимает пользователя выхода из системы, и тот, который этого не делает. Моя обычная страница входа использует ту, которая не принимает, моя страница выхода из системы использует ту, которая ее принимает.

    • используйте идентификатор сеанса (cookie)
    • аннулировать идентификатор сеанса на сервере
    • Не принимать пользователей с недопустимыми идентификаторами сеанса

    Этот JavaScript должен работать для всех браузеров последней версии:

     //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 = /*@[email protected]*/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:[email protected]'+Host+'/'; } 

    добавьте это в свою заявку:

     @app.route('/logout') def logout(): return ('Logout', 401, {'WWW-Authenticate': 'Basic realm="Login required"'}) из @app.route('/logout') def logout(): return ('Logout', 401, {'WWW-Authenticate': 'Basic realm="Login required"'}) 
      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); } 

    Я обновил решение mthoring для современных версий 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); } 
    Interesting Posts
    Давайте будем гением компьютера.