Pergunta

Existe uma maneira de fazer logout de uma autenticação de digestão feita no PHP.

Eu tentei unset ($ _ server ["php_auth_digest"]); Mas não pedirá para se renovar. Eu sei que se eu fechar o navegador, ele funcionará e aqui estão minhas funções.

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

O que mais preciso adicionar à função de logout para finalizar isso.

Se eu mudar o reino, ele funciona, mas não quero que seja alterado.

Foi útil?

Solução

US $ _server ['php_auth_digest'] não terá efeito. O problema é que não há realmente uma resposta "boa" para a tarefa que você definiu.

A especificação HTTP não permite tecnicamente isso, mas, na prática, a maioria dos navegadores por aí efetivamente "registrará o usuário" se você enviar outro 401. por php.net/http-auth:

O Netscape Navigator e o Internet Explorer limparão o cache de autenticação da janela do navegador local para o reino ao receber uma resposta do servidor de 401. Isso pode efetivamente "registrar" um usuário, forçando-os a entrar novamente em seu nome de usuário e senha. Algumas pessoas usam isso para "tempo out" Logins ou fornecem um botão "log-out".

Do seu código, o método mais simples é provavelmente algo como:

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

Mas, novamente, isso não é realmente algo aprovado pela especificação HTTP.

Outras dicas

Resposta autorizada: http://tools.ietf.org/id/draft-ietf-httpbis-p7-auth-12.txt - Seção 6.1
Não há maneira confiável.

Algumas soluções alternativas incluem fingir um 401 e alterar o reino =, ou reconhecer uma solicitação de autenticação de Ajax com credenciais propositadamente inválidas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top