Tutoriel A2F (Authentification à 2 facteurs-Google Authenticator)
- Accueil
- Forum
- Programmation
- PHP
- Tutoriel A2F (Authentification à 2 facteurs-Google Authenticator)
Linj Le 12 septembre 2019 à 02:31 (Édité le 12 septembre 2019 à 05:31)
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_ Le 12 septembre 2019 à 07:59 (Édité le 1 janvier 1970 à 01:00)
otpauth://totp/TutorielSite:tutoriel@gmail.com?secret=(je ne dit pas)&issuer=TutorielSite ^^
Linj Le 12 septembre 2019 à 08:09 (Édité le 1 janvier 1970 à 01:00)
Si l'application est installer au préalable biensur.
Linj Le 12 septembre 2019 à 09:33 (Édité le 1 janvier 1970 à 01:00)
Doppler Le 12 septembre 2019 à 19:37 (Édité le 1 janvier 1970 à 01:00)
Je ne l'ai pas encore testé mais félicitations pour ton tuto !
Assez claire, bien structuré...
Bravo !
SkinDePewDiePie_ Le 13 septembre 2019 à 07:50 (Édité le 1 janvier 1970 à 01:00)
Linj Le 13 septembre 2019 à 20:45 (Édité le 1 janvier 1970 à 01:00)
Merci @Doppler j'ai essayer d’être claire donc content que sa soit le cas