(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 >>