Identification HTTP avec PHP

Il est possible d'utiliser la fonction header() pour demander une identification ("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 prédéfinies PHP_AUTH_USER, PHP_AUTH_PW et AUTH_TYPE contenant respectivement le nom d'utilisateur, le mot de passe et le type d'identification. Ces variables prédéfinies sont trouvées dans les tableaux $_SERVER. Seule la méthode d'identification simple ("Basic") est supportée. Se reporter à la fonction header() pour plus d'informations.

Voici un exemple de script qui force l'identification du client pour accéder à une page :

Exemple #1 Exemple d'identification HTTP simple

<?php
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Basic realm="My Realm"');
echo
'Texte utilisé si le visiteur utilise le bouton d\'annulation';
exit;
} else {
echo
"<p>Bonjour, {$_SERVER['PHP_AUTH_USER']}.</p>";
echo
"<p>Votre mot de passe est {$_SERVER['PHP_AUTH_PW']}.</p>";
}
?>

Note: Compatibilité

Il faut être bien prudent lors de l'utilisation d'en-têtes HTTP avec PHP. Afin de garantir un maximum de compatibilité entre les navigateurs, le mot clé "Basic" doit être écrit avec un B majuscule, et le texte de présentation doit être placé entre doubles guillemets (pas des simples), et exactement un espace doit précéder le code 401 dans l'en-tête HTTP/1.1 401. Les paramètres d'authentification doivent être séparés par des virgules.

Au lieu d'afficher simplement les variables globales PHP_AUTH_USER et PHP_AUTH_PW, il est préférable de 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.

Note: Configuration Apache

PHP utilise la présence de la directive AuthType pour déterminer si une identification externe est activée.

Il est cependant à noter que les manipulations ci-dessus n'empêchent pas quiconque possède une page non identifiée de voler les mots de passe des pages protégées, sur le même serveur.

Note: Comportement des navigateurs
L'authentification HTTP Basic est vraiment basique, et n'a pas été conçue pour gérer les déconnexions. HTTP étant un protocole sans état, la plupart des navigateurs mettent en cache les identifiants fournis dès qu'un code de statut 2xx est reçu, et les envoient à chaque requête, jusqu'à la fermeture du navigateur. Il n'existe pas de moyen défini pour qu'un serveur demande une nouvelle saisie des identifiants. Au fil des années, diverses solutions de contournement se sont répandues sur internet, mais elles dépendent toutes de la manière dont les différents navigateurs ont choisi de gérer des cas limites non définis (voire des violations du standard HTTP). Il est préférable d'éviter ces solutions de contournement et de ne pas utiliser l'authentification Basic pour quoi que ce soit de sérieux.

Note: Configuration IIS
Afin de rendre fonctionnelle l'authentification HTTP avec un serveur IIS avec la version CGI de PHP, la directive php.ini cgi.rfc2616_headers doit être définie à 0 (la valeur par défaut), et il faut éditer la configuration IIS "Directory Security". Cliquer sur "Edit" et activer uniquement "Anonymous Access", tous les autres champs doivent être laissés non actifs.