6

Есть ли способ выйти из аутентификации дайджеста, выполненной в php.PHP Дайджест авторизации, выход из системы

Я пробовал unset ($ _ SERVER ["PHP_AUTH_DIGEST"]); Но он не попросит перелоги. Я знаю, если я закрою браузер, тогда он будет работать, и вот мои функции.

function login(){ 
     $realm = "Restricted area"; 
     $users = array("jamesm"=>""); 
     if (empty($_SERVER["PHP_AUTH_DIGEST"])) { 
      header("HTTP/1.1 401 Unauthorized"); 
      header("WWW-Authenticate: Digest realm=\"{$realm}\",qop=\"auth\",nonce=\"".uniqid()."\",opaque=\"".md5($realm)."\""); 
      return false; 
     } 
     if (!($data = http_digest_parse($_SERVER["PHP_AUTH_DIGEST"])) || !isset($users[$data["username"]])) 
      return false; 
     $A1 = md5($data["username"] . ":{$realm}:{$users[$data["username"]]}"); 
     $A2 = md5($_SERVER["REQUEST_METHOD"].":{$data["uri"]}"); 
     $valid_response = md5("{$A1}:{$data["nonce"]}:{$data["nc"]}:{$data["cnonce"]}:{$data["qop"]}:{$A2}"); 
     if ($data["response"] != $valid_response) 
      return false; 
     return true; 
    } 
    function logout(){ 
     unset($_SERVER["PHP_AUTH_DIGEST"]); 
     return true; 
    } 

Что еще мне нужно добавить к функции выхода из системы, чтобы закончить это.

Если я сменил область, она работает, но я не хочу, чтобы она менялась.

+0

Дубликат [Отправка HTTP-аутентификации через PHP] (http://stackoverflow.com/questions/449788/http-authentication-logout-via-php). Ответ: № – netcoder

+0

Я знаю, что это можно сделать, просто не уверен, как это сделать. –

+0

закрыть браузер - единственный способ, поскольку информация зарегистрирована внутри браузера. – ajreal

ответ

10

Сброс $ _SERVER ['PHP_AUTH_DIGEST'] не будет иметь эффекта. Проблема в том, что на задание, которое вы задали, нет «хорошего» ответа.

Спецификация HTTP технически не допускает этого, но на практике большинство браузеров будут эффективно «вывести пользователя из системы», если вы отправите им еще 401. На php.net/http-auth:

Как Netscape Navigator, так и Internet Explorer очистят кеш аутентификации локального браузера для области после получения ответа сервера 401. Это может эффективно «выйти из системы» пользователя, заставив их повторно ввести свое имя пользователя и пароль , Некоторые люди используют это для «тайм-аута» входа в систему или предоставляют кнопку «выхода из системы».

Из кода, самый простой способ, вероятно, что-то вроде:

function logout(){ 
    header('HTTP/1.1 401 Unauthorized'); 
    return true; 
} 

, но, опять же, это не на самом деле что-то одобрял спецификацией HTTP.

+0

Работает, но страница выхода из системы запрашивает логин. и не может войти через него. На самом деле я вообще не могу войти. о, это меня вышло из строя, просто не могу войти снова. Он также должен был давать только заголовок («HTTP/1.1 401 Unauthorized»); нет www-autherticate снова. –

+0

Полезно знать, я не был уверен, что дайджест потребовал этого - я еще не реализовал Дайджест в чем-то своем. – TML

+0

Я нахожу, что что-то вроде следующих работ прекрасно подходит для меня: http: // codepad.org/BUJvSmnm Обратите внимание, что в моем случае я нашел хотя бы один браузер (Firefox 3.6), для которого DID требуется заголовок WWW-Authenticate в logout(), поэтому я сохраняю сгенерированный uniqid() в $ _SESSION для использования в заголовке выхода. – TML

6

Авторитетный ответ: http://tools.ietf.org/id/draft-ietf-httpbis-p7-auth-12.txt - раздел 6.1
Нет надежного способа.

Некоторые обходные пути включают подделку 401 и изменение realm = или подтверждение запроса AJAX auth с целенаправленно недействительными учетными данными.

+0

Возможно, стоит отметить, что соответствующий раздел этого документа IETF Draft - 6.1: Аутентификационные учетные данные и Idle Clients – TML

+0

php code, пожалуйста? –

+0

@JamesM: вам нужно инициировать это через jQuery, чтобы не отображать диалоговое окно входа в систему. Запросите отдельный 'logout1.php', который, например, отправляет 'header (« Status: 401 Logout »)' и 'header (« WWW-Authenticate: Invalidate, Basic realm = logout »)'. Опционально второй вызов AJAX с недопустимыми учетными данными для 'logout2.php', который подтверждает его без проверки. – mario

Смежные вопросы