Google2FA est une implémentation PHP du module d'authentification à deux facteurs de Google, prenant en charge l'algorithme de mot de passe à usage unique basé sur HMAC (HOTP) spécifié dans la RFC 4226 et l'algorithme de mot de passe à usage unique basé sur le temps (TOTP) spécifié dans la RFC 6238.
Ce package est un pont Laravel vers le package PHP de Google2FA.
Le but de ce package est de créer des QRCodes pour Google2FA et de vérifier les codes saisis par l'utilisateur. Si vous devez créer des codes de sauvegarde/récupération, veuillez vérifier ci-dessous.
si vous devez créer des codes de récupération ou de sauvegarde pour permettre à vos utilisateurs de récupérer un compte perdu, vous pouvez utiliser le package de récupération.
Veuillez consulter le Google2FA Package Playground.
Voici une application de démonstration montrant comment utiliser Google2FA : google2fa-example.
Vous pouvez scanner le code QR sur cette (ancienne) page de démonstration avec une application Google Authenticator et voir l'évolution du code (presque) en temps réel.
Laravel | Google2FA | Google2FA-Laravel |
---|---|---|
4.2 | <= 1.0.1 | |
5.0-5.1 | <= 1.0.1 | |
5.2-10.x | >= 2.0.0 | >= 0,2,0 |
Avant Google2FA 2.0 (Laravel 5.1), vous devez installer pragmarx/google2fa:~1.0
, car ce package était à la fois un package Laravel et un PHP (agnostique).
Cliquez ici pour voir la démo du middleware :
Utilisez Composer pour l'installer :
composer require pragmarx/google2fa-laravel
Vous n'avez rien d'autre à faire, ce package charge automatiquement le fournisseur de services et crée l'alias, à l'aide de la nouvelle fonctionnalité de découverte automatique.
Ajoutez le fournisseur de services et l'alias Facade à votre app/config/app.php
(Laravel 4.x) ou config/app.php
(Laravel 5.x) :
PragmaRXGoogle2FALaravelServiceProvider::class,'Google2FA' => PragmaRXGoogle2FALaravelFacade::class,
Vendeur artisanal php :publish --provider="PragmaRXGoogle2FALaravelServiceProvider"
utilisez Google2FA ; retournez Google2FA ::generateSecretKey();
$google2fa = app('pragmarx.google2fa');return $google2fa->generateSecretKey();
Ce package dispose d'un middleware qui vous aidera à coder 2FA sur votre application. Pour l'utiliser, il vous suffit de :
protégé $routeMiddleware = [ ...'2fa' => PragmaRXGoogle2FALaravelMiddleware::class, ];
Route::get('/admin', function () {return view('admin.index'); }) -> middleware (['auth', '2fa']);
Ce package utilise le package Google2FA-QRCode, veuillez le consulter pour plus d'informations sur la façon de configurer les générateurs QRCode appropriés pour votre cas d'utilisation.
Il y en a trois disponibles : imagemagick (par défaut), svg et eps .
Vous pouvez le modifier via config :
/* * Quel backend d'image utiliser pour générer des codes QR ? * * Prend en charge imagemagick, svg et eps */'qrcode_image_backend' => PragmaRXGoogle2FALaravelSupportConstants::QRCODE_IMAGE_BACKEND_IMAGEMAGICK,
Ou exécution :
Google2FA::setQRCodeBackend('svg');
Vous pouvez définir votre vue « demander un mot de passe à usage unique » dans le fichier de configuration (config/google2fa.php) :
/** * Affichage du mot de passe unique */'view' => 'google2fa.index',
Et dans la vue il suffit de fournir un formulaire contenant la saisie, qui est également configurable :
/** * Nom d'entrée de la demande de mot de passe à usage unique */'otp_input' => 'one_time_password',
Voici un exemple de formulaire :
<form action="/google2fa/authenticate" method="POST"><input name="one_time_password" type="text"><button type="submit">Authentifier</button></form>
Habituellement, un OTP dure éternellement, jusqu'à ce que l'utilisateur se déconnecte de votre application, mais, pour améliorer la sécurité de l'application, vous souhaiterez peut-être redemander, uniquement pour l'OTP Google, de temps en temps. Vous pouvez donc définir ici un nombre de minutes :
/*** Durée de vie en minutes.* Au cas où vous auriez besoin qu'on demande de temps en temps à vos utilisateurs un nouveau mot de passe unique.*/'lifetime' => 0, // 0 = éternel
Gardez à l'esprit que cela utilise les sessions Laravel en arrière-plan. Si ce nombre dépasse la valeur définie dans config('session.lifetime')
vous serez toujours déconnecté, même si la durée de vie de votre OTP n'a pas expiré.
Et vous pouvez décider si votre OTP restera actif pendant que vos utilisateurs naviguent sur le site ou non :
/** * Renouveler la durée de vie à chaque nouvelle demande. */'keep_alive' => vrai,
Cette commande déconnectera votre utilisateur et le redirigera vers le formulaire 2FA lors de la prochaine requête :
Google2FA :: déconnexion ();
Si vous ne souhaitez pas utiliser la Façade, vous pouvez :
utilisez PragmaRXGoogle2FALaravelSupportAuthenticator ; (nouvel Authenticator(request()))->logout();
À moins que vous n'ayez besoin de quelque chose de vraiment sophistiqué, vous pouvez probablement utiliser le middleware d'accélérateur de route de Laravel pour cela :
Route::get('/admin', function () {return view('admin.index'); }) -> middleware (['auth', '2fa', 'throttle']);
$authenticator = app(Authenticator::class)->bootStateless($request);if ($authenticator->isAuthenticated()) {// succès de l'authentification otp !}
Vous pouvez également utiliser un middleware sans état :
protégé $routeMiddleware = [ ...'2fa' => PragmaRXGoogle2FALaravelMiddlewareStateless::class, ];
Lorsque la connexion Laravel via Remember est activée, la session est rénovée et le code 2FA est à nouveau requis. Pour résoudre ce problème, ajoutez l'écouteur LoginViaRemember
dans votre AppProvidersEventServiceProvider
:
utiliser IlluminateAuthEventsLogin ; utiliser PragmaRXGoogle2FALaravelListenersLoginViaRemember ; la classe EventServiceProvider étend ServiceProvider {protégé $écouter = [ Connexion ::class => [ LoginViaRemember::classe, ], ];...
Les événements suivants sont déclenchés :
EmptyOneTimePasswordReceived
Déconnecté
La connexion a échoué
ConnexionRéussi
OneTimePasswordExpiré
OneTimePasswordRequested
Vérifiez le fichier ReadMe dans le référentiel principal de Google2FA.
Les tests du package ont été écrits avec phpspec.
Antonio Carlos Ribeiro
Google2FA est sous licence MIT - voir le fichier LICENSE pour plus de détails
Les demandes de tirage et les problèmes sont plus que bienvenus.