Objectif

On va chercher à créer une authentification basique. Les utilisateurs et leurs mots de passe (chiffrés) seront conservés dans un fichier texte.

Création des utilisateurs

Le chiffrement d'une chaîne de caractère est effectuée grâce à la méthode password_hash (avec la chaîne de caractères en argument).

Les utilisateurs seront stockés dans un tableau associatif (clé : nom d'utilisateur, mot de passe : valeur) qui sera sérialisé dans un fichier.

La sérialisation utilisera la fonction serialize.

Utilisation d'un fichier :

// Ouverture d'un fichier en écriture (w) avec la fonction fopen
$fichier = fopen("/tmp/users.txt", "w");
// Ecriture dans le fichier précédement ouvert
fwrite($fichier, "Données à écrire");
// Important : fermer le flux vers le fichier
fclose($fichier);

On utilisera par exemple un script exécuté en ligne de commande :

$ php createUsers.php

Formulaire auth.php

Simple formulaire demandant un nom d'utilisateur et un mot de passe.

Vérification de l'authentification : verification.php

Ce fichier comporte la fonction verifier($identifiant, $motDePasse) qui compare les mots de passes chiffrés (il ne peuvent pas être déchiffrés). Pour comparer deux chaînes chiffrées, on utilisera le résultat de password_hash comme grain de sel. On utilisera alors la fonction password_verify

// je dispose déjà de $motDePasseChiffre
if (password_verify($motDePasseAVerifier, $motDePasseChiffre)) {
   echo "Mot de passe correct !";

Lecture dans fichier :

// Ouverture d'un fichier en lecture (r) avec la fonction fopen
$fichier = fopen("/tmp/users.txt", "r");
// Récupération du contenu
$contenu = fgets($fichier);
// Important : fermer le flux vers le fichier
fclose($fichier);

Ce fichier sera aussi capable de traiter les données du formulaire auth.php. Si l'authentification est correcte, l'identifiant utilisé est conservé en session.

Contenu : contenu.php

Fichier dont l'accès au contenu est subordonné à la présence d'un identifiant stocké en session (et donc d'un authentification réussie).

verification.php

<?php
session_start();
// Traitement des informations du formulaire
if(isset($_POST['identifiant']) && isset($_POST['motDePasse']))
{
	$identifiant = $_POST['identifiant'];
	$motDePasse = $_POST['motDePasse'];
	
	if(verifier($identifiant, $motDePasse))
	{
		$_SESSION['identifiant'] = $identifiant;
		$message = "Bienvenue";
	}
	else 
	{
		$message = "Erreur<br><a href=\"auth.php\">Retour</a>";
	}
}
else 
{
	$message = "Erreur<br><a href=\"auth.php\">Retour</a>";
}

// Fonction de comparaison des mots de passe chiffrés
function verifier($identifiant, $motDePasse)
{
	if(($identifiant == null) || ($motDePasse == null)) return null;
	$fichier = fopen("/tmp/users.txt", "r");
	$users = unserialize(fgets($fichier));
	fclose($fichier);
	
	return (isset($users[$identifiant])) 
		&& (password_verify($motDePasse, $users[$identifiant]));
}
?>

<html>
<head><title>Identification</title></head>
<body>
<p>
<?php echo $message ?>
</p>
</body>
</html>
    

test.php

<?php
	include 'verification.php';
	
	echo "Test : " . verifier("riri", "azerty") . "\n";
	echo "Test : " . verifier("riri", "azertyuiop") . "\n";
?>
    

contenu.php

<?php
	session_start();
	// Contenu uniquement accessible si l'identifiant est stocké
	// en session suite à une authentification réussie
	if(! isset($_SESSION["identifiant"]))
	{
		header('Location: auth.php'); // Redirection vers le formulaire d'authentification
		exit();
	}
	else{
	// Notez la syntaxe plus compacte pour inclure de l'HTML dans du PHP
		echo <<< _END
		<html>
		<head><title>Ressource</title></head>
		<body>
			<p>Acc&egrave;s</p>
		</body>
		</html>
_END;
	}
?>
    

createUsers.php

<?php
	// Création des données
	$users = array();
	$users["riri"] = password_hash("azerty", PASSWORD_DEFAULT);
	$users["fifi"] = password_hash("poiuyt", PASSWORD_DEFAULT);
	$users["loulou"] = password_hash("lfkjgh", PASSWORD_DEFAULT);
	// Ecriture dans le fichier
	$fichier = fopen("/tmp/users.txt", "w");
	fwrite($fichier, serialize($users));
	fclose($fichier);
?>
    

auth.php

<html>
<head>
<title>Identification</title>
</head>
<body>
<form action="verification.php" method="post"><pre>
<label for="identifiant">Identifiant</label>
<input type="text" name="identifiant"><br>
<label for="motDePasse">Mot de passe</label>
<input type="password" name="motDePasse"><br>
<input type="submit" value="Valider">
</pre></form>
</body>
</html>