Domanda

C'è un modo per disconnessione di un'autenticazione digest fatto in php.

Ho cercato unset ($ _ SERVER [ "PHP_AUTH_DIGEST"]); Ma non lo chiedo di nuovo login. So che se chiudo il browser allora funzionerà e qui sono le mie funzioni.

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

Che altro ho bisogno di aggiungere alla funzione di logout per finire questo off.

Se cambio il regno funziona, ma non voglio essere cambiato.

È stato utile?

Soluzione

Il disinserimento $ _SERVER [ 'PHP_AUTH_DIGEST'] non avrà alcun effetto. Il problema è che non c'è davvero una "buona" risposta al compito che hai impostato.

La specifica HTTP non tecnicamente consentono di esso, ma in pratica, la maggior parte dei browser là fuori sarà effettivamente "scollegare l'utente" se si inviano loro un altro 401. Per php.net/http-auth:

  

Sia Netscape Navigator e Internet Explorer saranno cancellare la cache di autenticazione della finestra del browser locale per il regno dopo aver ricevuto una risposta del server di 401. Questo può efficacemente "log out" di un utente, costringendoli a re-inserire il proprio nome utente e password. Alcune persone usano questo per "time out" i login, o fornire un pulsante "log-out".

dal codice, il metodo più semplice è probabilmente qualcosa come:

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

, ma, ancora una volta, questo non è in realtà qualcosa approvato dalle specifiche HTTP.

Altri suggerimenti

risposta autorevole: http: //tools.ietf .org / id / draft-ietf-httpbis-p7-auth-12.txt - paragrafo 6.1
Non v'è alcun modo affidabile.

Alcune soluzioni includono fingendo un 401 e cambiando il regno =, o riconoscere una richiesta di autenticazione AJAX con le credenziali di proposito non valide.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top