Базовые аутентификационные данные HTTP хранятся до закрытия браузера, но есть ли способ удалить учетные данные до закрытия браузера?
Я читал о трюке с кодом статуса HTTP 401, но он выглядит не работает должным образом ( см. комментарий к ответу). Возможно, механизм trac использует это решение.
Можно ли удалить учетные данные с помощью JavaScript? Или с комбинацией JavaScript и трюком статуса 401?
Ответ 1
Обновление. Это решение, похоже, больше не работает во многих браузерах. Комментарий Kaitsu:
Это решение отправки ложных учетных данных, чтобы браузер забыл правильные аутентифицированные учетные данные, не работает в Chrome (16) и IE (9). Работает в Firefox (9).
На самом деле вы можете реализовать обходное решение, отправив ложные учетные данные службе. Это работает в браузерах, отправив другое (несуществующее?) Имя пользователя без пароля. Браузер теряет информацию об аутентифицированных учетных данных.
Пример:
https://www.example.com/ = > Войти с базовым auth как "user1"
Теперь откройте
https://foobar@www.example.com/
Вы вышли из системы.;)
Привет
P.s.: Но, пожалуйста, проверьте это со всеми необходимыми браузерами, прежде чем полагаться на данную информацию.
Ответ 2
Расширение ответа на январь и обновление ответа owyongsk:
Вот пример кода jquery java- script, который заставит браузер по существу отправить ложный запрос на вход на страницу, которую вы пытаетесь защитить, что во всех проверенных браузерах привело к удалению кэшированных учетных данных, а затем перенаправляет пользователя на незащищенную страницу.
Предупреждение(), когда что-то пойдет не так, вероятно, должно быть изменено на что-то еще.
//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 = "/";
});
}
Тогда это было так же просто, как просто вызвать ссылку для выхода из функции logout(), и она, казалось, легко работала с пользователем, хотя она по-прежнему технически является хакерским заданием.
Ответ 3
Вы можете попробовать хак, который работает в настоящий момент с последними Chrome и Firefox. Создайте страницу "/logout" на вашем сервере, которая принимает только определенные учетные данные, такие как имя пользователя: false, пароль: false. Затем, используя этот запрос AJAX ниже, вы можете отправить пользователя на эту страницу.
$("#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");
});
Случается, что ложное имя пользователя и пароль кэшируются из действительного XMLHttpRequest вместо текущих учетных данных пользователя, а когда пользователь пытается войти на любую страницу, он будет использовать кэшированные поддельные учетные данные, не получив аутентификацию, попросите пользователя ввести другой. Надеюсь, это поможет!
Ответ 4
только что завершив реализацию, которая отлично работала для меня:
На сервере я оцениваю сеанс, имя пользователя и пароль, поэтому я отслеживаю эту информацию, алгоритм входа в систему выглядит следующим образом:
1. Проверьте, не являются ли пользователь и пароль пустым, иначе верните 401.
2.Проверьте, зарегистрировали ли мы сеанс в нашем списке зарегистрированных пользователей, если нет, то проверьте, действительно ли пользователь и пароль действительны, и если так сохранить идентификатор сеанса в нашем списке, а затем верните 401. Я объясню этот шаг: если идентификатор сеанса отличается от одного из трех событий: a) Пользователь открывает другое окно. б) Сеанс пользователя завершен, т.е. пользователь вышел из системы. c) Сессия закончилась из-за бездействия. Но мы хотим сохранить сеанс до тех пор, пока учетные данные пользователя действительны, но верните 401, чтобы спросить пароль один раз, если мы не сохраним сеанс, тогда пользователь никогда не сможет войти в систему, потому что у нас нет нового идентификатора сеанса в нашем списке.
3. Проверьте правильность учетных данных пользователя, если это так, сохраните информацию о сеансе и продолжите страницы обслуживания, а затем верните 401.
Итак, единственное, что я должен выйти из системы, - закрыть сеанс на сервере, когда пользователь запросит страницу выхода, и веб-браузер снова отобразит диалоговое окно входа.
Я думаю, что, когда я пишу это, должен быть шаг, когда программа проверяет, что пользователь уже зарегистрирован, чтобы избежать олицетворения, возможно, я могу сохранить более одного идентификатора сеанса для каждого пользователя, чтобы разрешить несколько сеансов, Я хотел бы получить ваши комментарии по этому поводу.
Надеюсь, что вы поймете эту идею и прокомментируете, если вы видите недостаток безопасности;)
Ответ 5
Вы можете удалить учетные данные с помощью JavaScript:
$("#logout").click(function(){
try {
document.execCommand("ClearAuthenticationCache");
window.location.href('/logout.html'); // page with logout message somewhere in not protected directory
} catch (exception) {}
});
Этот код работает только в IE. Вот почему там добавлен блок try/catch.
Кроме того, по той же причине ссылка на выход, которую вы должны показывать только для пользователей IE:
<!--[if IE]>
<div id="logout">[Logout]</div>
<![endif]-->
И для других пользователей мое предложение выглядит примерно так:
<div id="logout2" onclick="alert('Please close your browser window to logout')">[Logout]</div>
Ответ 6
Если у вас есть контроль над кодом сервера, вы можете создать функцию "logout", которая отвечает "401 Unauthorized" независимо от предоставленных учетных данных. Этот отказ заставляет браузеры удалять сохраненные учетные данные.
Я только что протестировал это с помощью Chrome 34, IE 11, Firefox 25 - используя сервер Express.js и базовую аутентификацию HTTP.
Ответ 7
Что для меня работало в Chrome (версия 66) - это отправить запрос Ajax на URL-адрес, который возвращает 401. Таким образом, базовый кеш аутентификации, кажется, очищается.
var xhttp = new XMLHttpRequest();
xhttp.open("GET", "/url_that_returns_401", true);
xhttp.send();