1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
|
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- $Revision: 1.11 $ -->
<chapter id="features.http-auth">
<title>Authentification HTTP avec PHP</title>
<simpara>
Les fonctions d'authentification <acronym>HTTP</acronym> 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 <function>header</function> 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 <varname>$PHP_AUTH_USER</varname>,
<varname>$PHP_AUTH_PW</varname> et <varname>$PHP_AUTH_TYPE</varname>
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
<function>header</function> pour plus d'informations.
</simpara>
<para>
Voici un exemple de script qui force l'authentification du client
pour accéder à une page :
<example>
<title>Exemple d'authentification HTTP</title>
<programlisting role="php">
<?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>"
}
?>
</programlisting>
</example>
</para>
<para>
Au lieu d'afficher simplement les variables globales <varname>$PHP_AUTH_USER</varname>
et <varname>$PHP_AUTH_PW</varname>, 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.
</para>
<para>
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 (<emphasis>WWW-Authenticate</emphasis>)
avant le code de <errorcode>HTTP/1.0 401</errorcode> semble lui convenir
jusqu'à présent.
</para>
<simpara>
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 <varname>$REMOTE_USER</varname> peut être
utilisée pour identifier l'utilisateur à l'extérieur.
</simpara>
<simpara>
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.
</simpara>
<simpara>
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.
</simpara>
<example>
<title>
Authentification HTTP avec nom d'utilisateur/mot de passe forcé
</title>
<programlisting role="php">
<?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";
}
?>
</programlisting>
</example>
<simpara>
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.
</simpara>
<simpara>
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.
</simpara>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"../manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
-->
|