Вопрос

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

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

    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;
    }

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

Если я изменим царство, это работает, но я не хочу, чтобы это было изменено.

Это было полезно?

Решение

Unsetting $ _server ['php_auth_digest'] не будет влиять. Проблема в том, что на эту задачу не совсем «хороший» ответ.

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

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

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

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

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top