Apprenez à utiliser Google Authenticator avec PHP !

Florian.

Premium
Inscription
8 Août 2012
Messages
4 251
Réactions
1 220
Points
14 353
Hello,

Après avoir lu plusieurs doc sur Google Authenticator, j'ai enfin réussi a l'installer xD, pour vous évitez de le faire je vous partage tout ici ;)

Donc let's go, c'est assez simple,

Premièrement, la page ou la personne devra allez avec le pti code barre ( Nom de la page google_auth.php)

Donc voici ma page

PHP:
<?php
require_once('./config/db.php');
require_once('./functions/functions_site.php');
require_once('./vendor/autoload.php');
$authenticator = new PHPGangsta_GoogleAuthenticator();

if(!isconnect()){ header('Location: ./connexion.php'); die();}
if(doubleauth()) {header('Location: ./connexion.php'); die();}

function __doubleauth(){
    global $authenticator;
    $google_key = $authenticator->createSecret();
    if(empty($_SESSION['Google_auth'])) { $_SESSION['Google_auth'] = $google_key; }
    $website = 'Panel du site XXXX';
    $title= 'Code pour le panel '. $_SESSION['username'];
    $qrCodeUrl = $authenticator->getQRCodeGoogleUrl($title, $_SESSION['Google_auth'], $website);
    return "<br ><img src='$qrCodeUrl' />";
}
function _doubleauth(){
    global $bdd;
    global $authenticator;

    if(!$_POST['code']){ return setFlash('Veuillez remplir tous le champ.');}

    $checkResult = $authenticator->verifyCode($_SESSION['Google_auth'], $_POST['code'], '0');
    if(!$checkResult){ return setFlash('Le code est mauvais !');}

    $req = $bdd->prepare('UPDATE Membres set key_google = ? WHERE id = ?');
    $req->execute(array($_SESSION['Google_auth'], $_SESSION['id']));
    return setFlash('La double Authenfication est activé !');
    header('location: ./');
    die();
}
if(isset($_POST['doubleauth'])){ _doubleauth();}
?>

<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <title>Google Authenticator</title>
</head>
<body>
    <?= flash() ?>
    <form action="" method="POST">
    <input type="text" name="code" placeholder="code">
    <?= __doubleauth() ?>
    <br><br><input type="submit" name="doubleauth" value="Verifier votre compte">
    </form>
</body>
</html>

J'explique:

Je stock dans la session, le token généré, pour pas qu'il y a de problème ou autre, deuxièmement, j'affiche l'image généré, modifier $website et $title.

Après c'est tout simple, on vérifie seulement si le token existe, ça renvoie True/false logique, une fois ceci fait, on enregistre la key dans la BDD important pour la suite.

Suivant, la page de connexion avec google Authenticator,

PHP:
<?php
require_once('./config/db.php');
require_once('./functions/functions_site.php');
require 'vendor/autoload.php';

if(isconnect()){ header('Location: ./'); die();}
if(empty($_SESSION['id'])){ header('location: ./'); die(); }

$authenticator = new PHPGangsta_GoogleAuthenticator();
function connexion(){
    global $bdd;
    global $authenticator;
    if(!$_POST['code']){ return setFlash('Veuillez rempir tous le champ.');}

    $get = $bdd->prepare("SELECT * FROM Membres WHERE id = ?");
    $get->execute(array($_SESSION['id']));
    $fetch = $get->fetch();
    $checkResult = $authenticator->verifyCode($fetch['key_google'], $_POST['code'], '0');

    if(!$checkResult){ return setFlash('Le code est mauvais !');}

    $_SESSION['id'] = $fetch['id'];
    $_SESSION['username'] = $fetch['name'];
    $_SESSION['email'] = $fetch['email'];
    $_SESSION['google_authenticator'] = time();
    $_SESSION['token_csrf'] = random(30);

    setFlash('Connexion réussie !', 'success');
    header('Location: ./');
    die();
}

if(isset($_POST['connexiongoogle'])){ connexion();}
?>

<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <title>Google Authenticator</title>
</head>
<body>
    <?= flash() ?>
    <form action="" method="POST">
    <input type="text" name="code" placeholder="code">
    <br><br><input type="submit" name="connexiongoogle" value="Connexion en deux etapes">
    </form>
</body>
</html>

La on affiche pas le code barre x) juste on lui demmande le token, si c'est good ben let's go il peux y allez


Attention, j'ai galéré plusieurs heure car tout simplement, le time() avais un retard de 11Minutes donc j'ai du faire un time()+660 ...

Car tout simplement pour vérifier un code il font floor(time() / 30);

En vrai y'a rien de complexe petit plus:

Sur cette ligne $checkResult = $authenticator->verifyCode($_SESSION['Google_auth'], $_POST['code'], '0');

Si vous mettez par exemple 2 ( a la place de 0 ) tout simplement il pourra rentré les deux dernier code donc qui date d'une minute, pas recommander, c'est 1 par défaut


Si vous avez des problèmes/questions n'hésitez pas ;)

Lien de l'archive =>
 

Fichiers joints

  • google-authenticator.zip
    52.2 KB · Affichages: 2
  • googleauth.zip
    52.2 KB · Affichages: 1
Haut