Authentification d’utilisateur basée sur PHP

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:fsSS92

Avec 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 :

nomloginpassword
Jean Bonjeanai890d
Nadine Schmittnadine29hj0jk
Marie LangmariefsSS92

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 …


Publié

dans

par