6

Gibt es eine Möglichkeit, eine Digest-Authentifizierung in PHP abgemeldet.PHP Digest auth, Logout

Ich habe versucht, unset ($ _ SERVER ["PHP_AUTH_DIGEST"]); Aber es wird nicht gebeten, sich erneut anzumelden. Ich weiß, wenn ich den Browser schließe, dann wird es funktionieren und hier sind meine Funktionen.

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

Was muss ich die Abmeldefunktion hinzuzufügen, dies zu erledigen.

Wenn ich den Bereich ändern, funktioniert es, aber ich möchte nicht geändert werden.

+0

Duplikat von [HTTP-Authentifizierungsabmeldung über PHP] (http://stackoverflow.com/questions/449788/http-authentication-logout-via-php). Die Antwort: Nr. – netcoder

+0

Ich weiß, es kann getan werden, nur nicht sicher, wie. –

+0

Schließen Sie den Browser ist die einzige Möglichkeit, wie die Informationen im Browser registriert ist – ajreal

Antwort

10

Das Deaktivieren von $ _SERVER ['PHP_AUTH_DIGEST'] hat keine Auswirkungen. Das Problem ist, es gibt nicht wirklich eine "gute" Antwort auf die Aufgabe, die Sie gestellt haben.

Die HTTP-Spezifikation für technisch nicht erlaubt es, aber in der Praxis wird „log der Benutzer aus“ Die meisten Browser da draußen effektiv, wenn man sie ein anderes 401. Per php.net/http-auth senden:

Sowohl Netscape Navigator als auch Internet Explorer löschen den Authentifizierungscache des lokalen Browserfensters für den Realm nach Erhalt einer Serverantwort von 401. Dies kann einen Benutzer effektiv "ausloggen" und ihn dazu zwingen, seinen Benutzernamen und sein Passwort erneut einzugeben . Einige Leute verwenden dies, um Anmeldungen "auszumerzen" oder einen "Abmelden" -Button bereitzustellen.

aus dem Code, ist die einfachste Methode ist wahrscheinlich so etwas wie:

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

, aber auch hier, das ist etwas eigentlich nicht die Spezifikation, die von der HTTP genehmigt.

+0

Es funktioniert, aber die Abmeldeseite fordert zur Anmeldung auf. und kann sich nicht einloggen. Tatsächlich kann ich mich überhaupt nicht einloggen. Oh, es hat mich ausgeloggt, ich kann mich einfach nicht mehr einloggen. Es musste auch nur Header geben ("HTTP/1.1 401 Unauthorized"); kein www-authorticate wieder. –

+0

Gut zu wissen, ich war mir nicht sicher, ob Digest das verlangte - ich habe Digest noch nicht in meinem eigenen Programm implementiert. – TML

+0

Ich finde, dass etwas wie das Folgende gut für mich funktioniert: http: // Codepad.org/BUJvSmnm Beachten Sie, dass ich in meinem Fall mindestens einen Browser (Firefox 3.6) gefunden habe, der den WWW-Authenticate-Header in logout() benötigt, also behalte ich das generierte uniqid() in $ _SESSION zur Verwendung bei in der Abmeldungs-Kopfzeile. – TML

6

Autoritative Antwort: http://tools.ietf.org/id/draft-ietf-httpbis-p7-auth-12.txt - Abschnitt 6.1
Es gibt keinen zuverlässigen Weg.

Einige Problemumgehungen umfassen das Vortäuschen eines 401 und das Ändern des Bereichs = oder das Bestätigen einer AJAX-Authentifizierungsanforderung mit absichtlich ungültigen Anmeldeinformationen.

+0

Es ist wahrscheinlich erwähnenswert, dass der relevante Abschnitt dieses IETF Draft Dokument ist 6.1: Authentication Credentials und Idle Clients – TML

+0

PHP-Code bitte? –

+0

@JamesM: Sie müssen dies über jQuery initiieren, damit kein Anmeldedialog angezeigt wird. Fordern Sie eine separate "logout1.php" an, die z. sendet 'header (" Status: 401 Logout ")' und 'header (" WWW-Authenticate: Ungültig, Basic realm = logout ")'. Optional ein zweiter AJAX-Aufruf mit ungültigen Anmeldeinformationen für "logout2.php", der dies ohne Überprüfung bestätigt. – mario