Mettre fin à une authentification http

Le but du jeu est de mettre fin à une authentificaiton http faite avec le mécanisme des fichiers .htaccess

Tout le monde connait l'authentification http fournie par apache que l'on met en place aisément avec un fichier .htaccess. Vous trouverz tous les détails sur la doc d'apache. Ce type de protection a l'avantage d'être standard mais aussi de protéger tout le contenu d'un répertoire, contrairement aux sessions php.

Mais la question que l'on se pose est comment mettre fin à cette "session" ? Une solution pour le moins bancale est de proposer au visiteur de fermer son navigateur. On oublie tout de suite. Les visiteurs utilisant firefox et l'extension web developer peuvent le faire aussi aisément sans fermer leur navigateur en cliquant sur:

Miscellaneous > Clear Private Data > Clear HTTP Authentification. 

Cette solution n'est pas non plus une solution satisfaisante. Tout le monde n'utilise malheureusement pas encore firefox!

Il n'y a alors pas de solution comme nombreux le prétendent (ils se reconnaitront et ne resteront peut-être pas dans leur ignorance!), allant jusqu'à me modérer parce que j'avais l'affront de prétendre que c'était possible. C'est dur de reconnaitre que l'on a tort et c'est plus facile de ramener la cavalerie pour essayer d'enfoncer la personne qui met un coup de pied dans la fourmillière.

Revenons à nos moutons. Imaginons que nous voulions protéger un répertoire de données confidentielles. En supposant que la configuration d'apache nous y autorise - c'est-à-dire qu'il n'y ait aucun AllowOverride None, il suffit de placer dans le répertoire un fichier .htaccess contenant:

AuthType Basic
AuthName "Private Access By Invitation Only"
AuthUserFile /absolute/path/to/pass.db
Require valid-user

Ce type de protection n'est pas conseillé. On ne met pas le fichier de mot de passe dans le répertoire à protéger; c'ets juste pour la démonstration!

Il faut ensuite créer un fichier de mot de passe avec l'utilitaire htpasswd. J'y ai placé l'identifiant nico avec comme mot de passe nico. On va placer dans ce répertoire un fichier test.php nous donnant le couple identifiant/mot de passe que l'on a entré. Ce couple est accessible à travers le tableau $_SERVER au moyen des clés PHP_AUTH_USER et PHP_AUTH_PW. Je vais aussi créer un script logout.php qui va permettre de mettre fin à cette authentification http. Cette déconnexion se fait en envoyant au navigateur un code http 401 (authentificaiton requise), le même code qu'apache envoie au navigateur à la première tentative d'accès au répertoire. Le code ressemble à ceci:


<?php 
header
('WWW-Authenticate: Basic realm="Private Access By Invitation Only"');
header('HTTP/1.0 401 Unauthorized'); 
echo 
'Texte affiche en cas d\'annulation'
exit();
?>

Vous pouvez maintenant aller voir mes données confidentielles (login: nico mot de passe: nico). Déconnectez-vous, désormais vous ne pouvez plus voir les données confidentielles. Vous pouvez cliquer sur annuler si ça vous chante mais vous serez tout de même déconnecter! N'essayer pas directement d'accéder au répertoire car vous auriez un accès non autorisé car par défaut ma configuration n'autorise pas de lister les répertoires (Options -Indexes)

Notez bien que le realm doit être le même que celui déclaré dans le .htaccess!

Haut de page