Как создать двухфакторную аутентификацию Google с использованием php?

Я хочу использовать Google 2FA в моем проекте PHP. Пользователь должен ввести 6-значный код 2fa при входе в систему.

Можете ли вы дать несколько советов, в каком направлении идти?

2 ответа

Решение
Step 1) Create a unique secret code of length 16 characters.
PHPGangsta provides wrapper class for Google Authenticator. You can download using composer.

curl -sS https://getcomposer.org/installer | php
php composer.phar require  phpgangsta/googleauthenticator:dev-master
Use the below code to generate the secret code.

<?php
require 'vendor/autoload.php';
$authenticator = new PHPGangsta_GoogleAuthenticator();
$secret = $authenticator->createSecret();
echo "Secret: ".$secret;

?>


Step 2) Create a QR code withe the generated secret.

We need to prepare a QR code using the secret. If you want to read more about QR code generation for Google Authenticator. Github Wiki
You can use any QR code generator to generate the QR code, For this demo I am using Google charts.

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
require 'vendor/autoload.php';
$authenticator = new PHPGangsta_GoogleAuthenticator();
$secret = $authenticator->createSecret();
echo "Secret: ".$secret."\n";  //save this at server side


$website = 'http://hayageek.com'; //Your Website
$title= 'Hayageek';
$qrCodeUrl = $authenticator->getQRCodeGoogleUrl($title, $secret,$website);
echo $qrCodeUrl;

?>


Step 3) Generate TOTP (Time-Based One time password) using Google Authenticator App

Download the Google Authenticator app from Google Play or AppStore

Open the app and Click on ‘+’ Button, and scan the QR code generated using Google Charts. Authenticator app generates the TOTP for your website. TOTP will change for every 30 secs.

Two factor authentication with Google Authenticator

Step 4) Verifying OTP at server side

<?php
require 'vendor/autoload.php';
$authenticator = new PHPGangsta_GoogleAuthenticator();

$secret = '3JMZE4ASZRIISJRI'; //This is used to generate QR code
$otp = '183036' ;//Generated by Authenticator.

$tolerance = 0;
    //Every otp is valid for 30 sec.
    // If somebody provides OTP at 29th sec, by the time it reaches the server OTP is expired.
    //So we can give tolerance =1, it will check current  & previous OTP.
    // tolerance =2, verifies current and last two OTPS

$checkResult = $authenticator->verifyCode($secret, $otp, $tolerance);    

if ($checkResult) 
{
    echo 'OTP is Validated Succesfully';

} else {
    echo 'FAILED';
}

?>

Исходный код см. по этой ссылке: http://hayageek.com/two-factor-authentication-with-google-authenticator-php/

Какой пакет вы используете, очень важно, потому что вы очень доверяете человеку, который контролирует этот пакет. Я бы предпочел не использовать PHPGangsta, а использовать этот.

ОБНОВИТЬ

Я оставляю свой первоначальный ответ ниже, но проблема с решением для сонаты заключается в том, что оно запрашивает api.qrserver.com. У них есть эти документы, доступные здесь. Очень мило с их стороны предложить эту услугу, но я их не знаю, поэтому не могу им доверять.

Вместо этого я выбрал это решение , вдохновленное PHPGangsta, которое также кажется улучшением. Как правило, это кажется более надежным решением. Я использую это так:

Сначала добавьте его с помощью композитора:

      composer require robthree/twofactorauth

Затем вы можете распечатать QR-изображение:

      $tfa = new TwoFactorAuth(env('APP_NAME'));
$secret = $tfa->createSecret();
$qrCodeImage = $tfa->getQRCodeImageAsDataUri($user->email, $secret);
echo '<img src='.$qrCodeImage.' />';

А затем подтвердите:

      $tfa = new TwoFactorAuth();
$result = $tfa->verifyCode($secret, $code);
if (empty($result)) print 'Sorry!';
else print 'Yes!';

НИЖЕ МОЙ СТАРЫЙ ОТВЕТ, НО Я НЕ РЕКОМЕНДУЮ ИСПОЛЬЗОВАТЬ ЭТО РЕШЕНИЕ

Добавьте его с помощью композитора:

      composer require sonata-project/google-authenticator

Сгенерируйте новый код:

      $g = new \Google\Authenticator\GoogleAuthenticator();
$salt = '7WAO342QFANY6IKBF7L7SWEUU79WL3VMT920VB5NQMW';
$secret = $username.$salt;
echo '<img src="'.$g->getURL($username, 'example.com', $secret).'" />';

А затем подтвердите это:

      $g = new \Google\Authenticator\GoogleAuthenticator();
$salt = '7WAO342QFANY6IKBF7L7SWEUU79WL3VMT920VB5NQMW';
$secret = $username.$salt;
$check_this_code = $_POST['code'];
if ($g->checkCode($secret, $check_this_code)) {
  echo 'Success!';
} else {
  echo 'Invalid login';
}
Другие вопросы по тегам