Atelier PHP : authentification.
Réponse AJAX

Information sur...Les sites au contenu protégé

Certains sites web ne sont pas accessibles à n'importe-qui : pour pouvoir y accéder, il faut être un utilisateur authentifié (c'est à dire posséder un login et un mot de passe). C'est le cas du site sur lequel se trouve cet atelier : http://www.bts-sio.com/.

Grâce à cet atelier, nous allons mettre en oeuvre une des techniques qui permettent de mettre en place ces protections. Les utilisateurs autorisés seront stockés dans une base de données MySQL. L'authentification se fait grâce à PHP.

Création de la base des utilisateurs autorisés

Les utilisateurs autorisés à se connecter auront leurs identifiants stockés dans une table MySQL. C'est grâce à une requête SQL qu'on vérifiera si un visiteur s'authentifie correctement (bon login, bon mot de passe).

Vous devez créer votre base de données, qui doit avoir comme nom login_db, où login est votre nom d'utilisateur (par exemple : spastore_db).

Vous devez ensuite créer la table Utilisateur, constituée des champs suivants :

Collez ici le code SQL généré par PHPMyAdmin au moment où vous avez créé votre table, et qui sert à créer la table (CREATE TABLE ...) (si vous avez perdu ce code, faite "exporter" de la table) :

Votre réponse n°1

Grâce à la commande Insérer de phpMyAdmin, remplissez cette table avec au moins un utilisateur :

Préparer l'arborescence pour votre site sur le serveur Internet

Pour que les pages de ce TP ne soient pas mélangées aux autres pages des autres sites déjà présents dans Apache, on va travailler dans un sous-répertoire de la racine Web de Apache.

Créez le sous-répertoire v_anonyme_authentification sous la racine Web de Apache (en 2016-17, la racine Web de Apache est C:\wamp\www\);

Créez également une page index.php, qui représente la page d'accueil de votre site Web. C'est cette page qu'on va se charger de protéger. Elle contient le texte :
Bienvenue sur mon site Web

Création de la page contenant le formulaire HTML d'authentification

Dans votre site, créez la page authentification.php (grâce à NotePad++ par exemple).

Cette page doit contenir le formulaire d'authentification, où l'utilisateur peut saisir son login et son mot de passe. Le résultat pourra ressembler à ça :

où le nom du champ login va être : formlogin et le nom du champ mot de passe va être : formpwd. La page appelée lorsque on valide le formulaire est authentification.php. Eventuellement, soignez la présentation et l'alignement grâce à un tableau HTML.

Prenez soin à ce que le mot de passe soit discret, c'est à dire qu'on ne le voit ni dans le formulaire (au moment où on le tape), ni dans l'URL (au moment où on soumet le formulaire au serveur).

Collez le code de cette page, lorsqu'elle est au point :

Votre réponse n°2

Ajout du code PHP qui vérifie l'authentification

Dans cette même page, on va rajouter le code PHP qui vérifie l'authentification. Comme souvent dans nos site Web, c'est la même page qui affiche un formulaire puis qui, dans un deuxième temps (lorsqu'on soumet le formulaire et que la page est rappelée), traite ce formulaire.

Le code PHP qui vérifie l'authentification va être placé avant le formulaire. En effet, si l'authentification est correcte, il sera inutile de ré-afficher le formulaire puisqu'on fera une redirection vers la page d'accueil du site (index.php).

Ajoutez maintenant le code PHP qui vérifie l'authentification en respectant la structure suivante (remplacez les TODO par du vai code, les commentaires sans TODO sont juste informatifs) :

Testez, cela devrait marcher : une mauvaise authentification vous réaffiche le formulaire, une bonne authentification vous redirige vers la page d'accueil du site index.php.

Toutefois, vous remarquez que la page d'accueil n'est pas encore vraiment protégée, puisqu'on peut y accéder en tapant son URL dans le navigateur. C'est dans une étape ultérieure que l'on va rendre la protection effective.

Collez ici le code PHP réalisé à cette étape :

Votre réponse n°3

Gestion de la déconnexion

Pour se déconnecter, il faut supprimer le cookie d'authentification. Pour supprimer un cookie, il faut appeler setcookie avec le nom du cookie, et la valeur false :
setcookie("cookieauthentification", false) ;

Dans la page d'accueil (ou dans le menu si vous travaillez sur un vrai site), ajoutez un lien Déconnexion qui pointe vers une page déconnexion.php.

La page deconnexion.php supprime le cookie d'authentification et redirige vers la page d'authentification. :

Après avoir vérifié que tout marche (le cookie est bien supprimé), collez ici le code de la page déconnexion.php :

Votre réponse n°4

Protection de la page d'accueil grâce à la vérification du cookie

Il est théoriquement possible pour l'utilisateur d'accéder directement à votre page d'accueil index.php, sans passer par la page d'authentification. Il lui suffit d'en taper l'URL dans son navigateur. Pour l'instant, l'authentification est donc inefficace pour la sécurité du site.

Pour améliorer cela, vous allez ajouter le code suivant tout au début de la page index.php :

Remarques : toutes les pages du site, au contenu confidentiel, devront être protégées de la sorte.

Mettez ceci en œuvre, vérifier que la page est bien protégée (si on n'est pas authentifié, on ne peut pas voir la page index.php car on est redirigé vers l'authentification). Collez ici le début de votre page d'accueil :

Votre réponse n°5

Amélioration du cookie : stockage du numéro (clé primaire)
de l'utilisateur authentifié

Ceci est important car, lorsqu'un internaute demande une page, on veut souvent savoir qui il est pour lui envoyer un contenu personnalisé.

Modifiez le code PHP de l'authentification, de façon à ce que "cookieauthentification" contienne la clé primaire de l'utilisateur qui vient de s'authentifier. Pour ça, vous devrez utiliser mysqli_fetch_assoc lorsque l'authentification est réussie.

Collez ici le nouveau code PHP qui vérifie l'authentification :

Votre réponse n°6

Cryptage des mots de passe dans la table utilisateur grâce à la fonction SHA1 de MySQL

Par respect pour les visiteurs de vos sites Web, je recommande très fortement de crypter les mots de passe que ceux-ci confient à vos bases de données.

À l'endroit où l'on vérifie l'authentification, modifier votre code PHP en ajoutant la fonction SHA1 (c'est une fonction MySQL), qui permet de crypter le mot de passe saisi dans le formulaire, afin de le comparer au mot de passe crypté dans la table utilisateur :
select ... where ... pwd=SHA1('$formpwd')

Dans PHPMyAdmin, cryptez les mots de passe de la table en exécutant (une seule fois !) la requête SQL suivante (remarquez bien l'effet de la commande SHA1 sur le contenu de la table !).
update utilisateur set pwd = SHA1(pwd) ;

Testez, l'authentification doit marcher à l'identique.

Collez ici la nouvelle version de la ligne PHP qui exécute la requête d'authentification :

Votre réponse n°7

Création d'un formulaire d'inscription
pour les nouveaux adhérents

Attention, dans cette étape vous devez être plus autonome.

L'objectif est de faire en sorte que les utilisateurs qui ne sont pas encore stockés dans la base puissent s'inscrire. Ainsi, dès qu'on arrive sur le site, on a le choix entre :

Pour ça, vous devez :

vérifiez que vous arrivez à inscrire un nouveau visiteur, puis à vous loguer sous son compte.

"L'inscription équivaut à une authentification" : Qu'est-ce que cela implique ?

Votre réponse n°8

Copiez ici le code HTML qui affiche le formulaire d'inscription :

Votre réponse n°9

Copiez ici le code PHP qui effectue l'ensemble de l'inscription :

Votre réponse n°10

Améliorations possibles (facultatif)

Pour l'authentification, les améliorations possibles sont :

Collez ici la page authentification.php après amélioration :

Votre réponse n°11

Pour l'inscription, les améliorations possibles sont :

Collez ici la page inscription.php après amélioration :

Votre réponse n°12

Si vous pensez à d'autres améliorations, notez-les en commentaire en bas de cette page.