Manuel PHPss
Chapitre 17. Authentification HTTP avec PHP
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 simple ("Basic" ) est supportée. Reportez vous à la fonction header() pour plus d'informations.ss
Voici un exemple de script qui force l'authentification du client pour accéder à une page : Exemple 17-1. Exemple d'authentication HTTP
<?php
ssif(!isset($PHP_AUTH_USER)) {
ssssHeader("WWW-Authenticate: Basic realm="My Realm"" );
ssssHeader("HTTP/1.0 401 Unauthorized" );
ssssecho "Texte à envoyer si le client appuie sur le bouton d'annulation
";
ssssexit;
ss} else {
ssssecho "Bonjour $PHP_AUTH_USER.<P>"
ssssecho "Vous avez entré le mot de passe $PHP_AUTH_PW.<P>"
ss}
?>
ssss
ss
ss
Au lieu 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.ss
Méfiez vous des navigateurs buggés, tels que Internet Explorer. Ils semblent très suceptibles 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.ss
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 variable $REMOTE_USER peut être utilisée pour identifier l'utilisateur à l'extérieur.ss
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.ss
Netscape et Internet Explorer effaceront le cache d'authentification client si ils recoivent une réponse 401. Cela permet de déconnecter un utilisateur, pour le forcer à ré-entrer son nom de compte et son mot de passe. Certains programmeurs l'utilisent pour donner un délai d'éxpiration, ou alors, fournissent un bouton de déconnexion.ss
Exemple 17-2. Authentification HTTP avec nom d'utilisateur/mot de passe forcéss
<?php
ssfunctionssauthenticate() {
ssssHeader( "WWW-authenticate:ssbasicssrealm='TestssAuthenticationssSystem'" );
ssssHeader( "HTTP/1.0ss401ssUnauthorized" );
ssssechoss"Vous devez entrer un nom d'utilisateur valide et un mot de passe correct pour accéder à cette ressource
";
ssssexit;
ss}
ssif(!isset($PHP_AUTH_USER)ss||ss($SeenBefore ==ss1ss&&ss!strcmp($OldAuth,ss$PHP_AUTH_USER))ss)ss{
ssssauthenticate();
ss}
sselsess{
ssssechoss"Bienvenuess$PHP_AUTH_USER<BR>";
ssssechoss"Old:ss$OldAuth";
ssssechoss"<FORMssACTION="$PHP_SELF"ssMETHOD=POST>
";
ssssechoss"<INPUTssTYPE=HIDDENssNAME="SeenBefore"ssVALUE="1">
";
ssssechoss"<INPUTssTYPE=HIDDENssNAME="OldAuth"ssVALUE="$PHP_AUTH_USER">
";
ssssechoss"<INPUTssTYPE=SubmitssVALUE="RessAuthenticate">
"
ssssechoss"</FORM>
";
}
?>
ssss
ss
ss
Ce comportement n'est pas nécessaire par le standard d'authentification HTTP Basic. Les tests avec Lynx ont montré qu'il n'affectait pas les informations de session lors de la réception d'un message de type 401, ce qui fait que passer ces informations entre le serveur et le client, et donnera l'accès à la ressource.ss
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.