Frage

Gibt es eine Möglichkeit, eine in PHP durchgeführte Digest -Authentifizierung abzumelden?

Ich habe es ausprobiert ($ _ Server ["php_auth_Digest"]); Aber es wird nicht nach Relogin fragen. Ich weiß, wenn ich den Browser schließe, 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 mehr zur Abmeldenfunktion hinzufügen, um dies zu beenden?

Wenn ich das Reich ändere, funktioniert es, aber ich möchte nicht, dass es geändert wird.

War es hilfreich?

Lösung

Uneingestaltet $ _server ['php_auth_Digest'] hat keinen Einfluss. Das Problem ist, dass es nicht wirklich eine "gute" Antwort auf die Aufgabe gibt, die Sie festgelegt haben.

Die HTTP-Spezifikation erlaubt dies technisch nicht, aber in der Praxis werden die meisten Browser dort effektiv "den Benutzer auszeichnen", wenn Sie ihnen ein weiteres 401 senden. Pro php.net/http-auth:

Sowohl Netscape Navigator als auch Internet Explorer werden den Authentifizierungs-Cache des lokalen Browserfensters für das Reich löern, wenn sie eine Serverantwort von 401 erhalten. Dies kann effektiv einen Benutzer abmelden und ihn dazu zwingen, seinen Benutzernamen und sein Passwort erneut einzugeben. Einige Leute verwenden dies, um sich zu "Zeiten" -Logins oder eine "Anmeldung" -Taste bereitstellen.

Aus Ihrem Code ist die einfachste Methode wahrscheinlich so etwas wie:

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

Dies ist jedoch wiederum nicht etwas, das von der HTTP -Spezifikation zugelassen ist.

Andere Tipps

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 Fälschen eines 401 und das Ändern des Bereichs = oder die Anerkennung einer AJAX -Auth -Anforderung mit absichtlich ungültigen Anmeldeinformationen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top