Question

Y at-il un moyen d'authentification d'une déconnexion digest fait en php.

J'ai essayé unset ($ _ SERVER [ "PHP_AUTH_DIGEST"]); Mais il demande l'habitude de relogin. Je sais que si je ferme le navigateur alors il fonctionnera et voici mes fonctions.

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

Que dois-je ajouter à la fonction de fermeture de session pour terminer ceci.

Si je change le royaume il fonctionne, mais je ne veux pas qu'il soit changé.

Était-ce utile?

La solution

$ _SERVER Débranchement [ 'PHP_AUTH_DIGEST'] n'a aucun effet. Le problème est, il n'y a pas vraiment une « bonne » réponse à la tâche que vous avez défini.

La spécification HTTP ne permet pas techniquement pour cela, mais dans la pratique, la plupart des navigateurs là-bas va effectivement « déconnecter l'utilisateur » si vous les envoyez un autre 401. Par php.net/http-auth:

  

Netscape Navigator et Internet Explorer effaceront le cache d'authentification de la fenêtre du navigateur local pour le domaine lors de la réception d'une réponse du serveur 401. Cela peut effectivement « déconnecter » un utilisateur, les forçant à entrer de nouveau leur nom d'utilisateur et mot de passe. Certaines personnes l'utilisent pour "time out", ou de fournir un bouton "log-out".

A partir de votre code, la méthode la plus simple est probablement quelque chose comme:

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

mais, encore une fois, ce n'est pas en fait quelque chose approuvé par la spécification HTTP.

Autres conseils

Réponse Autoritaire: http: //tools.ietf .org / id / draft-ietf-httpbis-p7-auth-12.txt - section 6.1
Il n'y a aucun moyen fiable.

Certains comprennent des solutions de contournement truquer un 401 et changer le domaine =, ou reconnaître une demande d'AJAX avec des informations d'identification non valides volontairement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top