Як вийти з веб-сайту за допомогою автентифікації BASIC?


279

Чи можливо вийти з веб-сайту, якщо він використовує основну автентифікацію?

Сеанс вбивства недостатньо, оскільки, як тільки користувач проходить автентифікацію, кожен запит містить інформацію про вхід, тому користувач автоматично входить в систему, коли наступного разу він отримує доступ до сайту за допомогою тих самих даних.

Єдине рішення поки що - закрити браузер, але це не прийнятно з точки зору зручності використання.


1
Просто цікаво. Чому ти хочеш це робити?
DOK

17
Щоб мати можливість увійти як інший користувач.
Марко

16
@DOK - це стандартна річ, що хакерська: користувачі повинні мати можливість вийти із системи, залишаючи браузер відкритим. Припустимо, хтось із ваших користувачів отримує доступ до сайту на загальнодоступній машині? Їх потрібно чітко вийти з системи, щоб наступний користувач не міг отримати доступ до сайту як їх.
Кіт

@DOK Також існує проблема в тому, що користувач унеможливлює вихід із сайту. Сервер може очистити файли cookie авторизації і навіть файли cookie сеансу. Але коли браузер перейде на завантаження /сторінки, вони автоматично ввійдуть у систему.
Ян Бойд

Я використовую метод, який надсилає помилковий запит на вихід, але він блокує користувача у клієнта, оскільки існує обмеження жорсткості, яке в AD не вдалося тричі ввійти. Отже, пропонуйте використовувати цей метод (обережно надсилайте запит) з обережністю.
Пан Цяньчао

Відповіді:


170

Основна автентифікація не була розроблена для управління вихідними. Ви можете це зробити, але не повністю автоматично.

Що вам потрібно зробити - це користувач натиснути посилання для виходу та надіслати у відповідь "401 Несанкціонований", використовуючи ту саму область і на тому ж рівні папки URL, що і звичайний 401, який ви надсилаєте із запитом на вхід.

Вони повинні бути спрямовані на введення неправильних облікових даних поруч, наприклад. порожнє ім’я користувача та пароль, і у відповідь ви надсилаєте назад сторінку "Ви успішно вийшли з системи". Неправильні / порожні облікові дані потім замінять попередні правильні облікові дані.

Коротше кажучи, скрипт виходу інвертує логіку сценарію входу, повертаючи сторінку успіху лише у тому випадку, якщо користувач не передає потрібні облікові дані.

Питання полягає в тому, чи відповідатиме дещо цікавий поле пароля "не вводьте свій пароль". Менеджери паролів, які намагаються автоматично заповнити пароль, також можуть потрапити сюди.

Редагувати, щоб додати у відповідь на коментар: повторний вхід - дещо інша проблема (якщо, очевидно, не потрібно двоетапний вихід / вхід). Ви повинні відхилити (401) першу спробу доступу до посилання перереєстрації, ніж прийняти другу (яка, імовірно, має інше ім’я користувача / пароль). Є кілька способів зробити це. Можна було б включити поточне ім'я користувача у посилання на вихід (наприклад, / relogin? Ім'я користувача) та відхилити, коли облікові дані відповідають імені користувача.


2
Я спробую такий підхід. Суть виходу (у цьому випадку) полягає в тому, щоб дозволити користувачеві входити як різний користувач, тому це цілком прийнятне рішення. Що стосується пароля автоматичного заповнення, користувач залежить від того, буде він ним користуватися чи ні. Спасибі
Марко

Це все-таки єдиний спосіб? Я зробив реалізацію MVC та jQuery ASP.Net, яка працює, але я все ще не задоволений цим: stackoverflow.com/questions/6277919
Кіт,

@Keith: Все-таки лише ця відповідь і відповідь systemPAUSE (яка працює не у всіх браузерах, але плавніша, ніж ручний підхід, коли вона працює).
bobince

16
W3C настільки активний у специфікації HTML. Але специфікація HTTP знемагає. W3C повинна була вирішити цю проблему близько двох десятиліть тому. З ростом використання послуг REST необхідний надійний метод власної автентифікації.
Доджо

9
Схоже, це не працює належним чином у веб-переглядачі Chrome 46 на localhost. Здається, Chrome зберігає старий (правильний) і новий пароль, який ви вказали. Після переходу на сторінку виходу, chrome правильно використовує новий пароль ДО ПОВЕРНЕННЯ A 401 UNAUTHORIZED НА СТОРІНЦІ НА ВАШІЙ САЙТІ. Після першого 401 Chrome повертається до старого (правильного) пароля. Таким чином, він справді не видалив пароль, в першу чергу, здається.
vancan1ty

196

Доповнення до відповіді bobince ...

За допомогою Ajax ви можете мати посилання / кнопку "Вихід", підключені до функції Javascript. Запропонуйте цій функції надіслати XMLHttpRequest з неправильним ім'ям користувача та паролем. Це має отримати назад 401. Потім поверніть document.location назад на сторінку попереднього входу. Таким чином, користувач ніколи не побачить діалогове вікно додаткового входу під час виходу з програми, а також не повинен пам'ятати, щоб вводити неправильні облікові дані.


12
Хороший злом, якщо користувач вручну вводить погані облікові дані, мабуть, неприйнятний для більшості веб-сайтів.
BillMan

1
Просто переконайтеся, що XMLHttpRequest не встановлений як асинхронний, або ви можете виявити, що перенаправлення через відбудеться до завершення запиту на вихід.
davidjb

5
Ви можете використовувати той самий трюк і для входу. Таким чином ви можете налаштувати діалогове вікно входу, не змінюючи метод аутентифікації сервера. Ця стаття дає кілька хороших ідей: http://www.peej.co.uk/articles/http-auth-with-html-forms.html
Stijn de Witt

1
@davidjb Оскільки синхронні запити зараз вважаються застарілими, альтернативним рішенням може бути перенаправлення користувача у зворотній виклик запиту async.
Хайден Шифф

1
Девід: Хром тепер дозволяє це для XHR, і я можу підтвердити, що він все ще працює в хромованому канарі. bugs.chromium.org/p/chromium/isissue/detail?id=435547
CpnCrunch

192

Запропонуйте користувачу натиснути на посилання на https: // log: out@example.com/ . Це замінить існуючі облікові дані недійсними; виходу з них.


19
Чому цей не отримує більше оновлень? Мені це здається простим і робочим рішенням. Чи є відомі проблеми з таким підходом?
амебе

35
Це більше не працює в Chrome, який з міркувань безпеки ігнорує облікові дані в URL-адресі.
Том

5
Це працювало для мене :) Я використовую Chrome версії 32.0.1700.102
abottoni

6
Проблема: використовуючи версію 39.0 chrome. Коли я натискаю посилання для виходу за допомогою цього методу, Chrome запам’ятовує погані облікові дані для входу та запитує про нові облікові дані для входу під час кожного завантаження сторінки, поки я не перейду на example.com без вказаних даних для входу, на чітка хромова пам’ять.
Скотт

4
Привіт, я не можу використовувати його для https у Chrome.
thienkhoi tran

67

Ви можете це зробити повністю у JavaScript:

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

document.execCommand("ClearAuthenticationCache")

Слід повернути істину, коли вона працює. Повертає помилкове, невизначене або відображається в інших веб-переглядачах.

Нові браузери (станом на грудень 2012 року: Chrome, FireFox, Safari) мають "магічну" поведінку. Якщо вони бачать успішний базовий запит на аутентифікацію з будь-яким фальшивим іншим ім'ям користувача (скажімо logout), вони очищають кеш даних облікових даних і, можливо, встановлюють це нове ім'я фальшивого користувача, для чого потрібно переконатися, що це неправдиве ім’я користувача для перегляду вмісту.

Основний приклад цього:

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

"Асинхронний" спосіб виконання вищезгаданого - це зробити дзвінок AJAX, використовуючи 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*/);


1
Чи потрібна це спеціальна обробка на сервері logoutімені користувача та / або URL-адреси виходу?
ulidtko

1
@ulidtko Ні, це не повинно - все керування залежить від клієнта. Єдиною ситуацією, яка потребує спеціального керування, є те, якщо користувач, який викликається, logoutтрапляється, існує та має згенерований пароль. У цьому майже неможливо-рідкісному випадку змініть ідентифікатор користувача на такий, який не буде існувати у вашій системі.
davidjb

2
Я сьогодні використав закладки і добре працюю.
Девід Гліба

Я використав це, і він працював для Chrome і FF. Мені довелося лише зробити додатковий "GET" на своїй сторінці logout.php, щоб очистити $ _SESSION.
міський

2
Закладка працює і на Edge. Просто використовуйте з<a href='javascript:......need*/);'>Logout</a>
Ерік

21

Наступна функція підтверджена для роботи у 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);
}


це найбільш вичерпна відповідь
belidzs

Чи є причина, що $.ajaxваріант є синхронним ( async: false), а xmlhttpваріант - асинхронним ( truein open())?
Bowi

1
Chrome тепер використовує движок рендеринга Blink, так що ви повинні змінити (bowser.gecko)до (bowser.gecko || bowser.blink).
Бові

1
Чому геккон / $.ajaxморгає та використовує веб -кайти new XMLHttpRequest? Чи не може геккон / блимати не в змозі це зробити XMLHttpRequestі вебкіт $.ajax? Я збентежений.
RemyNL

11

Ось дуже простий приклад Javascript за допомогою jQuery:

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

    jQuery.get(out).error(function() {
        window.location = to_url;
    });
}

Цей користувач виходить, не показуючи йому ще раз вікно для входу в браузер, а потім перенаправляє його на сторінку виходу


1
window.location = window.location.href.replace (/: \ / \ //, ': // log: out @');
sebhaase

10

Це неможливо безпосередньо при автентифікації Basic.

Немає механізму в специфікації HTTP для сервера, який би сказав браузеру припинити надсилати облікові дані, які користувач уже представив.

Існують "хаки" (див. Інші відповіді), як правило, що використовують використання XMLHttpRequest для надсилання HTTP-запиту з неправильними обліковими записами для заміни первісно наданих.


12
Теоретично. Практика доводить інакше, як видно з інших відповідей.
Штійн де Вітт

2
І як ви також бачите з інших відповідей, але не надійним, послідовним та безвідмовним!
jplandrain

5

Це працює для 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"); 
      });
  });          

5

Насправді це досить просто.

Просто завітайте у свій веб-переглядач та використовуйте неправильні облікові дані: http: // username: password@yourdomain.com

Це повинно "вийти з системи".


1
Але користувач повинен бути справжнім користувачем, інакше я отримав "401 Несанкціонований", але за допомогою кнопки НАЗАД я можу продовжувати роботу як раніше зареєстрований користувач. Тестовано на веб-сервері Abyss X1 (2.11.1)
користувач2956477

1
Дублююча відповідь (див. Вище Меттью Велборн).
Skippy le Grand Gourou

3

Все, що вам потрібно, це перенаправлення користувача на якусь URL-адресу виходу та повернення 401 Unauthorizedпомилки на ньому. На сторінці помилок (яка повинна бути доступною без основного аутентифікації) вам потрібно надати повне посилання на вашу домашню сторінку (включаючи схему та ім’я хоста). Користувач натисне це посилання, і браузер знову запитає облікові дані.

Приклад для 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:

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

Я хотів би далі запропонувати використовувати http_hostв 401.htmlзамість того , щоб просто host, як колишні також додає номер порту (в разі нестандартний порт використовується)
Еміль Koutanov

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

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

2

На основі прочитаного вище я отримав просте рішення, яке працює в будь-якому браузері:

1) на сторінці виходу ви викликаєте ajax до зворотного кінця входу. Задній кінець входу повинен приймати користувач, який вийшов із системи. Після того, як зворотний кінець прийнятий, браузер очистить поточного користувача і припускає користувача "вихід".

$.ajax({
    async: false,
    url: 'http://your_login_backend',
    type: 'GET',
    username: 'logout'
});      

setTimeout(function () {
    window.location.href = 'http://normal_index';
}, 200);

2) Тепер, коли користувач повернеться до звичайного індексного файлу, він спробує автоматично ввести систему в систему з користувачем "вихід", у цей другий раз ви повинні заблокувати його у відповідь з номером 401, щоб викликати діалог для входу / пароля.

3) Є багато способів зробити це, я створив два зворотні кінці входу, той, який приймає користувача, який виходив, і той, який цього не робить. Моя звичайна сторінка входу використовує ту, яка не приймає, моя сторінка виходу використовує ту, яка її приймає.


2

Я щойно перевірив наступне в Chrome (79), Firefox (71) та Edge (44), і це чудово працює. Він застосовує рішення сценарію, як зазначалося вище.

Просто додайте посилання "Вихід" і при натисканні поверніть наступний html

    <div>You have been logged out. Redirecting to home...</div>    

<script>
    var XHR = new XMLHttpRequest();
    XHR.open("GET", "/Home/MyProtectedPage", true, "no user", "no password");
    XHR.send();

    setTimeout(function () {
        window.location.href = "/";
    }, 3000);
</script>

1

Цей 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 = /*@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+'/';
}

1

додайте це до своєї програми:

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

краще скористатися цим поверненням: return ("Вихід", 401)
Амір Мофахар

1

введіть chrome://restartв адресний рядок і chrome, а всі його програми, які працюють у фоновому режимі, перезапустяться і кеш паролів Auth буде очищено.


1

Для запису є новий заголовок відповіді HTTP під назвою Clear-Site-Data. Якщо відповідь вашого сервера містить Clear-Site-Data: "cookies"заголовок, тоді слід видалити облікові дані автентифікації (не лише куки). Я перевірив його на Chrome 77, але це попередження відображається на консолі:

Clear-Site-Data header on 'https://localhost:9443/clear': Cleared data types:
"cookies". Clearing channel IDs and HTTP authentication cache is currently not
supported, as it breaks active network connections.

І автентифікаційні дані не видаляються, тому це не працює (наразі) для впровадження основних аутентифікацій, але, можливо, у майбутньому буде. Не тестували в інших браузерах.

Список літератури:

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Clear-Site-Data

https://www.w3.org/TR/clear-site-data/

https://github.com/w3c/webappsec-clear-site-data

https://caniuse.com/#feat=mdn-http_headers_clear-site-data_cookies


1

Надсилання https://invalid_login@hostnameдобре працює скрізь, окрім Safari на Mac (ну, не перевірено Edge, але воно також має працювати там).

Вихід не працює в Safari, коли користувач вибирає "запам'ятати пароль" у спливаючому вікні HTTP Basic Authentication. У цьому випадку пароль зберігається в Keychain Access (Finder> Applications> Utilities> Keychain Access (або CMD + SPACE та введіть "Keychain Access")). Надсилання https://invalid_login@hostnameне впливає на доступ до Keychain Access, тому за допомогою цього прапорця неможливо вийти на Safari на Mac. Принаймні, так це працює для мене.

MacOS Mojave (10.14.6), Safari 12.1.2.

Код нижче працює для мене добре у Firefox (73), Chrome (80) та Safari (12). Коли користувач переходить на сторінку виходу, код виконується і скидає облікові дані.

    //It should return 401, necessary for Safari only
    const logoutUrl = 'https://example.com/logout'; 
    const xmlHttp = new XMLHttpRequest();
    xmlHttp.open('POST', logoutUrl, true, 'logout');
    xmlHttp.send();

Крім того, Safari чомусь не зберігає облікові дані в спливаючому вікні HTTP Basic, навіть коли вибрано "запам'ятати пароль". Інші браузери роблять це правильно.


0
  • використовувати ідентифікатор сеансу (cookie)
  • визнати недійсним ідентифікатор сеансу на сервері
  • Не приймайте користувачів з недійсними ідентифікаторами сеансу

Також добре запропонувати базову автентифікацію як схему входу резервного копіювання, коли файли cookie недоступні.
bobince

0

Я оновив рішення модництва для сучасних версій 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);
}

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

Я намагався використовувати вищезазначене наступним чином.

?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(); ?>

Але це лише перенаправляє вас на нове місце. Немає вихід.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.