Google2FA é uma implementação PHP do Módulo de autenticação de dois fatores do Google, com suporte ao algoritmo de senha única baseada em HMAC (HOTP) especificado na RFC 4226 e ao algoritmo de senha única baseada em tempo (TOTP) especificado na RFC 6238.
Este pacote é uma ponte do Laravel para o pacote PHP do Google2FA.
A intenção deste pacote é criar QRCodes para Google2FA e verificar os códigos digitados pelo usuário. Se você precisar criar códigos de backup/recuperação, verifique abaixo.
se precisar criar códigos de recuperação ou backup para fornecer aos usuários uma maneira de recuperar uma conta perdida, você poderá usar o Pacote de Recuperação.
Verifique o Playground do pacote Google2FA.
Aqui está um aplicativo de demonstração mostrando como usar o Google2FA: google2fa-example.
Você pode escanear o código QR nesta (antiga) página de demonstração com um aplicativo Google Authenticator e ver a alteração do código (quase) em tempo real.
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 |
Antes do Google2FA 2.0 (Laravel 5.1) você tinha que instalar pragmarx/google2fa:~1.0
, porque este pacote era um pacote Laravel e um PHP (agnóstico).
Clique aqui para ver a demonstração do middleware:
Use o Composer para instalá-lo:
composer require pragmarx/google2fa-laravel
Você não precisa fazer mais nada, este pacote carrega automaticamente o Provedor de Serviços e cria o Alias, usando o novo recurso Auto-Discovery.
Adicione o alias Service Provider e Façade ao seu app/config/app.php
(Laravel 4.x) ou config/app.php
(Laravel 5.x):
PragmaRXGoogle2FALaravelServiceProvider::class,'Google2FA' => PragmaRXGoogle2FALaravelFacade::class,
fornecedor de artesão php:publish --provider="PragmaRXGoogle2FALaravelServiceProvider"
usar Google2FA;retornar Google2FA::generateSecretKey();
$google2fa = app('pragmarx.google2fa');return $google2fa->generateSecretKey();
Este pacote possui um middleware que o ajudará a codificar 2FA em seu aplicativo. Para utilizá-lo, basta:
protegido $routeMiddleware = [ ...'2fa' => PragmaRXGoogle2FALaravelMiddleware::class, ];
Rota::get('/admin', function () {return view('admin.index'); })->middleware(['auth', '2fa']);
Este pacote usa o pacote Google2FA-QRCode, verifique-o para obter mais informações sobre como configurar os geradores QRCode adequados para o seu caso de uso.
Existem três disponíveis: imagemagick (padrão), svg e eps .
Você pode alterá-lo via configuração:
/* * Qual backend de imagem usar para gerar códigos QR? * * Suporta imagemagick, svg e eps */'qrcode_image_backend' => PragmaRXGoogle2FALaravelSupportConstants::QRCODE_IMAGE_BACKEND_IMAGEMAGICK,
Ou tempo de execução:
Google2FA::setQRCodeBackend('svg');
Você pode definir sua visualização 'pedir uma senha única' no arquivo de configuração (config/google2fa.php):
/** * Visualização de senha única */'view' => 'google2fa.index',
E na view basta fornecer um formulário contendo a entrada, que também é configurável:
/** * Nome de entrada da solicitação de senha de uso único */'otp_input' => 'one_time_password',
Aqui está um exemplo de formulário:
<form action="/google2fa/authenticate" method="POST"><input name="one_time_password" type="text"><button type="submit">Autenticar</button></form>
Normalmente, uma OTP dura para sempre, até que o usuário efetue logoff do aplicativo, mas, para melhorar a segurança do aplicativo, convém solicitar novamente, apenas a OTP do Google, de tempos em tempos. Portanto, você pode definir um número de minutos aqui:
/*** Vida útil em minutos.* Caso você precise que seus usuários sejam solicitados a fornecer novas senhas únicas de tempos em tempos.*/'lifetime' => 0, // 0 = eternal
Tenha em mente que isso usa as sessões do Laravel em segundo plano. Se esse número exceder o valor definido em config('session.lifetime')
você ainda será desconectado, mesmo que seu tempo de vida OTP não tenha expirado.
E você pode decidir se seu OTP será mantido ativo enquanto seus usuários navegam no site ou não:
/** * Renova o tempo de vida a cada nova solicitação. */'keep_alive' => verdadeiro,
Este comando desconectará seu usuário e o redirecionará para o formulário 2FA na próxima solicitação:
Google2FA::logout();
Se não quiser usar a Fachada, você pode:
use PragmaRXGoogle2FALaravelSupportAuthenticator; (novo Autenticador(request()))->logout();
A menos que você precise de algo realmente sofisticado, você provavelmente pode usar o middleware de aceleração de rota do Laravel para isso:
Rota::get('/admin', function () {return view('admin.index'); })->middleware(['auth', '2fa', 'throttle']);
$authenticator = app(Authenticator::class)->bootStateless($request);if ($authenticator->isAuthenticated()) {// otp auth sucesso!}
Você também pode usar um middleware sem estado:
protegido $routeMiddleware = [ ...'2fa' => PragmaRXGoogle2FALaravelMiddlewareStateless::class, ];
Quando o login do Laravel via Remember é ativado, a sessão é renovada e o código 2FA é solicitado novamente. Para resolver isso, adicione o ouvinte LoginViaRemember
em seu AppProvidersEventServiceProvider
:
use IlluminateAuthEventsLogin;use PragmaRXGoogle2FALaravelListenersLoginViaRemember;classe EventServiceProvider estende ServiceProvider {protegido $ ouvir = [ Login::class => [ LoginViaLembrar::class, ], ];...
Os seguintes eventos são disparados:
VazioOneTimePasswordRecebido
Desconectado
Falha no login
Login bem-sucedido
OneTimePasswordExpired
OneTimePassword solicitada
Verifique o arquivo ReadMe no repositório principal do Google2FA.
Os testes do pacote foram escritos com phpspec.
Antonio Carlos Ribeiro
Google2FA é licenciado sob a licença MIT - consulte o arquivo LICENSE para obter detalhes
Solicitações pull e problemas são mais que bem-vindos.