Quelle est la bonne façon de se déconnecter du dossier protégé par authentification HTTP?
Il existe des solutions de contournement qui peuvent y parvenir, mais elles sont potentiellement dangereuses car elles peuvent être boguées ou ne pas fonctionner dans certaines situations / navigateurs. C'est pourquoi je recherche une solution correcte et propre.
Miscellaneous -> Clear Private Data -> HTTP Authentication
Réponses:
Mu. Il n'existe aucune méthode correcte , même pas cohérente entre les navigateurs.
C'est un problème qui vient de la spécification HTTP (section 15.6):
D'autre part, la section 10.4.2 dit:
En d'autres termes, vous pourrez peut-être afficher à nouveau la boîte de connexion (comme le dit @Karsten ), mais le navigateur n'a pas à honorer votre demande - alors ne dépendez pas trop de cette (mauvaise) fonctionnalité.
la source
Méthode qui fonctionne bien dans Safari. Fonctionne également dans Firefox et Opera, mais avec un avertissement.
Cela indique au navigateur d'ouvrir l'URL avec un nouveau nom d'utilisateur, en remplaçant le précédent.
la source
user:password@host
est obsolète. Utiliser uniquementhttp://[email protected]/
n'est pas et devrait fonctionner dans la plupart des cas.La réponse simple est que vous ne pouvez pas vous déconnecter de manière fiable de l'authentification http.
La réponse longue:
Http-auth (comme le reste de la spécification HTTP) est censé être sans état. Donc ê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 rappelez-vous qu'une page est généralement chargée en plusieurs requêtes), "êtes-vous autorisé à faire ce que vous demandez?". Le serveur considère chaque demande comme nouvelle et sans rapport avec les demandes précédentes.
Les navigateurs ont choisi de se souvenir des informations d'identification que vous leur avez fournies sur le premier 401 et de les renvoyer sans l'autorisation explicite de l'utilisateur sur les demandes suivantes. Il s'agit d'une tentative de donner à l'utilisateur le modèle «connecté / déconnecté» auquel il s'attend, mais c'est purement un kludge. C'est le navigateur qui simule cette persistance d'état. Le serveur Web n'en est absolument pas conscient.
Donc "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 des kludges. Mais ils cassent RESTful-ness (si cela vous intéresse) et ils ne sont pas fiables.
Si vous avez absolument besoin d'un modèle connecté / déconnecté pour l'authentification de votre site, le meilleur pari est un cookie de suivi, avec la persistance de l'état stocké sur le serveur d'une manière ou d'une autre (mysql, sqlite, flatfile, etc.). Cela nécessitera que toutes les demandes soient évaluées, par exemple, avec PHP.
la source
solution de contournement
Vous pouvez le faire en utilisant Javascript:
Ce qui est fait ci-dessus est:
pour IE - effacez simplement le cache d'authentification et redirigez quelque part
pour les autres navigateurs - envoyez une requête XMLHttpRequest dans les coulisses avec le nom de connexion et le mot de passe «déconnexion». Nous devons l'envoyer à un chemin qui renverra 200 OK à cette demande (c'est-à-dire qu'il ne devrait pas nécessiter d'authentification HTTP).
Remplacez
'/where/to/redirect'
par un chemin vers'/path/that/will/return/200/OK'
lequel rediriger après la déconnexion et remplacez-le par un chemin sur votre site qui renverra 200 OK.la source
Solution de contournement (pas une solution propre, agréable (ou même fonctionnelle! Voir les commentaires)):
Désactivez ses informations d'identification une fois.
Vous pouvez déplacer votre logique d'authentification HTTP vers PHP en envoyant les en-têtes appropriés (si vous n'êtes pas connecté):
Et analyser l'entrée avec:
Donc, désactiver ses informations d'identification une fois devrait être trivial.
la source
Déconnexion de HTTP Basic Auth en deux étapes
Disons que j'ai un domaine HTTP Basic Auth nommé «Password protected» et que Bob est connecté. Pour me déconnecter, je fais 2 requêtes AJAX:
WWW-Authenticate: Basic realm="Password protected"
À ce stade, le navigateur a oublié les informations d'identification de Bob.
la source
Ma solution au problème est la suivante. Vous pouvez trouver la fonction
http_digest_parse
,$realm
et$users
dans le deuxième exemple de cette page: http://php.net/manual/en/features.http-auth.php .la source
En règle générale, une fois qu'un navigateur a demandé à l'utilisateur des informations d'identification et les a fournies à un site Web particulier, il continuera à le faire sans autre invite. Contrairement aux différentes façons dont vous pouvez effacer les cookies côté client, je ne connais pas de manière similaire de demander au navigateur d'oublier les informations d'authentification fournies.
la source
Trac - par défaut - utilise également l'authentification HTTP. La déconnexion ne fonctionne pas et ne peut pas être corrigée:
De: http://trac.edgewall.org/ticket/791#comment:103
On dirait qu'il n'y a pas de réponse fonctionnelle à la question, ce problème a été signalé il y a sept ans et c'est parfaitement logique: HTTP est sans état. Soit une demande est effectuée avec des informations d'authentification ou non. Mais c'est une question du client qui envoie la demande, pas du serveur qui la reçoit. Le serveur peut seulement dire si un URI de demande a besoin d'une autorisation ou non.
la source
J'avais besoin de réinitialiser l'autorisation .htaccess, j'ai donc utilisé ceci:
Trouvé ici: http://php.net/manual/en/features.http-auth.php
Allez comprendre.
Un certain nombre de solutions résident sur cette page et il note même en bas: Lynx, ne supprime pas l'authentification comme les autres navigateurs;)
Je l'ai testé sur mes navigateurs installés et une fois fermé, chaque navigateur semble nécessiter une réautorisation lors de la réentrée.
la source
WWW-Authenticate
causait le problème, me débarrassant de ce qui m'a déconnecté automatiquement.WWW-Authenticate
tout en résolvant le problème dans un navigateur (Chrome) oblige un autre navigateur (Firefox) à mémoriser les informations d'identification et à les envoyer à la demande suivante, ce qui entraîne une reconnexion automatique! Argh!Ce n'est peut-être pas la solution recherchée mais je l'ai résolue comme ça. J'ai 2 scripts pour le processus de déconnexion.
logout.php
log.php
De cette façon, je ne reçois pas d'avertissement et ma session est terminée
la source
AFAIK, il n'y a pas de moyen propre d'implémenter une fonction de "déconnexion" lors de l'utilisation de l'authentification htaccess (c'est-à-dire basée sur HTTP).
En effet, une telle authentification utilise le code d'erreur HTTP «401» pour indiquer au navigateur que des informations d'identification sont requises, auquel cas le navigateur invite l'utilisateur à fournir les détails. À partir de là, jusqu'à ce que le navigateur soit fermé, il enverra toujours les informations d'identification sans autre invite.
la source
La meilleure solution que j'ai trouvée jusqu'à présent est (c'est une sorte de pseudo-code, la
$isLoggedIn
pseudo variable est pour http auth):Au moment de la "déconnexion", enregistrez simplement des informations sur la session indiquant que l'utilisateur est réellement déconnecté.
À l'endroit où je vérifie l'authentification, j'étends la condition:
La session est quelque peu liée à l'état de l'authentification http, de sorte que l'utilisateur reste déconnecté tant qu'il garde le navigateur ouvert et tant que l'authentification http persiste dans le navigateur.
la source
Peut-être que je rate le point.
Le moyen le plus fiable que j'ai trouvé pour mettre fin à l'authentification HTTP est de fermer le navigateur et toutes les fenêtres du navigateur. Vous pouvez fermer une fenêtre de navigateur en utilisant Javascript mais je ne pense pas que vous puissiez fermer toutes les fenêtres de navigateur.
la source
Le seul moyen efficace que j'ai trouvé pour effacer les informations d'identification
PHP_AUTH_DIGEST
ouPHP_AUTH_USER
ANDPHP_AUTH_PW
est d'appeler l'en-têteHTTP/1.1 401 Unauthorized
.la source
Alors que les autres ont raison de dire qu'il est impossible de se déconnecter de l'authentification http de base, il existe des moyens d'implémenter l'authentification qui se comportent de manière similaire. Une approche évidente consiste à utiliser auth_memcookie . Si vous voulez vraiment implémenter l'authentification HTTP de base (c'est-à-dire utiliser les boîtes de dialogue du navigateur pour vous connecter plutôt qu'un formulaire HTTP) en utilisant ceci - définissez simplement l'authentification sur un répertoire protégé .htaccess séparé contenant un script PHP qui redirige vers l'endroit où l'utilisateur est venu après création de la session Memcache.
la source
Il y a beaucoup de réponses géniales - complexes - ici. Dans mon cas particulier, j'ai trouvé une solution simple et claire pour la déconnexion. Je n'ai pas encore testé dans Edge. Sur ma page à laquelle je me suis connecté, j'ai placé un lien de déconnexion similaire à celui-ci:
Et dans la tête de cette page logout.html (qui est également protégée par le .htaccess), j'ai un rafraîchissement de page similaire à celui-ci:
Où vous laisseriez les mots «déconnexion» en place pour effacer le nom d'utilisateur et le mot de passe mis en cache pour le site.
J'admets que si plusieurs pages devaient pouvoir être directement connectées depuis le début, chacun de ces points d'entrée aurait besoin de sa propre page logout.html correspondante. Sinon, vous pouvez centraliser la déconnexion en introduisant une étape de contrôleur d'accès supplémentaire dans le processus avant l'invite de connexion réelle, ce qui nécessite la saisie d'une phrase pour atteindre une destination de connexion.
la source