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.
Voici un exemple de script qui force l'authentification du client
pour accéder à une page :
Exemple d'authentification HTTP
<?php
if(!isset($PHP_AUTH_USER)) {
Header("WWW-Authenticate: Basic realm=\"My Realm\"");
Header("HTTP/1.0 401 Unauthorized");
echo "Texte à envoyer si le client appuie sur le bouton d'annulation\n";
exit;
} else {
echo "Bonjour $PHP_AUTH_USER.<P>"
echo "Vous avez entré le mot de passe $PHP_AUTH_PW.<P>"
}
?>
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.
Méfiez-vous des navigateurs buggés, tels que Internet Explorer.
Ils semblent très susceptibles concernant l'ordre des en-têtes.
Envoyer l'en-tê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 variable $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 possède une page non authentifiée
de voler les mots de passe des pages protégées,
sur le même serveur.
Netscape et Internet Explorer effaceront le cache d'authentification client
s'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'expiration, ou alors, fournissent un bouton de déconnexion.
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 Unauthorized");
echo "Vous devez entrer un nom d'utilisateur valide et un mot de passe"
."correct pour accéder à cette ressource\n";
exit;
}
if(!isset($PHP_AUTH_USER) || ($SeenBefore == 1 && !strcmp($OldAuth, $PHP_AUTH_USER)) ) {
authenticate();
}
else {
echo "Bienvenue $PHP_AUTH_USER<BR>";
echo "Old: $OldAuth";
echo "<FORM ACTION=\"$PHP_SELF\" METHOD=POST>\n";
echo "<INPUT TYPE=HIDDEN NAME=\"SeenBefore\" VALUE=\"1\">\n";
echo "<INPUT TYPE=HIDDEN NAME=\"OldAuth\" VALUE=\"$PHP_AUTH_USER\">\n";
echo "<INPUT TYPE=Submit VALUE=\"Re Authenticate\">\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'il n'affectait pas les informations de session lors de la
réception d'un message de type 401. Ce qui fait que presser la
touche "retour" (back) à un client lynx précédemment authentifié
donnera l'accès direct à la ressource. Cependant,
l'utilisateur peut utiliser la touche '_' pour détruire
les anciennes authentifications.
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.
Sommaire:
6.5 Authentification HTTP avec PHP