Ce tutorial vous montre une solution d’authentification utilisateur en PHP. Le resultat ressemble étrangement à la méthode « htaccess », mais cette méthode est beaucoup plus souple, car elle permet de stocker les identifiants dans un fichier texte ou dans une base de donnée.
Tout repose sur l’utilisation des variables globales $PHP_AUTH_USER,and $PHP_AUTH_PW.
Prérequis
Les variables globales $PHP_AUTH_USER, $PHP_AUTH_PW et $PHP_AUTH_TYPE ne seront accessibles que si PHP est installé comme module de Apache (et non comme CGI). Rassurez-vous, la plupart des hébergeur utilisent le système en module.
Utilisation d’un fichier texte
Supposons que nous voulons utiliser un fichier pour stocker les utilisateurs. Le fichier contiendrais alors par exemple :jean:ai890d
nadine:29hj0jk
marie:fsSS92Avec une boucle, nous pouvons faire un test sur chaque identifiant, en le comparant avec $PHP_AUTH_USER, et si le $PHP_AUTH_PW correspond. play the dialog box. Otherwise, display the secret content.
<?php $auth = false; // On initialise $auth comme fausse if (isset( $PHP_AUTH_USER ) && isset($PHP_AUTH_PW)) { // Lecture du fichier entier et stockage dans $file_contents $filename = '/path/to/file.txt'; $fp = fopen( $filename, 'r' ); $file_contents = fread( $fp, filesize( $filename ) ); fclose( $fp ); // On met chaque ligne dans un tableau. $lines = explode ( "\n", $file_contents ); // on sépare login et mot de passe foreach ( $lines as $line ) { list( $username, $password ) = explode( ':', $line ); if ( ( $username == "$PHP_AUTH_USER" ) && ( $password == "$PHP_AUTH_PW" ) ) { // Si c'est bon, on arrête. $auth = true; break; } } } if ( ! $auth ) { header( 'WWW-Authenticate: Basic realm="Private"' ); header( 'HTTP/1.0 401 Unauthorized' ); echo 'Accès restreint'; exit; } else { echo '<P>Vous êtes autorisé</P>'; } ?>
Attention: Le fichier texte ne devrait pas être stocké directement dans le wwwroot mais dans un endroit inaccessible par un navigateur.
Utilisation d’un fichier htpassword
Une petite difficulté en plus : les mots de passe sont encodés dans le fichier htpassword. Pour plus d’info, consultez la page htaccess. En général, l’encodage utilisé est UNIX DES ece qui donne des chose ressemblant à ceci :jean:WvzodahMR9USk
nadine:g3RYjX5evEvdM
marie:YzASzTGEo2VMA<?php $auth = false; // On initialise $auth comme fausse if (isset( $PHP_AUTH_USER ) && isset($PHP_AUTH_PW)) { // Lecture du fichier entier et stockage dans $file_contents $filename = '/path/to/.htpasswd'; $fp = fopen( $filename, 'r' ); $file_contents = fread( $fp, filesize( $filename ) ); fclose( $fp ); // On met chaque ligne dans un tableau. $lines = explode ( "\n", $file_contents ); // on sépare login et mot de passe foreach ( $lines as $line ) { list( $username, $password ) = explode( ':', $line ); if ( $username == "$PHP_AUTH_USER" ) { // On récupère le code à deux lettres de $password. C'es toujours // les deux premiers caractères de la chaîne DES-encrypted. $salt = substr( $password , 0 , 2 ); // On encode le $PHP_AUTH_PW en se basant sur le code $salt $enc_pw = crypt( $PHP_AUTH_PW, $salt ); if ( $password == "$enc_pw" ) { // Si cela correspond, c'est OK, on stoppe la recherche. $auth = true; break; } } } } if ( ! $auth ) { header( 'WWW-Authenticate: Basic realm="Private"' ); header( 'HTTP/1.0 401 Unauthorized' ); echo 'Accès restreint'; exit; } else { echo '<P>Vous êtes autorisé</P>'; } ?>
Utilisation d’une base de donnée
Enfin, nous allons voir comment créer une boite d’authentification en vérifiant les identifiants dans une base de donnée MySQL.
Nous crééons pour l’exemple une table « users » ressemblant à ceci :
nom login password Jean Bon jean ai890d Nadine Schmitt nadine 29hj0jk Marie Lang marie fsSS92 La vérification de la correspondance peut se faire avec une requête comme ceci :SELECT *
FROM users
WHERE username=’$PHP_AUTH_USER’ and password=’$PHP_AUTH_PW’<?php $auth = false; // On initialise $auth comme fausse if (isset( $PHP_AUTH_USER ) && isset($PHP_AUTH_PW)) { // connection à MySQL mysql_connect( 'hostname', 'username', 'password' ) or die ( 'connexion impossible' ); // Selection de la base mysql_select_db( 'your_db' ) or die ( 'Sélection de la base impossible' ); // Ecriture de la requête $sql = "SELECT * FROM users WHERE login = '$PHP_AUTH_USER' AND password = '$PHP_AUTH_PW'"; // Exécution $result = mysql_query( $sql ) or die ( 'Unable to execute query.' ); // On regarde le nombre de résultats $num = mysql_numrows( $result ); if ( $num != 0 ) { // S'il n'y a aucun résultat, l'utilisateur n'est pas autorisé $auth = true; } } if ( ! $auth ) { header( 'WWW-Authenticate: Basic realm="Private"' ); header( 'HTTP/1.0 401 Unauthorized' ); echo 'Accès restreint'; exit; } else { echo '<P>Vous 'êtes pas autorisé</P>'; } ?>
Rendez-vous maintenant dans la section scripts pour voir tout cela à l’oeuvre …