Выход из аутентификации HTTP через PHP - PullRequest
148 голосов
/ 16 января 2009

Каков правильный способ выхода из защищенной папки HTTP-аутентификации?

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

Ответы [ 17 ]

2 голосов
/ 06 августа 2011

Trac - по умолчанию - также использует HTTP-аутентификацию. Выход из системы не работает и не может быть исправлен:

  • Это проблема самой схемы проверки подлинности HTTP, и мы ничего не можем сделать в Trac, чтобы исправить ее должным образом.
  • В настоящее время нет обходного пути (JavaScript или другой), который бы работал во всех основных браузерах.

От: http://trac.edgewall.org/ticket/791#comment:103

Похоже, что на этот вопрос нет рабочего ответа, об этой проблеме сообщалось семь лет назад, и она имеет смысл: HTTP не имеет состояния. Либо запрос выполняется с учетными данными аутентификации, либо нет. Но это вопрос клиента, отправляющего запрос, а не сервера, получающего его. Сервер может только сказать, требуется ли авторизация для URI запроса.

1 голос
/ 24 августа 2012

Может быть, я упускаю суть.

Самый надежный способ завершить HTTP-аутентификацию - это закрыть браузер и все окна браузера. Вы можете закрыть окно браузера, используя Javascript, но я не думаю, что вы можете закрыть все окна браузера.

1 голос
/ 16 января 2009

AFAIK, нет чистого способа реализовать функцию "выхода из системы" при использовании аутентификации htaccess (т.е. на основе HTTP).

Это связано с тем, что при такой аутентификации используется код ошибки HTTP «401», чтобы сообщить браузеру, что требуются учетные данные, и в этот момент браузер запрашивает детали у пользователя. С тех пор, пока браузер не будет закрыт, он всегда будет отправлять учетные данные без дальнейшего запроса.

1 голос
/ 04 марта 2009

Лучшее решение, которое я нашел до сих пор (это своего рода псевдокод, $isLoggedIn - псевдопеременная для http auth):

Во время «выхода из системы» просто сохраните некоторую информацию о сеансе, говоря, что пользователь фактически вышел из системы.

function logout()
{
  //$isLoggedIn = false; //This does not work (point of this question)
  $_SESSION['logout'] = true;
}

В месте, где я проверяю аутентификацию, я расширяю условие:

function isLoggedIn()
{
  return $isLoggedIn && !$_SESSION['logout'];
}

Сеанс в некоторой степени связан с состоянием проверки подлинности http, поэтому пользователь остается в системе, пока он сохраняет браузер открытым и пока в браузере сохраняется проверка подлинности http.

0 голосов
/ 07 июня 2015

Единственный эффективный способ стереть учетные данные PHP_AUTH_DIGEST или PHP_AUTH_USER AND PHP_AUTH_PW - это вызвать заголовок HTTP/1.1 401 Unauthorized.

function clear_admin_access(){
    header('HTTP/1.1 401 Unauthorized');
    die('Admin access turned off');
}
0 голосов
/ 18 октября 2017

Здесь много отличных - сложных ответов. В моем конкретном случае я нашел чистое и простое решение для выхода из системы. Мне еще предстоит тестировать в Edge. На моей странице, на которой я вошел, я разместил ссылку на выход, подобную этой:

<a href="https://MyDomainHere.net/logout.html">logout</a>

И в начале этой страницы logout.html (которая также защищена .htaccess) у меня есть обновление страницы, похожее на это:

<meta http-equiv="Refresh" content="0; url=https://logout:logout@MyDomainHere.net/" />

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

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

0 голосов
/ 01 августа 2011

В то время как другие правы, говоря, что невозможно выйти из обычной http-аутентификации, есть способы реализовать аутентификацию, которая ведет себя аналогично. Одним из очевидных подходов является использование auth_memcookie . Если вы действительно хотите реализовать обычную HTTP-аутентификацию (т.е. использовать диалоги браузера для входа в систему, а не форму HTTP), используя это - просто установите аутентификацию в отдельный защищенный каталог .htaccess, содержащий скрипт PHP, который перенаправляет назад туда, куда пришел пользователь создание сессии memcache.

...