Les fonctions d'authentification HTTP de PHP ne sont disponibles que si PHP est exécuté comme module Apache, et non pas sous la forme d'un CGI. Sous cette forme, il est possible d'utiliser la fonction Header() pour demander une authentification ("Authentication Required" ) au client, générant ainsi l'apparition d'une fenêtre de demande d'utilisateur et de mot de passe. Une fois que les champs ont été remplis, l'URL sera de nouveau appelée, avec les variables, $PHP_AUTH_USER, $PHP_AUTH_PW et $PHP_AUTH_TYPE contenant respectivement le nom d'utilisateur, le mot de passe et le type d'authentification. Actuellement, seule l'authentification "Basic" est supportée. Reportez vous à la fonction Header() pour plus d'informations.
Voici un exemple de script qui force l'authentification du client pour accéder à une page :
Un exemple de morceau de script qui forcera l'authentification du client pour une page ressemblera à cela:
Exemple 13-1. HTTP authentification
<?php if(!isset($PHP_AUTH_USER)) { Header("WWW-Authenticate: Basic realm=\"My Realm\""); Header("HTTP/1.0 401 Unauthorized"); echo "Texte à envoyer au client en cas d'annulation \n"; exit; } else { echo "Bonjour $PHP_AUTH_USER.<P>"; echo "Votre mot de passe est $PHP_AUTH_PW.<P>"; } ?>A la place d'afficher simplement les variables globales $PHP_AUTH_USER et $PHP_AUTH_PW, vous préférerez sûrement vérifier la validité du nom d'utilisateur et du mot de passe. Par exemple, en envoyant ces informations à une base de données, ou en recherchant dans un fichier dbm.
Méfiez vous des navigateurs bugées, tels qu'Internet Explorer. Ils semblent très susceptibles concernant l'ordre des entêtes. Envoyer l'entête d'authentification (WWW-Authenticate) avant le code de HTTP/1.0 401 semble lui convenir jusqu'à présent.
Pour éviter que quelqu'un écrive un script qui révèle les mots de passe d'une page, à la quelle on a accédé par une authentification traditionnelle, les variables globales PHP_AUTH ne seront pas assignées si l'authentification externe a été activée pour cette page. Dans ce cas, la variabme $REMOTE_USER peut être utilisée pour identifier l'utilisateur à l'extérieur.
Notez cependant que les manipulations ci-dessus n'empêchent pas quiconque qui possède une page non authentifiée de voler les mots de passes des pages protégées, sur le même serveur.
Netscape et Internet Explorer effaceront les informations d'authentification seront effacées du cache dès que le client recevra une réponse du serveur de type 401. Cela permet de considérer que l'utilisateur s'est déconnecté, ce qui le forcera à ré-entrer ses nom d'utilisateur et mot de passe Certains utilisent cette fonctionnalité pour considérer que la session est terminée, ou bien ils fournissent un bouton de déconnexion.
Exemple 16-2. Authentification HTTP avec nom d'utilisateur/mot de passe forcé
<?php function authenticate() { Header( "WWW-authenticate: basic realm='Test Authentication System'"); Header( "HTTP/1.0 401 non autorisé"); echo "Vous devez entrer un nom d'utilisateur et un mot de passe valide. \n"; exit; } if(!isset($PHP_AUTH_USER) || ($SeenBefore == 1 && !strcmp($OldAuth, $PHP_AUTH_USER)) ) { authenticate(); } else { echo "Bienvenue: $PHP_AUTH_USER<BR>"; echo "Vieux: $OldAuth"; echo "<FORM ACTION=\"$PHP_SELF\" METHOD=POST>\n"; echo "<INPUT TYPE=HIDDEN NAME=\"DejaVu\" VALUE=\"1\">\n"; echo "<INPUT TYPE=HIDDEN NAME=\"VieilAuthentification\" VALUE=\"$PHP_AUTH_USER\">\n"; echo "<INPUT TYPE=Submit VALUE=\"Re Authentification\">\n"; echo "</FORM>\n"; } ?>Ce comportement n'est pas nécessaire par le standard d'authentification HTTP Basic. Les tests avec Lynx ont montré qu'ils n'effacent pas les informations de sessions lors de la réception d'un message de type 401, ce qui fait que passer ces informations entre le serveur et le client, donnera l'accès à la ressource.
Notez aussi que tout ceci ne fonctionne pas sous Microsoft IIS et que les limitations de PHP en version CGI sont dues aux limitations de IIS.
Révisé le :23-Jan-2008| ©2008 www.technologuepro.com