25. Refactoring de l’Authentification
1. La Connexion (login.php)
Code complet PHP
<?php
declare(strict_types=1);
session_start();
require_once 'database/database.php';
require_once 'flash.php';
require_once 'app/Emuns/Role.php';
require_once 'app/helpers.php';
// /**
// * Authenticate a user
// */
function authenticateUser(PDO $pdo, string $email, string $password): string {
if (empty($email) || empty($password)) {
return "Tous les champs doivent être complétés !";
}
$stmt = $pdo->prepare("SELECT * FROM users WHERE email = :email OR username = :email");
$stmt->execute([':email' => $email]);
$user = $stmt->fetch();
if (!$user) {
return "Compte inexistant !";
}
if (!password_verify($password, $user['password'])) {
return "Mauvais mot de passe !";
}
// Set session variables
$_SESSION['auth'] = [
'id' => $user['id'],
'username' => $user['username'],
'email' => $user['email'],
'role' => $user['role']
];
return "success";
}
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['login'])) {
$email = strip_tags($_POST['email'] ?? '');
$password = $_POST['password'] ?? '';
$result = authenticateUser($pdo, $email, $password);
if ($result === "success") {
flash_set('success', "Heureux de vous revoir " . $_SESSION['auth']['username'] . " !");
// Redirect based on role or to index
if ($_SESSION['auth']['role'] === Role::ADMIN->value) {
redirect('admin.php');
} else {
redirect('user-dashboard.php');
}
} else {
flash_set('error', $result);
redirect('login.php');
}
}
$pageTitle = 'Connexion';
render('users/login', ['pageTitle' => $pageTitle], 'blog-layout');
Explications pas à pas (PHP)
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['login'])) {
Explication : On vérifie si le formulaire a été soumis avec la méthode POST et si le bouton de connexion (nommé ‘login’) a été pressé.
$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);
$password = $_POST['password'] ?? '';
Explication : filter_var s’assure que le texte entré ressemble bien à un email.
$query = $pdo->prepare('SELECT * FROM users WHERE email = :email');
$query->execute(['email' => $email]);
$user = $query->fetch(PDO::FETCH_ASSOC);
Explication : On cherche l’utilisateur par son email.
if ($user && password_verify($password, $user['password'])) {
$_SESSION['auth'] = $user;
redirect('user-dashboard.php');
} else {
$errors['login'] = 'Email ou mot de passe incorrect';
}
Explication : password_verify() compare le mot de passe en clair tapé par l’utilisateur avec l’empreinte hachée présente en base de données. Si c’est bon, on stocke l’utilisateur en session et on le redirige !
Code complet HTML (resources/views/users/login_html.php)
<div class="container-part">
<!-- Colonne de gauche : Grande image avec superposition -->
<div class="image-column">
<div class="image-overlay"></div>
<img src="/publicAll/images/log.png" alt="Image d'arrière-plan" />
</div>
<!-- Colonne de droite : Formulaire de connexion -->
<div class="form-container">
<form action="" method="POST">
<div class="form-group">
<h2>Connection</h2>
<?php if (isset($errors['email'])) { ?>
<p style="color:#f86262;"><?= $errors['email'] ?></p>
<?php } ?>
<div class="input-group">
<i class="bx bxs-envelope icon"></i>
<input type="text" name="email" placeholder="Email ou pseudo" />
</div>
<div class="input-group">
<i class="bx bxs-lock-alt icon"></i>
<input type="password" name="password" placeholder="Mot de passe" />
</div>
<button type="submit" name="login">Se connecter</button>
<!-- Liens d'authentification -->
<div class="auth-links">
<span class="auth-link" style="color:black"> <i class="bx bx-log-in"></i>Connectez-vous ou </span>
<a href="/register.php" class="auth-link">
<i class="bx bx-user-plus"></i>
<u>Inscrivez-vous</u>
</a>
</div>
</div>
</form>
</div>
</div>
<script src="/resources/js/particul.js"></script>
Explications pas à pas (HTML)
<?php if (!empty($errors['login'])): ?>
<div class="alert alert-danger" style="..."><?= htmlspecialchars($errors['login']) ?></div>
<?php endif; ?>
Explication : Si le tableau $errors envoyé par le contrôleur n’est pas vide, on affiche le message d’erreur.
<form method="POST" action="login.php">
<div>
<label for="email">Adresse e-mail :</label>
<input type="email" id="email" name="email" required />
</div>
</form>
Explication : L’attribut name="email" est crucial : c’est sous ce nom que PHP récupérera la donnée via $_POST['email'].
2. La Déconnexion (logout.php)
Code complet PHP
<?php
session_start();
require_once 'flash.php';
require_once 'app/helpers.php';
$_SESSION = [];
flash_set('success', "Vous avez été déconnecté avec succès.");
redirect('login.php');
Explications pas à pas
Ce fichier n’a pas de vue HTML.
$_SESSION = [];
session_destroy();
redirect('index.php');
Explication :
- On vide le tableau
$_SESSION. session_destroy()supprime le fichier de session côté serveur.- On redirige le visiteur vers l’accueil.
Prêt à passer à la suite ?
Vous avez terminé cette leçon sur 25. Refactoring de l'Authentification. Continuez votre apprentissage avec la prochaine leçon ou explorez d'autres formations.