Как правильно выйти из защищенной папки HTTP-аутентификации?
Есть обходные пути, которые могут достигнуть этого, но они потенциально опасны, потому что они могут содержать ошибки или не работать в определенных ситуациях / браузерах. Вот почему я ищу правильное и чистое решение.
Miscellaneous -> Clear Private Data -> HTTP Authentication
Ответы:
Mu. Не существует правильного способа , даже не совместимого в разных браузерах.
Это проблема, вытекающая из спецификации HTTP (раздел 15.6):
С другой стороны, в разделе 10.4.2 говорится:
Другими словами, вы можете снова показать окно входа в систему (как говорит @Karsten ), но браузер не должен выполнять ваш запрос - так что не слишком зависите от этой (неправильной) функции.
источник
Метод, который хорошо работает в Safari. Также работает в Firefox и Opera, но с предупреждением.
Это говорит браузеру открыть URL с новым именем пользователя, переопределяя предыдущее.
источник
user:password@host
не рекомендуется. Использование толькоhttp://logout@yourserver.example.com/
не является и должно работать в большинстве случаев.Простой ответ заключается в том, что вы не можете надежно выйти из http-аутентификации.
Длинный ответ:
Http-auth (как и остальная часть спецификации HTTP) подразумевает отсутствие состояния. Таким образом, «войти» или «выйти» на самом деле не имеет смысла. Лучший способ убедиться в этом - спросить для каждого HTTP-запроса (и помните, что загрузка страницы обычно состоит из нескольких запросов): «Вам разрешено делать то, что вы запрашиваете?». Сервер видит каждый запрос как новый и не связанный с любыми предыдущими запросами.
Браузеры решили запомнить учетные данные, которые вы сообщаете им на первых 401, и повторно отправлять их без явного разрешения пользователя на последующие запросы. Это попытка дать пользователю ожидаемую модель «вошел / вышел», но это просто помеха. Это браузер, который имитирует эту устойчивость состояния. Веб-сервер совершенно не знает об этом.
Таким образом, «выход из системы» в контексте http-auth является чисто симуляцией, предоставляемой браузером, и поэтому находится вне полномочий сервера.
Да, есть кладжи. Но они нарушают RESTful-ность (если это имеет значение для вас), и они ненадежны.
Если вам абсолютно необходима модель входа в систему / выхода из нее для проверки подлинности вашего сайта, лучшим выбором будет файл cookie для отслеживания с сохранением состояния на сервере каким-либо образом (mysql, sqlite, flatfile и т. Д.). Это потребует оценки всех запросов, например, с помощью PHP.
источник
Временное решение
Вы можете сделать это, используя Javascript:
Что сделано выше:
для IE - просто очистить кеш аутентификации и перенаправить куда-нибудь
для других браузеров - отправьте запрос XMLHttpRequest за кулисами с именем входа и паролем. Нам нужно отправить его по какому-либо пути, который вернет 200 OK на этот запрос (т.е. он не должен требовать HTTP-аутентификации).
Замените
'/where/to/redirect'
на какой-либо путь для перенаправления после выхода из системы и замените'/path/that/will/return/200/OK'
каким-либо путем на вашем сайте, который вернет 200 OK.источник
Обходной путь (не чистое, хорошее (или даже работающее! См. Комментарии) решение):
Отключите его учетные данные один раз.
Вы можете переместить свою логику HTTP-аутентификации в PHP, отправив соответствующие заголовки (если не вошли в систему):
И синтаксический анализ ввода с:
Так что отключение его учетных данных один раз должно быть тривиальным.
источник
Выйти из HTTP Basic Auth в два этапа
Допустим, у меня есть область HTTP Basic Auth с именем «Защищено паролем», и Боб вошел в систему. Чтобы выйти из системы, я делаю 2 AJAX-запроса:
WWW-Authenticate: Basic realm="Password protected"
В этот момент браузер забыл учетные данные Боба.
источник
Мое решение проблемы заключается в следующем. Вы можете найти функцию
http_digest_parse
,$realm
и$users
во втором примере этой страницы: http://php.net/manual/en/features.http-auth.php .источник
Как правило, когда браузер запрашивает учетные данные у пользователя и передает их на определенный веб-сайт, он будет продолжать делать это без дополнительных запросов. В отличие от различных способов очистки файлов cookie на стороне клиента, я не знаю аналогичного способа попросить браузер забыть предоставленные учетные данные для аутентификации.
источник
По умолчанию Trac использует HTTP-аутентификацию. Выход из системы не работает и не может быть исправлен:
От: http://trac.edgewall.org/ticket/791#comment:103
Похоже, что на этот вопрос нет рабочего ответа, об этой проблеме было сообщено семь лет назад, и это имеет смысл: HTTP не имеет состояния. Либо запрос выполняется с учетными данными аутентификации, либо нет. Но это вопрос клиента, отправляющего запрос, а не сервера, получающего его. Сервер может только сказать, требует ли авторизация URI запроса или нет.
источник
Мне нужно было сбросить авторизацию .htaccess, поэтому я использовал это:
Нашел здесь: http://php.net/manual/en/features.http-auth.php
Пойди разберись.
На этой странице находится несколько решений, и даже внизу: Lynx, не очищает аутентификацию, как другие браузеры;)
Я протестировал его в установленных браузерах и, закрыв его, кажется, что каждый браузер постоянно требует повторного входа.
источник
WWW-Authenticate
вызывала проблему, избавляясь от того, что выписал меня автоматически.WWW-Authenticate
время устранения проблемы в одном браузере (Chrome) заставляет другой браузер (Firefox) запоминать учетные данные и отправлять их при следующем запросе, что приводит к автоматическому повторному входу в систему! Argh!Это может быть не то решение, которое искали, но я решил это так. У меня есть 2 сценария для выхода из системы.
logout.php
log.php
Таким образом, я не получаю предупреждение, и моя сессия прекращается
источник
AFAIK, нет чистого способа реализовать функцию «выхода из системы» при использовании аутентификации htaccess (т.е. на основе HTTP).
Это связано с тем, что такая аутентификация использует код ошибки HTTP «401», чтобы сообщить браузеру, что требуются учетные данные, после чего браузер запрашивает у пользователя подробности. С этого момента, пока браузер не будет закрыт, он всегда будет отправлять учетные данные без дополнительных запросов.
источник
Лучшее решение, которое я нашел до сих пор (это своего рода псевдокод,
$isLoggedIn
псевдопеременная is для http auth):Во время «выхода из системы» просто сохраните некоторую информацию в сеансе о том, что пользователь фактически вышел из системы.
В том месте, где я проверяю подлинность, я расширяю условие:
Сеанс в некоторой степени связан с состоянием проверки подлинности http, поэтому пользователь остается в системе, пока он сохраняет браузер открытым и пока в браузере сохраняется проверка подлинности http.
источник
Может быть, я упускаю суть.
Самый надежный способ завершить HTTP-аутентификацию - закрыть браузер и все окна браузера. Вы можете закрыть окно браузера, используя Javascript, но я не думаю, что вы можете закрыть все окна браузера.
источник
Единственный эффективный способ стереть учетные данные
PHP_AUTH_DIGEST
илиPHP_AUTH_USER
ANDPHP_AUTH_PW
- это вызвать заголовокHTTP/1.1 401 Unauthorized
.источник
В то время как другие правы, говоря, что невозможно выйти из обычной http-аутентификации, существуют способы реализации аутентификации, которые ведут себя аналогично. Одним из очевидных подходов является использование auth_memcookie . Если вы действительно хотите реализовать базовую HTTP-аутентификацию (т.е. использовать диалоги браузера для входа в систему, а не форму HTTP), используя это - просто установите аутентификацию в отдельный защищенный каталог .htaccess, содержащий скрипт PHP, который перенаправляет назад туда, куда пришел пользователь создание сессии memcache.
источник
Здесь много отличных - сложных ответов. В моем конкретном случае я нашел чистое и простое решение для выхода из системы. Мне еще предстоит тестировать в Edge. На моей странице, на которой я вошел, я разместил ссылку на выход, подобную этой:
И в начале этой страницы logout.html (которая также защищена .htaccess) у меня есть обновление страницы, похожее на это:
Где бы вы оставили слова «выход», чтобы очистить имя пользователя и пароль, кешированные для сайта.
Я признаю, что если необходимо сразу войти в несколько страниц, то для каждой из этих точек входа потребуется собственная соответствующая страница logout.html. В противном случае вы могли бы централизовать выход из системы, введя в процесс дополнительный шаг привратника перед фактическим запросом входа в систему, требуя ввода фразы для достижения места назначения входа.
источник