Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
118 changes: 39 additions & 79 deletions features/http-auth.xml
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: bdf9a4e40204c805f2c2a5c94c2f2f8f5556195a Maintainer: lacatoire Status: ready -->
<!-- EN-Revision: cd4180557a185469a64a7eb26f7be98d0a5f1ebb Maintainer: lacatoire Status: ready -->
<!-- Reviewed: yes -->

<chapter xml:id="features.http-auth" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Identification HTTP avec PHP</title>

<simpara>
Il est possible d'utiliser la fonction <function>header</function> pour demander
une identification (<literal>"Authentication Required"</literal>) au client,
Expand All @@ -21,7 +21,7 @@
est supportée. Se reporter à la fonction
<function>header</function> pour plus d'informations.
</simpara>

<para>
Voici un exemple de script qui force l'identification du client
pour accéder à une page :
Expand All @@ -33,8 +33,8 @@
<![CDATA[
<?php
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Basic realm="My Realm"');
header('HTTP/1.0 401 Unauthorized');
echo 'Texte utilisé si le visiteur utilise le bouton d\'annulation';
exit;
} else {
Expand All @@ -46,116 +46,76 @@ if (!isset($_SERVER['PHP_AUTH_USER'])) {
</programlisting>
</example>
</para>

<note>
<title>Note de compatibilité</title>
<title>Compatibilité</title>
<para>
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 <emphasis>401</emphasis> dans l'en-tête
<emphasis>HTTP/1.0 401</emphasis>. Les paramètres d'authentification doivent
<emphasis>HTTP/1.1 401</emphasis>. Les paramètres d'authentification doivent
être séparés par des virgules.
</para>
</note>

<para>
Au lieu d'afficher simplement les variables globales <varname>PHP_AUTH_USER</varname>
et <varname>PHP_AUTH_PW</varname>, 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.
</para>

<para>
Il faut se méfier des navigateurs bogués, tels qu'Internet Explorer.
Ils semblent très susceptibles en ce qui concerne l'ordre des en-têtes.
Envoyer l'en-tête d'identification (<emphasis>WWW-Authenticate</emphasis>)
avant le code de <literal>HTTP/1.0 401</literal> semble lui convenir
jusqu'à présent.
</para>


<note>
<title>Note de configuration</title>
<title>Configuration Apache</title>
<para>
PHP utilise la présence de la directive <literal>AuthType</literal>
pour déterminer si une identification externe est activée.
</para>
</note>

<simpara>
Notez cependant 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.
</simpara>
<simpara>
Netscape et Internet Explorer effaceront le cache d'identification client
s'ils reçoivent une réponse 401. Cela permet de déconnecter
un utilisateur, pour le forcer à saisir à nouveau 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>
<para>
<example>
<title>Identification HTTP avec nom d'utilisateur/mot de passe forcé</title>
<programlisting role="php">
<![CDATA[
<?php
function authenticate() {
header('WWW-Authenticate: Basic realm="Test Authentication System"');
header('HTTP/1.0 401 Unauthorized');
echo "Vous devez entrer un identifiant et un mot de passe valides pour accéder
à cette ressource.\n";
exit;
}

if ( !isset($_SERVER['PHP_AUTH_USER']) ||
($_POST['SeenBefore'] == 1 && $_POST['OldAuth'] == $_SERVER['PHP_AUTH_USER'])) {
authenticate();
} else {
echo "<p>Bienvenue : " . htmlspecialchars($_SERVER['PHP_AUTH_USER']) . "<br />";
echo "Ancien : " . htmlspecialchars($_REQUEST['OldAuth']);
echo "<form action='' method='post'>\n";
echo "<input type='hidden' name='SeenBefore' value='1' />\n";
echo "<input type='hidden' name='OldAuth' value=\"" . htmlspecialchars($_SERVER['PHP_AUTH_USER']) . "\" />\n";
echo "<input type='submit' value='Re Authenticate' />\n";
echo "</form></p>\n";
}
?>
]]>
</programlisting>
</example>
</para>
<simpara>
Ce comportement n'est pas nécessaire par le standard
d'identification <literal>HTTP Basic</literal>. Les tests avec
<literal>Lynx</literal> 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" puis "avant"
sur un client <literal>Lynx</literal>
précédemment identifié donnera l'accès direct à
la ressource tant que les informations d'identification n'ont pas changé. Cependant, l'utilisateur peut utiliser la touche
<literal>'_'</literal> pour détruire les anciennes identifications.
</simpara>
<simpara>
Afin de rendre fonctionnelle l'authentification HTTP avec un serveur IIS avec
la version CGI de PHP, il faut éditer
la configuration "<literal>Directory Security</literal>". Cliquer
sur "<literal>Edit</literal>" et activez uniquement
"<literal>Anonymous Access</literal>", tous les autres champs doivent
être laissés non actifs.
</simpara>
<note>
<title>Note pour les utilisateurs de IIS :</title>
<title>Comportement des navigateurs</title>
<simpara>
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
<literal>2xx</literal> 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.
</simpara>
</note>

<note>
<title>Configuration IIS</title>
<simpara>
Pour que l'identification HTTP fonctionne avec IIS, la directive PHP
Afin de rendre fonctionnelle l'authentification HTTP avec un serveur IIS avec
la version CGI de PHP, la directive php.ini
<link linkend="ini.cgi.rfc2616-headers">cgi.rfc2616_headers</link>
doit être définie à <literal>0</literal> (la valeur par défaut).
doit être définie à <literal>0</literal> (la valeur par défaut), et il faut
éditer la configuration IIS "<literal>Directory Security</literal>".
Cliquer sur "<literal>Edit</literal>" et activer uniquement
"<literal>Anonymous Access</literal>", tous les autres champs doivent
être laissés non actifs.
</simpara>
</note>

</chapter>

<!-- Keep this comment at the end of the file
Expand Down