POO en PHP (Hors-série) - Authentification via l'objet PDO

Dans cette vidéo hors‑série, le présentateur montre pas à pas comment créer une petite application PHP orientée objet qui gère l’inscription et l’authentification d’utilisateurs en stockant les données dans une base MySQL via l’objet PDO. Il décrit les différentes pages nécessaires (inscription.php, login.php, session.php, deconnexion.php et connexion.php), conçoit la table users (id, dateinscription, nom, prénom, login, motdepasse) et explique le choix des types de champs ainsi que les contraintes (PRIMARY KEY, AUTOINCREMENT, UNSIGNED). Le tutoriel détaille la mise en place d’une connexion PDO centralisée, l’utilisation de requêtes préparées pour vérifier l’unicité du login, insérer un nouvel utilisateur (avec hachage MD5 du mot de passe) et authentifier un login/mot de passe. Il montre comment gérer les sessions (session_start, variables de session, contrôle d’accès), personnaliser le message d’accueil selon l’heure du jour, et implémenter la déconnexion avec redirection. Le code source et le dump de la base sont fournis dans la description. Le présentateur souligne les bonnes pratiques (prepared statements, validation basique, redirection sécurisée, appel à exit) tout en restant ouvert aux améliorations (expressions régulières, algorithmes de hachage plus sûrs).
Chapters
Bonjour à tous et bienvenue dans cette vidéo hors-série sur la programmation orientée objet en PHP. Aujourd'hui, nous allons créer une mini-application qui permet l'inscription et l'authentification des utilisateurs. Les données personnelles seront stockées dans une base de données et celles-ci seront interrogées à l'aide de l'objet PDO. Je vous rappelle qu'on a déjà fait un exemple pareil dans la série consacrée au langage PHP. Sauf que les données n'étaient pas stockées dans la base de données, mais dans un fichier texte. Donc si vous n'avez pas vu cette vidéo-là, je vous conseille vivement de la regarder car j'y ai expliqué des notions comme les sessions, les redirections, etc. Bien entendu, dans la vidéo courante, je vais survoler ces notions-là et je me concentrerai sur la partie qui nous intéresse le plus et qui est l'interfaçage avec la base de données. Je vous laisserai les codes sources de cet exercice ainsi que le dump de la base de données dans la description. Dans cet exercice, nous aurons besoin de plusieurs pages PHP, à savoir la page inscription.php qui permet l'inscription d'un nouvel utilisateur qui doit fournir ses informations personnelles qui sont le nom, le prénom, le login et le mot de passe. Bien sûr, le mot de passe doit être saisi 2 fois afin de le confirmer. Il y a aussi la page login qui permet l'authentification d'un client inscrit. Il y a aussi la page session.php qui représentera l'espace privé de l'utilisateur, c'est-à-dire qu'il n'est accessible que si celui-ci est bien authentifié. Cette page contiendra juste le message Bonjour, le nom et le prénom. Bien sûr, le nom et le prénom, ce sont des informations qui proviendront de la base de données. Et pour le message Bonjour, on va essayer de le personnaliser en fonction du moment de la journée, c'est-à-dire on peut écrire soit Bonjour ou bien Bonsoir. Et finalement, la page déconnexion.php qui permet de fermer la session. J'ai pris le soin de préparer ces pages au préalable par que ça devrait nous prendre énormément de temps si on veut tout faire à zéro. Donc la page inscription.php contiendra juste le formulaire d'inscription, contiendra un espace qui va renfermer le message qui va s'afficher. Par exemple, si l'utilisateur a oublié de saisir un champ, dans ce cas il y aura un message d'erreur qui va s'afficher ici. Et la partie classique du PHP qui concerne la récupération des posts. Et ensuite on a le contrôle de saisie classique, on vérifie si l'utilisateur a bien cliqué sur le bouton de soumission et on vérifie si le nom, le prénom, login, mot de passe ne sont pas vides, etc. Et et si le mot de passe et sa confirmation sont identiques. Remarquez que je n'ai pas trop approfondi ce contrôle de saisie. J'ai juste vérifié si ces champs ne sont pas laissés vides. Mais sinon, vous pouvez améliorer le contrôle de saisie en appliquant des expressions régulières afin de mieux affiner l'écriture des informations personnelles. Même chose pour login.php. Évidemment, on aura besoin des variables de session. C'est pourquoi j'ai inclus la fonction session_start qui permet d'initialiser une session ou bien de reprendre une session déjà ouverte. Même chose, je récupère les posts qui sont dans ce cas le login et le mot de passe en plus du bouton Submit. Et même chose que la page inscription.php, nous avons le message qui est vide et que l'on va initialiser en fonction de l'erreur qui est rencontrée au moment de l'authentification. Bien sûr que l'on va afficher en bas du formulaire. Pour la page session.php, on aura aussi besoin des variables de session, c'est pourquoi on a toujours déclaré la fonction session_start. Puis on va personnaliser cette partie en insérant les bonnes informations de l'utilisateur, à savoir le nom et le prénom. Et aussi on va personnaliser le message qui est là en mettant à soi bonjour ou bien bonsoir en fonction du moment de la journée. Pour la page des connexions, ça change pas trop. On aura toujours les mêmes lignes qui se répètent: la reprise de la session, l'écrasement de celle-ci et ensuite la redirection vers la page login.php. Nous allons d'abord créer la table qui contiendra les informations personnelles de l'utilisateur dans la base de données. Alors je vais l'appeler la table users et j'y mettrai 6 champs. Le premier champ, c'est l'identifiant. Ensuite, la date d'inscription. Et après, on mettra les informations personnelles: le nom, le prénom, login et le mot de passe. En ce qui concerne les types, le ID, on va mettre soit int ou bien tinyint ou encore smallint. C'est-à-dire que c'est à vous de voir le nombre d'inscrits que vous attendez. Si vous prévoyez énormément d'inscrits, dans ce cas, vaut mieux mettre int. Ici le nombre ne dépasse pas quelques centaines ou bien quelques milliers, dans ce cas un SmallInt pourrait bien faire l'affaire. Ensuite pour la date on mettra DateTime qui contiendra la date en format international suivi de l'heure. Pour le nom, le prénom et tout le reste on mettra juste VARCHAR. Et pour VARCHAR il faut spécifier la longueur, dans ce cas on mettra 40 caractères maximum pour le nom, le prénom, Le login aussi. Pour le mot de passe, on sait qu'on va le hacher et je vais opter pour l'algorithme MD5. MD5, on sait qu'il retourne toujours 32 caractères, mais bon, je mettrai aussi 40. Maintenant, on va ajouter des contraintes. Bon, pour le ID, on mettra unsigned, c'est-à-dire on veut pas que ce soit signé, seulement les valeurs positives seront reprises. Et pour l'index, on mettra primary, bon, pour dire une clé primaire. Et je mettrai AI pour dire auto-increment. Bon, c'est une valeur que je vais pas insérer manuellement, c'est-à-dire il sera automatiquement géré par le SGBD. Bon, je sauvegarde. Maintenant ma table est créée. Alors là, je vais commencer la saisie du code. Après avoir vérifié l'exactitude des champs, ce qu'il me reste maintenant à faire c'est interroger la base de données. Je mettrai donc une condition if empty message. Bon, ça veut dire que si la variable message est vide, c'est-à-dire il n'y a aucune erreur qui a été rencontrée, elle est restée vide comme elle est initialisée au début. Maintenant on va interroger la base et pour faire ceci, parce que j'aurai besoin de déclarer la chaîne de connexion dans chacune des pages qui va interroger la base de données, alors il serait préférable de créer une page à part qui s'appelle connexion.php qui contiendra cette chaîne de connexion. Alors on va la créer. Bon, je vais l'appeler connexion.php qui contiendra le code de la chaîne de connexion. Bon, je mettrai try. Ensuite l'objet PDO, égal new PDO. Donc ici on mettra le DSN MySQL suivi de host localhost, dbname tuto-php, l'utilisateur c'est root et le mot de passe dans mon cas c'est toujours root. Et là on mettra catch. P2Exception avec l'instance e et je vais afficher l'erreur. Donc echo e->getMessage. Maintenant c'est bon pour la chaîne de connexion. Je vais l'inclure juste ici, je mettrai include. Donc la première opération à faire déjà c'est vérifier l'unicité du login parce que si je veux m'inscrire il faut bien que le login que je fournis à la base de données soit unique. Il faut pas que ce soit déjà utilisé par quelqu'un d'autre. Alors je vais préparer une requête qui va vérifier l'unicité du login. Rec, c'est une instance de la classe PDOStatement. Je mettrai PDO prepare. La requête c'est SELECT par exemple ID FROM users WHERE login=?. Je mets ici un marqueur interrogatif. Je peux mettre LIMIT 1 parce qu'il suffit de trouver un seul login qui est identique Bon, pas la peine de poursuivre la recherche dans la table, je m'arrête. Et là, bon, je vais mettre setFetchMode avec la constante de classe PDO FETCH_ASSOC. Ensuite, j'exécute ma requête en lui passant comme argument une variable de type tableau. Qui contiendra dans ce cas le login, c'est-à-dire c'est la valeur qui va remplacer le marqueur interrogatif. Donc c'est la variable login que j'ai déjà récupérée ici. Ensuite je vais récupérer un tableau associatif tab qui contiendra l'enregistrement, bien les enregistrements qui seront renvoyés. Dans ce cas j'en aurai qu'un seul si le login existe déjà. Bon maintenant il me suffit de vérifier la longueur du tableau, ça veut dire si le tableau contient quelque chose c'est que le login existe déjà. Donc if COUNT tab est supérieur à 0 ou bien est égal à 1. Dans ce cas, je mettrai message égal, je mettrai la balise div et je mets le message Login existe déjà. Else, ce qui signifie que le login n'existe pas déjà, dans ce cas je vais procéder à l'insertion des données de l'utilisateur. Je vais donc mettre notre requête. Par exemple, 1, c'est pour l'insertion. Je commence par préparer la requête de l'insertion. Donc c'est INSERT INTO users. Les champs à insérer sont les suivants: la date, le nom, le prénom, login et le mot de passe. Date, nom, Pour la date, ça sera la date courante. Alors je mettrai la fonction NOW de SQL. Ensuite, je mettrai les marqueurs interrogatifs qui représentent respectivement le nom, le prénom, login et mot de passe. Puis j'exécute. Alors je mets la variable nom, prénom, login, et pour le mot de passe je vais le hacher en MD5. Maintenant si cette opération est bien faite, il suffit de rediriger le navigateur vers la page login.php pour s'authentifier. Voilà, donc maintenant exécutons pour voir ce que ça donne. Alors quand je mets s'inscrire, ça m'affiche bien des erreurs comme quoi des informations manquent. Ensuite je vais mettre mes informations personnelles. Login, bon je mettrai Chini. Mot de passe, bon c'est la même chose. S'inscrire. Bon visiblement ça a passé puisque je suis redirigé vers la page login. Bon je vais vérifier maintenant la base de données. J'ai bien mes informations personnelles qui ont été inscrites. Voilà, avec le mot de passe qui est haché en MD5. Maintenant, je vais essayer de me réinscrire avec le même login. Par exemple, je mettrai juste nom 2, prénom 2. Login, je mettrai le même login que tout à l'heure. Mot de passe, bon, peu importe, je mettrai par exemple 123. Maintenant quand je clique, ça m'affiche login existe déjà. Alors c'est bon, maintenant l'unicité est vérifiée. Maintenant nous allons éditer la page login.php. Alors je mets if isset validé, quand je clique sur le bouton, je vais inclure la chaîne de connexion. Et ensuite, je vais préparer la requête de sélection. Dans cette requête, je vais chercher un enregistrement qui contiendra le login et le mot de passe que j'ai insérés. Je mets donc SELECT* FROM tout WHERE login=? Et le marqueur interrogatif LIMIT 1. Parce que je suis sûr que ça doit figurer qu'une seule fois. Bien sûr, c'est le login et mot de passe sont valides. Ensuite, j'exécute la requête en lui passant les arguments login et mot de passe. Et pour le mot de passe, bien sûr, il faut le haché en MD5 avant de le vérifier. Ensuite, je vais tout mettre dans un tableau associatif. Voilà. Je vérifie maintenant la longueur du tableau. Si c'est égal à 1, alors c'est bon. J'ai donc gagné, le mot de passe existe bel et bien dans ma table. Sinon, alors j'affiche le message manque de login ou mot de passe. Donc je mettrai if current_state égal à 0 carrément. Dans ce cas, le login et le mot de passe ne conviennent pas. Et j'afficherai, je reviens avec la balise li. Mon vdroguine au mot de passe. Sinon, ce qui signifie que les informations sont bonnes, je vais créer une variable de session qui s'appelle autorisé à laquelle j'affecte la valeur oui. Une autre variable de session qui contiendra le nom et le prénom. Dans laquelle je mettrai les informations qui proviendront de la base de données, bien sûr qui sont déjà versées dans le tableau tab. Là je mets l'index 0 parce que je n'ai qu'une seule ligne, c'est-à-dire un seul enregistrement. Nom concaténé avec la même chose, prénom. Bon, je peux tout mettre en majuscule si je veux, par exemple, STYLE TO RAPPER. Ensuite, je redirige le navigateur vers la page session.php. Alors, exécutons pour voir ce que ça donne. Je vais mettre n'importe quoi. M'envoie login et mot de passe. Maintenant si je mets mon login et mon mot de passe, alors c'est bien, ça me renvoie bel et bien vers la page session.php. Maintenant on va éditer le code de la page session.php. Première chose à faire, c'est vérifier si la variable de session autorisée qui est là, s'il vaut bien oui. Donc je mettrai if Autorisé. Je mettrais plutôt différent de oui, c'est-à-dire si l'authentification s'est pas bien déroulée. Dans ce cas, sans se poser de questions, je redirige le navigateur vers la page login.php. C'est-à-dire que l'utilisateur n'a pas le droit d'accéder à cette page. Et par mesure de précaution, je vais exécuter la fonction exit. Ou bien un arrêt prématuré. Bon, comme ça, si jamais la fonction header ne marche pas, c'est rare où ça arrive, mais il existe bel et bien une attaque qui peut compromettre le fonctionnement de la fonction header. Et pour pallier ce problème, on met juste exit par mesure de précaution. Maintenant, si la condition n'est pas vraie, c'est que l'utilisateur s'est bien authentifié. Donc je mettrai ici directement à la place de nom et prénom, j'affiche la valeur session Nom, prénom. Exécutons pour voir. C'est bien, ça affiche bel et bien le nom et le prénom. Pour le message bonjour, je vais le personnaliser. Donc là, je mettrai le code PHP. Je mets echo. Je vais opter pour l'opérateur ternaire, ou bien vous mettez la condition if-else si vous voulez. Je vérifie la fonction date avec la valeur H. Avec la majuscule, ça retourne juste un 0 initial, sinon avec un h minuscule, ça retourne juste la valeur 102 000. Je vais mettre si c'est inférieur à 18, ça veut dire si c'est inférieur à 18 heures. Dans ce cas, je vais afficher bonjour, sinon c'est bonsoir. Exécutons. Ça m'affiche bien bonjour parce qu'il est 16 heures, mais après 18 heures, ça devrait afficher bonsoir. Maintenant quand je clique sur quitter la session, j'ai plus le droit de visiter la page session.php. Bon, il y a juste une petite erreur, bon c'est normal, une notification. Bon, je vais la rectifier. Bon là, je mettrai juste un@. Maintenant je réexécute. Alors la redirection est immédiate. Je recommence. Voilà, il faut être authentifié afin d'accéder à cette page. Maintenant c'est bon. Alors ça sera tout, donc vous avez sûrement compris maintenant comment se servir de l'objet PDO avec un exemple pratique qui est couramment disponible dans la plupart des sites ou applications web. Comme j'ai dit au début de la vidéo, je vais vous laisser le code source en description. Merci pour votre attention et à la vidéo prochaine.
More from Yamossoun

Algorithme de calcule de la racine carrée par dichotomie #dichotomy #squareroot #algorithm









