Tutoriel A2F (Authentification à 2 facteurs-Google Authenticator)

Linj

Linj Le 12 septembre 2019 à 02:31 (Édité le 12 septembre 2019 à 05:31)

Bonjour à tous, aujourd'hui je vais vous aider à ajouter un système de double authentification sur votre site. (Désoler des fautes d'orthographe logiquement yen à pas ou alors pas beaucoup)

Pour commencer on va commencer par installer une librairie pour utiliser Google Authenticator.
Donc pour ceci on a deux moyens d'installer une librairie : Composer ou directement sur github
Dans ce tutoriel on va utiliser composer et cette librairie : sonata-project/GoogleAuthenticator
composer require sonata-project/google-authenticator
Explication de l'authentification à 2 facteurs :
cette méthode permet de rajouter une sécurité au compte de votre utilisateur, Quand il voudra se connecter on va lui demander un code(à 6 caractères), si le code est valide alors on connecte l'utilisateur sinon on indique que le code est invalide.

Voilà maintenant qu'on connaît les bases, on va pouvoir commencer.

- Créer un fichier a2f.func.php -
Explication de l'utilité du fichier : ce fichier va nous servir pour utiliser tout le système sans devoir répéter les fonctions en crée une class spéciale.

on va faire un require de l'autoloader de composer :

<php
   require('vendor/autoload.php'); // Permets de charger tous les librairies installées par composer
?>

Maintenant on va créer la class a2f :
<?php
   require('vendor/autoload.php'); // Permets de charger tous les librairies installées par composer
   class a2f{
      public $db; //Variable pour la base de données (en public car sinon on peut pas l'utiliser dans l'activation apres a vous de faire votre système!)
      public function __construct(){
         if(session_status() == PHP_SESSION_NONE){ // Si la session est pas allumé
            session_start(); // Alors on va allumé
         }
         //Il va nous falloir une connexion a la base de données donc on va la crée
         try {
            // On va faire une variable pour configurer les informations de la base de données
            $dbinfo = array('host' => 'localhost', 'dbname' => 'tutoriel', 'username' => 'root', 'password' => '');
            // on set la variable $db et on créer la connexion a la base de données
            $this->db = new PDO('mysql:host='.$dbinfo['host'].';dbname='.$dbinfo['dbname'].'', $dbinfo['username'], $dbinfo['password']);
         } catch(PDOException $e) {
            die('<h1>Impossible de se connecter à la Base de donnée</h1>');
         }
      }
      // Voila maintenant on va créer les fonctions pour l'utiliser la librairies
      public function secret(){ // cette function va nous permettre de créer ou récupérer une clé secret
         if(!isset($_SESSION['a2f_secret'])){ // On vérifier si la personne n'a pas déjà une clé secret
            $g = new \Sonata\GoogleAuthenticator\GoogleAuthenticator(); // on créer une instance de la librairie
            $_SESSION['a2f_secret'] = $g->generateSecret(); // on set la variable de session et généré une clé secret
         }
         return $_SESSION['a2f_secret']; // on retourne la variable de session pour pouvoir récupérer la clé
      }
      public function qrcode(){
         $secret = $this->secret(); // On appelle la function secret pour récupérer une clé secret
         //Username = pseudo/email de l'utilisateur, Secret = la clé secret, Site = Le nom de votre site/application(Pas d'espaces!)
         $qrcodeinfo = array('username' => 'tutoriel@gmail.com', 'secret' => $secret, 'site' => 'TutorielSite');
         // On retourne et on créé le lien du qrcode
         return \Sonata\GoogleAuthenticator\GoogleQrUrl::generate($qrcodeinfo['username'], $qrcodeinfo['secret'], $qrcodeinfo['site']);
      }
      //On va créer une function pour vérifier un code qui est taper par l'utilisateur
      //Code = Le code tapé par l'utilisateur, Callback = la function qu'on veut quand le code est valide(Permets d'utiliser la même fonction pour Activer/désactiver ou pour la connexion d'un utilisateur)
      public function checkcode($code, $callback){
         if(!empty($code)){
            $secret = $this->secret(); // On appelle la function secret pour récupérer une clé secret
            $g = new \Sonata\GoogleAuthenticator\GoogleAuthenticator(); // on créer une instance de la librairie
            // On vérifier si le code est valide
            if($g->checkCode($secret, $code)){
               call_user_func($callback, $this);
               return true;
            } else {
               return false; // Quand le code est invalide
            }
         } else {
            die('code vide'); // Quand le code est vide
         }
      }
   }
?>


Maintenant on va mettre sa en œuvre dans une page pour activer l'authentification à 2 facteurs :
   <?php
   require('a2f.php'); // on require le fichier a2f.php
   $a2f = new a2f(); // on crée une instance de la class a2f
   // On va regarder si le formulaire a été envoyer et si le code n'est pas vide
   if(isset($_POST['code']) AND !empty($_POST['code'])){
      $a2f->checkcode($_POST['code'], function($a2f){
         $insert = $a2f->db->prepare('UPDATE users SET a2f=:a2f WHERE email=:email');
         $insert->execute(array('email' => 'tutoriel@local.host', 'a2f' => $a2f->secret()));
         echo "Code Valide, l'A2F est activer sur votre compte!";
      });
   }
?>
<!DOCTYPE html>
<html>
<head>
   <meta charset="utf-8">
   <title>Activer l'A2F</title>
</head>
<body>
   <form action="" method="POST" style="text-align: center;">
      <p>Activer l'A2F</p>
      <!-- On affiche le qrcode -->
      <img src="<?= $a2f->qrcode(); ?>">
      <br>
      <input type="text" name="code" placeholder="Code..." autofocus="">
      <input type="submit">
   </form>
</body>
</html>
Résultat :

On n'oublie pas de rajouter une colonne dans notre table users :
CREATE TABLE `users` (
  `id` int(11) NOT NULL,
  `email` varchar(255) NOT NULL,
  `mdp` text NOT NULL,
  `a2f` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Voilà on a fini biensûr je vous laisse faire le reste comme sa vous savez comment faire maintenant 😜

indice pour le login : Après avoir vérifié le mot de passe, vous vérifier si l'utilisateur a la double authentification, si oui vous la rediriger vers une page avec un formulaire et un input code, sans le qrcode bien sûr et si le code est bon vous le connecter tout simplement.

Bonne journée/soirée 😃.
SkinDePewDiePie_

SkinDePewDiePie_ Le 12 septembre 2019 à 07:59

Salut, je valide ce tutoriel il marche, j'ai scanné le QR avec mon téléphone et voici le résultat:
otpauth://totp/TutorielSite:tutoriel@gmail.com?secret=(je ne dit pas)&issuer=TutorielSite ^^
Linj

Linj Le 12 septembre 2019 à 08:09

Salut @SkinDePewDiePie_ ce lien redirige directement sur l'application Google Authentificator,
Si l'application est installer au préalable biensur.
Linj

Linj Le 12 septembre 2019 à 09:33

J’espère avoir assez expliquer, Si vous avez des questions exister pas.
Doppler

Doppler Le 12 septembre 2019 à 19:37

Salut @Linj,

Je ne l'ai pas encore testé mais félicitations pour ton tuto !
Assez claire, bien structuré...
Bravo !
SkinDePewDiePie_

SkinDePewDiePie_ Le 13 septembre 2019 à 07:50

@Linj, Google est partout.
Linj

Linj Le 13 septembre 2019 à 20:45

@SkinDePewDiePie_ Nomal 😄,

Merci @Doppler j'ai essayer d’être claire donc content que sa soit le cas
Vous devez être connecté pour poster une réponse. Se connecter ou Créer un compte