6

Esiste un modo per disconnettersi dall'autenticazione digest effettuata in php.PHP Digest auth, logout

Ho provato unset ($ _ SERVER ["PHP_AUTH_DIGEST"]); Ma non chiederà di relogin. So che se chiudo il browser allora funzionerà e qui ci 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; 
    } 

Cos'altro ho bisogno di aggiungere alla funzione di logout per terminarlo.

Se cambio il dominio funziona ma non voglio che venga modificato.

+0

Duplicazione di [Logout di autenticazione HTTP tramite PHP] (http://stackoverflow.com/questions/449788/http-authentication-logout-via-php). La risposta: No. – netcoder

+0

So che si può fare, ma non so come. –

+0

chiudi il browser è l'unico modo, dato che le informazioni sono registrate nel browser – ajreal

risposta

10

Il blocco $ _SERVER ['PHP_AUTH_DIGEST'] non ha alcun effetto. Il problema è che non c'è una risposta "buona" all'attività 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 che Internet Explorer cancellano la cache di autenticazione della finestra del browser locale per il dominio ricevendo una risposta del server di 401. Questo può effettivamente "disconnettere" un utente, costringendoli a reinserire il nome utente e la password . Alcune persone usano questo per "timeout" accessi o forniscono un pulsante di "disconnessione".

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

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

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

+0

Funziona ma la pagina di disconnessione richiede di accedere. e non può accedere tramite esso. In effetti, non riesco a collegarmi affatto. oh mi ha disconnesso, ma non riesco ancora ad accedere. Doveva anche dare solo intestazione ("HTTP/1.1 401 non autorizzato"); no www-autherticate di nuovo. –

+0

Buono a sapersi, non ero sicuro che Digest lo richiedesse - Non ho ancora implementato Digest in qualcosa di mio. – TML

+0

Trovo che qualcosa come il seguente funzioni bene per me: http: // codepad.org/BUJvSmnm Nota che, nel mio caso, ho trovato almeno un browser (Firefox 3.6) che DID richiede l'intestazione WWW-Authenticate in logout(), quindi sto persistendo l'unqid() generato in $ _SESSION per l'uso nell'intestazione di disconnessione. – TML

6

Risposta autorevole: http://tools.ietf.org/id/draft-ietf-httpbis-p7-auth-12.txt - sezione 6.1
Non esiste un modo affidabile.

Alcune soluzioni includono la simulazione di un 401 e la modifica del dominio =, o il riconoscimento di una richiesta di autorizzazione AJAX con credenziali volutamente non valide.

+0

Probabilmente è importante notare che la sezione pertinente di questo documento IETF Draft è 6.1: Credenziali di autenticazione e codice in idle – TML

+0

php per favore? –

+0

@JamesM: è necessario avviare questo tramite jQuery per non mostrare una finestra di dialogo di accesso. Richiedi un separato logout1.php che ad es. invia 'header (" Stato: 401 Logout ")' e 'header (" WWW-Authenticate: Invalidate, Basic realm = logout ")'. Opzionalmente una seconda chiamata AJAX con credenziali non valide a 'logout2.php' che la riconosce senza controllo. – mario