(Traduit
de l'article original
www.zend.com/zend/tut/authentication.php)
Généralités
Dans ce tutorial, nous allons apprendre à initialiser l'authentification
d'un utilisateur en PHP, et ensuite de valider les utilisateurs
en confrontant les valeurs des variables globales $PHP_AUTH_USER
et $PHP_AUTH_PW à une liste de codes utilisateurs et mot de
passe. Les exemples de codes proposés dans ce guide vont détaillé
comment utiliser l'une ou l'autre des méthodes suivantes: valeurs
en dur dans le code, un fichier texte, un fichier .htpasswd
ou une table de base de données, pour gérer la liste des codes
utilisateurs valides et de leur mots de passe associés.
Objectifs d'apprentissage
Nous
allons utiliser les techniques suivantes:
Nous
allons utiliser les fonctions suivantes:
exit,
break,
crypt(),
header(),
fopen(),
fread(),
filesize(),
fclose(),
isset(),
substr().
Comment
çà marche ?
L'authentification
basée sur PHP reproduit celle du serveur WEB. Quand on envoie
de façon explicite les headers HTTP appropriés à partir du script
PHP vers le navigateur, une boîte de dialogue demandant "code
utilisateur" et "mot de passe" est affichée. PHP assigne respectivement
les valeurs saisies pour le "code utilisateur" et le "mot de
passe" dans les variables globales $PHP_AUTH_USER and $PHP_AUTH_PW.
Nous pouvons alors utiliser ces variables pour valider la saisie
à partir d'une liste de "codes utilisateur/mots de passe" stockée
dans un fichier texte, un fichier .htpasswd ou une base de données.
Nous allons suivre les étapes suivantes:
- Envoi
des entêtes HTTP (headers);
- Interprétation des variables ;
- Valider un "code utilisateur/mot de passe" en utilisant:
- des valeurs en dur ;
- un fichier texte ;
- le fichier .htpasswd ;
- et une base de données
Envoi des entêtes HTTP
La fonction PHP header() permet l'envoi de chaînes d'entêtes
HTTP spécifiques, comme la redirection ou dans notre cas l'erreur
"401": "Unauthorized". Ce type d'entête, combinée avec une entête
"WWW-Authenticate", va nous permettre l'activation de la boîte
de dialogue d'authentication
Note: Il ne faut rien envoyer au navigateur
avant l'utilisation de la fonctionn header() : espaces, lignes
blanches, HTML ou '\n', '\r', etc.. L'envoi de caractères avant
les entêtes provoque une erreur d'analyse lors de l'exécution
du script.
Code source
- L'utilisation conjointe de ces deux entêtes va provoquer
l'affichage de la boîte de dialogue d'authentication.
- Pour être sûr de ne pas aller plus loin dans le script nous
utilisons la fonction exit().
<?php
header('WWW-Authenticate: Basic realm="Private"');
header('HTTP/1.0 401 Unauthorized');
exit;
?>
Interprétation des variables
La boîte de dialogue d'authentification provoque la saisie
de deux champs, dont les valeurs sont affectées aux variables
golbales PHP $PHP_AUTH_USER et $PHP_AUTH_PW
. Jusqu'à
ce qu'une valeur leur soit assignée $PHP_AUTH_USER et
$PHP_AUTH_PW
restent vides par défaut (comme toutes les
autres varaibles globales de PHP)
Note: L'ordre usuel des événements d'un script d'authentification
en PHP est de vérifier en premier qu'aucune valeur n'a été affectée
ni à $PHP_AUTH_USER ni à $PHP_AUTH_PW
, et ensuite
d'agir en conséquence. Cette situation convient bien à l'accès
initial d'un utilisateur à la page. Après une autehntification
initiale $PHP_AUTH_USER et $PHP_AUTH_PW
sont déjà
valorisées et ont pour valeur le "code utilisateur" et le "mot
de passe" saisis par l'utilisateur.
Nous devons donc ne proposer la boîte de dialogue que si ces
variables n'ont pas encore de valeurs. La séquence de code ci-dessous
prend en compte cette considération en utilisant la fonction
isset().
Code source
- Utilisation de isset() si les variables
$PHP_AUTH_USER
et $PHP_AUTH_PW
ont ou non des valeurs ;
- Demander au navigateur d'afficher la boîte de dialogue d'authentification
si aucune valeur n'est définie ni pour
$PHP_AUTH_USER
ni pour $PHP_AUTH_PW
;
- Utilisation de la fonction "echo" pour envoyer un message
adapté àl'utilisateur.
<?php
if ((!isset( $PHP_AUTH_USER )) || (!isset($PHP_AUTH_PW))) {
header( 'WWW-Authenticate: Basic realm="Private"' );
header( 'HTTP/1.0 401 Unauthorized' );
echo 'Authorization Required.';
exit;
} else {
echo "You entered $PHP_AUTH_USER for a username.<BR>";
echo "You entered $PHP_AUTH_PW for a password.<BR>";
}
?>
Valider la saisie par des valeurs en dur
Le code ci-dessus ne permet pas réellemnt l'authentification
de l'utilisateur puisqu'il vérifie que les variables ont bien
une valeur mais pas qu'elles ont ue valeur spécifique. dans
cette étape, nous allons suivre la même séquence de code mais
nous allons ajouter un test de valeurs. Dans cet exemple nous
allons utiliser des valeurs en dur ; nous afficherons le message
"Success!" si les deux valeurs saisies sont correctes ; autrement
nous afficherons un message d'échec "Failure!".
Code source
- Nous utilisons isset() pour vérifier si les variables
$PHP_AUTH_USER
et $PHP_AUTH_PW
ont ou non des valeurs. Dans
la même séquence nous vérifions, si les deux ont des valeurs,
nous vérifions que ces valeurs sont bien celles attendues.
- Nous affichons le message de succès si les deux valeurs
correspondent aux valeurs en dur.
<?php
if ( ( !isset( $PHP_AUTH_USER )) || (!isset($PHP_AUTH_PW))
|| ( $PHP_AUTH_USER != 'user' ) || ( $PHP_AUTH_PW != 'open' ) ) {
header( 'WWW-Authenticate: Basic realm="Private"' );
header( 'HTTP/1.0 401 Unauthorized' );
echo 'Authorization Required.';
exit;
} else {
echo 'Success!';
}
?>
NB : certains d'entre vous m'ont interpellé quelques fois,
me demandant pourquoi les scripts que je donnais ne fonctionnaient
pas comme prévu alors qu'ils en faisaient un copier/coller.
C'est justement le copier/coller qui pose problème, je mets
souvent des blancs insécables à l'intérieur des scripts pour
que l'expression reste entière. Les scripts ci-dessus en ont,
il fauit donc retarvailler le script sous éditeur avant de le
tester.
Lire
la 2ème partie >>