PHP Digest аутентификация, выход - PullRequest
6 голосов
/ 05 января 2011

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

Я попытался сбросить ($ _ 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;
    }

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

Ответы [ 2 ]

11 голосов
/ 05 января 2011

Сброс $ _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.

6 голосов
/ 05 января 2011

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

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

...