155 votes

Déconnexion d'authentification HTTP via PHP

Ce qui est la façon correcte de se déconnecter de l’authentification HTTP protégé dossier ?

Il existe des solutions qui peuvent atteindre cet objectif, mais ils sont potentiellement dangereux car ils peuvent être buggé ou ne fonctionnent pas dans certaines situations / navigateurs. C’est pourquoi je suis à la recherche d’une solution correcte et propre.

103voto

Piskvor Points 46986

Mu. Il n'y a pas moyen n'existe pas, même pas une seule qui soit compatible sur tous les navigateurs.

C'est un problème qui vient de la spécification HTTP (section 15.6):

HTTP existants les clients et les agents d'utilisateur conserve en général d'authentification informations indéfiniment. HTTP/1.1. ne pas fournir une méthode pour un serveur pour diriger les clients à jeter ces informations d'identification mises en cache.

D'autre part, la section 10.4.2 dit:

Si la demande déjà inclus Autorisation des informations d'identification, puis l'autoroute 401 la réponse indique que l'autorisation a été refusée pour ceux les informations d'identification. Si la réponse 401 contient le même défi que les avant l'intervention, et l'agent utilisateur a déjà tenté l'authentification au moins une fois, alors l'utilisateur DOIT être présenté le entité qui a été donné dans la réponse, puisque cette entité pourrait inclure les informations de diagnostic.

En d'autres termes, vous pouvez être en mesure d'afficher la boîte de dialogue de connexion de nouveau (comme @Karsten dit), mais le navigateur ne dispose pas de l'honneur de votre demande - afin de ne pas dépendre de ce (sig)en fonction de trop.

62voto

porneL Points 42805

Méthode qui fonctionne bien dans Safari. Fonctionne également sous Firefox et Opera, mais avec un avertissement.

Cela indique le navigateur pour ouvrir une URL avec le nouveau nom d’utilisateur, la substitution précédente.

47voto

Jonathan Hanson Points 628

La réponse simple est que vous ne pouvez pas fiable déconnecter de l'authentification http.

La réponse longue:
Http-auth (comme le reste de la spécification HTTP) est destiné à être apatrides. Afin d'être "connecté" ou "déconnecté" n'est pas vraiment un concept qui a du sens. La meilleure façon de le voir est de demander, pour chaque requête HTTP (et n'oubliez pas de chargement de page est généralement de plusieurs demandes), "êtes-vous autorisé à faire ce que vous demandez?". Le serveur voit chaque demande en tant que nouveau et non lié à toutes les demandes précédentes.

Les navigateurs ont choisi de se rappeler les informations d'identification que vous dites sur la première 401, et ré-envoyer l'insu de l'utilisateur la permission explicite sur les demandes ultérieures. C'est une tentative de donner à l'utilisateur la "connecté/déconnecté" modèle qu'ils attendent, mais c'est purement une bidouille. C'est le navigateur qui est la simulation de cette persistance de l'état. Le serveur web est totalement inconscient.

Afin de "se déconnecter", dans le contexte de http-auth est purement une simulation fournie par le navigateur, et donc en dehors de l'autorité du serveur.

Oui, il y a kludges. Mais ils cassent RESTful-ness (si c'est de la valeur pour vous) et ils ne sont pas fiables.

Si vous avez absolument besoin d'un connecté/déconnecté (e modèle pour votre site d'authentification, le meilleur pari est un cookie de suivi, avec la persistance de l'état stocké sur le serveur (mysql, sqlite, fichier plat, etc). Cela exigera que toutes les demandes soient évaluées, par exemple, avec PHP.

27voto

Anton Mochalin Points 141

Solution de contournement

Vous pouvez le faire à l'aide de Javascript:

<html><head>
<script type="text/javascript">
function logout() {
    var xmlhttp;
    if (window.XMLHttpRequest) {
          xmlhttp = new XMLHttpRequest();
    }
    // code for IE
    else if (window.ActiveXObject) {
      xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    if (window.ActiveXObject) {
      // IE clear HTTP Authentication
      document.execCommand("ClearAuthenticationCache");
      window.location.href='http://stackoverflow.com/where/to/redirect';
    } else {
        xmlhttp.open("GET", '/path/that/will/return/200/OK', true, "logout", "logout");
        xmlhttp.send("");
        xmlhttp.onreadystatechange = function() {
            if (xmlhttp.readyState == 4) {window.location.href='http://stackoverflow.com/where/to/redirect';}
        }


    }


    return false;
}
</script>
</head>
<body>
<a href="#" onclick="logout();">Log out</a>
</body>
</html>

Ce qui est fait ci-dessus est:

  • pour IE - clair juste auth-cache et de rediriger quelque part

  • pour les autres navigateurs - envoyer un XMLHttpRequest les coulisses de avec "déconnexion" nom de connexion et mot de passe. Nous avons besoin de l'envoyer à un certain chemin qui sera de retour de 200 OK pour cette demande (c'est à dire qu'il ne devrait pas exiger l'authentification HTTP).

Remplacer '/where/to/redirect' avec le chemin de redirection après la connexion et de remplacer '/path/that/will/return/200/OK' avec le chemin sur votre site, qui sera de retour de 200 OK.

13voto

Karsten Points 8168

Solution de contournement (pas un propre, agréable (ou même travailler ! voir commentaires) solution) :

Désactiver ses informations d’identification une fois.

Vous pouvez déplacer votre logique d’authentification HTTP de PHP en envoyant les en-têtes appropriés (si non connecté) :

Et l’analyse de l’entrée avec :

Donc désactiver ses informations d’identification une fois devrait être négligeable.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X