L'authentification HTTP de déconnexion via PHP
Quel est le corriger méthode de connexion de l'authentification HTTP dossier protégé?
Il y a des solutions qui peuvent atteindre cet objectif, mais ils sont potentiellement dangereux, car ils peuvent être buggy ou ne fonctionnent pas dans certaines circonstances et dans certains navigateurs. C'est pourquoi je suis à la recherche d'correcte et propre solution.
- Veuillez préciser le but de votre déconnexion. Cela devrait-il être forcé de déconnexion (l'utilisateur de désactivation)? Simple fonction de déconnexion de l'utilisateur? Quelque chose d'autre?
- Je ne comprends pas pourquoi cela est important, mais il est deux cas: désactivation basé sur des conditions d'application typiques de bouton de déconnexion. Veuillez expliquer pourquoi il est important, je vais le modifier directement dans la question.
- Le "correct et propre solution" serait navigateurs ayant leur propre bouton de déconnexion que lorsque l'on clique dessus, fera le navigateur arrêter l'envoi de la Auth-têtes... On peut rêver, non?
- Développeur Web de la Barre d'outils a "bouton".
- Ce que Josef dit: web developer toolbar pour Firefox ->
Miscellaneous -> Clear Private Data -> HTTP Authentication
Vous devez vous connecter pour publier un commentaire.
Mu. Pas de manière correcte existe, 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):
D'autre part, la section 10.4.2 dit:
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 n'est pas à l'honneur de votre demande - afin de ne pas dépendre de ce (sig)en fonction de trop.
Méthode qui fonctionne très bien dans Safari. Fonctionne aussi dans Firefox et Opera, mais avec un avertissement.
Cette raconte le navigateur pour ouvrir une URL avec un nouveau nom d'utilisateur, remplaçant la précédente.
user:password@host
est obsolète. En utilisant seulementhttp://[email protected]/
n'est pas et devrait fonctionner dans la plupart des cas.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.
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 c'est la simulation de cette persistance de l'état. Le serveur web est complètement ignorant de lui.
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, d'une certaine manière (mysql, sqlite, fichier plat, etc). Cela exigera que toutes les demandes soient évaluées, par exemple, avec PHP.
Solution de contournement
Vous pouvez le faire à l'aide de Javascript:
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 certains de chemin d'accès sur votre site, qui sera de retour de 200 OK.Solution de contournement (pas un propre, agréable (ou même en travaillant! voir les commentaires) de la solution):
Désactiver ses identifiants qu'une seule fois.
Vous pouvez déplacer votre HTTP logique d'authentification en PHP, par l'envoi d'en-têtes appropriés (si ce n'est connecté):
Et l'analyse de l'entrée avec:
Si la désactivation de ses lettres de créance un temps devrait être assez simple.
Déconnexion à partir de l'adresse HTTP de Base d'Authentification en deux étapes
Disons que j'ai une HTTP Basic Auth domaine nommé “Mot de passe protégé”, et Bob est connecté. Pour vous déconnecter je fais 2 requêtes AJAX:
WWW-Authenticate: Basic realm="Password protected"
À ce point de navigateur oublié de Bob informations d'identification.
Ma solution pour le problème est le suivant. 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.Généralement, une fois qu'un navigateur est demandé à l'utilisateur des informations d'identification et leur a fourni à un site web particulier, il va continuer à le faire sans demander de confirmation. Contrairement aux différents moyens que vous pouvez effacer les cookies sur le côté client, je ne sais pas d'une manière similaire à demander au navigateur d'oublier son fourni des informations d'authentification.
Trac, par défaut, utilise l'Authentification HTTP ainsi. Déconnexion ne fonctionne pas et ne peut pas être fixé:
À partir de: http://trac.edgewall.org/ticket/791#comment:103
Dirait qu'il n'y a pas de travail, de répondre à la question, que le problème a été signalé il y a sept ans et il a le sens parfait: HTTP est sans état. Une demande est faite avec les informations d'authentification ou pas. Mais c'est une question de la client l'envoi de la demande, et non pas le serveur de réception. Le serveur ne peut dire si l'URI de la requête a besoin d'une autorisation ou pas.
J'avais besoin de le réinitialiser .htaccess autorisation, alors j'ai utilisé ceci:
Trouvé ici :
http://php.net/manual/en/features.http-auth.php
Allez comprendre.
Un certain nombre de solutions de résider sur cette page et les notes au bas: le Lynx, n'est pas évident de l'auth comme les autres navigateurs 😉
Je l'ai testé sur mes navigateurs installés et une fois fermé, chaque navigateur semble que de manière cohérente nécessite reauth sur la rentrée.
WWW-Authenticate
a été à l'origine du problème, de se débarrasser de ce connecté à me sortir automatiquement.WWW-Authenticate
le temps de régler le problème dans un navigateur (Chrome) provoque un autre navigateur (Firefox) afin de mémoriser les informations d'identification et de les envoyer sur la demande suivante, ce qui entraîne un renouvellement automatique de connexion! Argh!Ce peut-être pas la solution qui a été cherché mais je l'ai résolu comme ça.
j'ai 2 scripts pour le processus de fermeture de session.
logout.php
log.php
De cette façon, je n'obtiens pas un avertissement et ma session est terminée
Autant que je sache, il n'y a pas de propre façon de mettre en œuvre une "déconnexion" de la fonction lors de l'utilisation de htaccess (c'est à dire basé sur HTTP) d'authentification.
C'est parce que l'authentification utilise le code d'erreur HTTP '401' pour dire au navigateur que les informations d'identification sont nécessaires, à quel point le navigateur demande à l'utilisateur pour plus de détails. À partir de là, jusqu'à ce que le navigateur est fermé, il sera toujours envoyer les informations d'identification sans donner d'autres indications.
La meilleure solution que j'ai trouvé pour l'instant est (c'est une sorte de pseudo-code, la
$isLoggedIn
est de la pseudo variable pour http auth):Au moment de la "déconnexion" juste stocker des informations pour la session en disant que l'utilisateur est déconnecté.
Dans l'endroit où je l'ai vérifier pour l'authentification-je développer la condition:
Session est un peu liée à l'état de l'authentification http de sorte que l'utilisateur reste connecté aussi longtemps qu'il garde le navigateur est ouvert et aussi longtemps que l'authentification http persiste dans le navigateur.
Peut-être que je manque 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 à l'aide de Javascript, mais je ne pense pas que vous pouvez fermer toutes les fenêtres du navigateur.
Tandis que les autres ont raison de dire qu'il est impossible de déconnexion de l'authentification http de base, il existe des moyens pour mettre en œuvre l'authentification qui se comporter de la même façon. Manifestement, l'un des appeoach est d'utiliser auth_memcookie. Si vous voulez vraiment mettre en œuvre une authentification HTTP Basique (c'est à dire utiliser le navigateur boîtes de dialogue pour l'enregistrement dans trather qu'un formulaire HTTP) à l'aide de ce - il suffit de définir l'authentification à un autre .htaccess protégé répertoire contenant un script PHP qui redirige vers où te l'utilisateur est venu après createing la memcache session.
Le seul moyen efficace que j'ai trouvé pour effacer le
PHP_AUTH_DIGEST
ouPHP_AUTH_USER
ETPHP_AUTH_PW
informations d'identification est l'appel de l'en-têteHTTP/1.1 401 Unauthorized
.Il y a beaucoup de super - complexe - des réponses ici. Dans mon cas particulier, j'ai trouvé un endroit propre et simple correctif pour la déconnexion. Je n'ai pas encore tester en Bordure.
Sur ma page que j'ai connecté à, j'ai placé un lien de déconnexion similaire à ceci:
Et dans la tête de qui logout.html page (qui est également protégé par la .htaccess) j'ai un rafraichissement de la page similaire à ceci:
Où vous laissez les mots "déconnexion" en place pour effacer le nom d'utilisateur et le mot de passe mis en cache pour le site.
J'avoue que si plusieurs pages nécessaires pour être en mesure d'être directement connecté à partir du début, chacun de ces points d'entrée ont besoin de leur propre correspondant logout.html page. Sinon, vous pouvez centraliser la déconnexion par l'introduction d'un supplément de gatekeeper étape dans le processus avant l'invite de connexion, nécessitant l'entrée d'une phrase, pour atteindre une destination de connexion.