【问题标题】:How to create google two factor authentication using php?如何使用 php 创建谷歌两因素身份验证?
【发布时间】:2017-02-17 06:30:37
【问题描述】:

我想在我的 PHP 项目中使用 Google 2FA。用户登录时需要输入6位2fa码。

您能否就采取的方向提出一些建议?

【问题讨论】:

  • 到目前为止你做了什么?
  • 我还是没有开始这个。因为我不知道怎么做?
  • 你可能想看到这个答案stackoverflow.com/questions/16908124/…
  • 我已经完成了这个模块。它是根据下面的 amit 参考链接开发的。但无论如何感谢您对此的回应。
  • 如果您对2FA一无所知,您必须先了解它,然后再询问。如果您不知道 Google Authenticator 是如何工作的,那么同样适用于他们的文档。一旦你开始了一些接地气的工作,如果你有什么问题或者不明白的地方,你可以来这里问。

标签: php two-factor-authentication google-authenticator


【解决方案1】:

步骤 1) 创建一个长度为 16 个字符的唯一密码。 PHPGangsta 为 Google Authenticator 提供包装类。您可以使用 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;
 
?>
 

第 2 步)使用生成的密码创建二维码。

我们需要准备一个使用密码的二维码。如果您想了解更多关于 Google Authenticator 二维码生成的信息。 Github 维基 您可以使用任何二维码生成器来生成二维码,对于这个演示,我使用的是谷歌图表。

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;

第 3 步)使用 Google Authenticator App 生成 TOTP(基于时间的一次性密码)

从 Google Play 或 AppStore 下载 Google Authenticator 应用

打开应用程序并点击“+”按钮,然后扫描使用谷歌图表生成的二维码。 Authenticator 应用程序为您的网站生成 TOTP。 TOTP 将每 30 秒更改一次。

使用 Google Authenticator 进行双重身份验证

步骤 4) 在服务器端验证 OTP

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';
}

   source code refer this link : http://hayageek.com/two-factor-authentication-with-google-authenticator-php/

【讨论】:

  • 感谢您提供此代码。如果有任何澄清,我会尝试此操作并回复您。
【解决方案2】:

您使用哪个软件包非常重要,因为您非常信任控制该软件包的人。我宁愿不使用一个叫 PHPGangsta 的,而是使用this one

更新

我在下面留下了我原来的答案,但奏鸣曲解决方案的问题在于它查询 api.qrserver.com。他们有这些文档可用here。他们非常乐意提供这项服务,但我不认识他们,所以我不能信任他们。

我选择了this solution,它受到 PHPGangsta 的启发,似乎也是一种改进。一般来说,这似乎是一个更值得信赖的解决方案。我是这样使用的:

首先使用composer添加:

composer require robthree/twofactorauth

然后就可以打印出二维码了:

$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';
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-23
    • 2018-08-26
    • 1970-01-01
    • 2014-05-30
    • 2019-07-21
    • 1970-01-01
    • 2020-12-09
    • 2014-12-03
    相关资源
    最近更新 更多