Выход из системы аутентификации HTTP через PHP

Чтобы предотвратить ошибку InvalidCharacterError, вам необходимо сделать следующее:

var base64EncodedStr = btoa(unescape(encodeURIComponent(rawData)));
149
задан bignose 1 May 2009 в 07:04
поделиться

8 ответов

Mu. Никакой корректный путь не существует , даже один это не последовательно через браузеры.

Это - проблема, которая прибывает из Спецификация HTTP (разделите 15.6):

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

, С другой стороны, разделите 10.4.2 , говорит:

, Если запрос уже включал учетные данные Авторизации, то 401 ответ указывает, что авторизации отказали для тех учетных данных. Если 401 ответ содержит ту же проблему как предшествующий ответ, и агент пользователя уже делал попытку аутентификации, по крайней мере, однажды, то пользователь ДОЛЖЕН быть представлен объект, который был дан в ответе, так как тот объект мог бы включать соответствующую диагностическую информацию.

, Другими словами, можно быть в состоянии показать поле входа в систему снова (как , @Karsten говорит), , но браузер не должен соблюдать запрос - так не зависьте от этой (mis) функции слишком много.

102
ответ дан Community 4 November 2019 в 18:18
поделиться

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

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

1
ответ дан Alnitak 4 November 2019 в 18:18
поделиться

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

4
ответ дан Greg Hewgill 4 November 2019 в 18:18
поделиться

Метод, который работает приятно в Safari. Также работы в Firefox и Opera, но с предупреждением.

Location: http://logout@yourserver.example.com/

Это говорит браузеру открывать URL с новым именем пользователя, переопределяя предыдущее.

59
ответ дан Kornel 4 November 2019 в 18:18
поделиться

Обходное решение (не чистое, хорошее (или даже работа! см. комментарии) решение):

Отключите его учетные данные одно время.

Можно переместить логику Аутентификации HTTP в PHP путем отправки соответствующих заголовков (если не вошел в систему):

Header('WWW-Authenticate: Basic realm="protected area"');
Header('HTTP/1.0 401 Unauthorized');

И парсинг входа с:

$_SERVER['PHP_AUTH_USER'] // httpauth-user
$_SERVER['PHP_AUTH_PW']   // httpauth-password

Так отключая его учетные данные одно время должно быть тривиальным.

13
ответ дан Chris Wesseling 23 November 2019 в 22:26
поделиться

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

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

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

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

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

Сессия несколько связана с состоянием аутентификации HTTP, таким образом, пользователь остается, вышел из системы, пока он сохраняет браузер открытым и, пока аутентификация HTTP сохраняется в браузере.

1
ответ дан Josef Sábl 23 November 2019 в 22:26
поделиться

Мое решение проблемы следующее. Вы можете найти функцию http_digest_parse , $ realm и $ users во втором примере этой страницы: http://php.net/manual /en/features.http-auth.php.

session_start();

function LogOut() {
  session_destroy();
  session_unset($_SESSION['session_id']);
  session_unset($_SESSION['logged']);

  header("Location: /", TRUE, 301);   
}

function Login(){

  global $realm;

  if (empty($_SESSION['session_id'])) {
    session_regenerate_id();
    $_SESSION['session_id'] = session_id();
  }

  if (!IsAuthenticated()) {  
    header('HTTP/1.1 401 Unauthorized');
    header('WWW-Authenticate: Digest realm="'.$realm.
   '",qop="auth",nonce="'.$_SESSION['session_id'].'",opaque="'.md5($realm).'"');
    $_SESSION['logged'] = False;
    die('Access denied.');
  }
  $_SESSION['logged'] = True;  
}

function IsAuthenticated(){
  global $realm;
  global $users;


  if  (empty($_SERVER['PHP_AUTH_DIGEST']))
      return False;

  // check PHP_AUTH_DIGEST
  if (!($data = http_digest_parse($_SERVER['PHP_AUTH_DIGEST'])) ||
     !isset($users[$data['username']]))
     return False;// invalid username


  $A1 = md5($data['username'] . ':' . $realm . ':' . $users[$data['username']]);
  $A2 = md5($_SERVER['REQUEST_METHOD'].':'.$data['uri']);

  // Give session id instead of data['nonce']
  $valid_response =   md5($A1.':'.$_SESSION['session_id'].':'.$data['nc'].':'.$data['cnonce'].':'.$data['qop'].':'.$A2);

  if ($data['response'] != $valid_response)
    return False;

  return True;
}
7
ответ дан 23 November 2019 в 22:26
поделиться

Простой ответ заключается в том, что вы не можете надежно выйти из http-аутентификации.

Подробный ответ:
Http-auth (как и остальная часть спецификации HTTP) не имеет состояния. Так что «войти в систему» ​​или «выйти из системы» на самом деле не имеет смысла. Лучший способ увидеть это - спросить для каждого HTTP-запроса (помните, что загрузка страницы обычно состоит из нескольких запросов): «Разрешено ли вам делать то, что вы запрашиваете?». Сервер видит каждый запрос как новый и не связанный с какими-либо предыдущими запросами.

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

Таким образом, «выход из системы» в контексте http-auth является чисто симуляцией, предоставляемой браузером, и поэтому находится вне компетенции сервера.

Да, есть кладжи. Но они нарушают RESTfulness (если это важно для вас) и ненадежны.

Если вам абсолютно необходима модель авторизации / выхода из системы для аутентификации вашего сайта, лучшим вариантом является отслеживающий cookie, с сохранением состояния, сохраненным на сервере каким-либо образом (mysql, sqlite, flatfile и т. Д.) . Это потребует обработки всех запросов, например, с помощью PHP.

46
ответ дан 23 November 2019 в 22:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: