PHP v7.4、Laravel v7.28.3 我使用 pragmarx/google2fa-laravel
二维码生成:
$google2fa = app('pragmarx.google2fa');
$google2fa->setAlgorithm(Constants::SHA512);
$secret = $google2fa->generateSecretKey(64);
$user->google2fa_secret = $secret;
$user->save();
$QR_Image = $google2fa->getQRCodeInline(
config('app.name'),
$user->email,
$user->google2fa_secret
);
然后我在前端渲染 QR。二维码看起来很完美,我通过 Google 2fa 应用程序扫描它,代码生成器成功添加到应用程序。
当我尝试验证应用程序中的代码时,它总是返回 false。验证码:
$code = 'I paste here the code from the application manually';
$google2fa = app('pragmarx.google2fa');
var_dump($google2fa->verifyKey($user->google2fa_secret, $code, 10));
但是当我使用 $user->google2fa_secret (我可以在数据库中检查它)手动将代码生成器添加到移动应用程序时,它工作得很好,该生成器中的所有代码都通过了验证。似乎生成的 QR 图像有问题...
2年后更新。我看到很多人都有同样的问题,但不幸的是我不记得我是如何解决的。我可以提供一个有效的实现示例:
二维码生成:
$google2fa = app('pragmarx.google2fa');
$secret = $google2fa->generateSecretKey();
$user->google2fa_secret = $secret;
$qrCode = $google2fa->getQRCodeInline(
config('app.name'),
$user->email,
$user->google2fa_secret
);
验证:
$google2fa->verifyKey($user->google2fa_secret, {{code provided by user from application }}); //returns bool
google2fa.php 配置:
'qrcode_image_backend' => \PragmaRX\Google2FALaravel\Support\Constants::QRCODE_IMAGE_BACKEND_SVG,
这就是我的使用方式
pragmarx/google2fa
use Google2FA;
use Illuminate\Support\Facades\Auth;
public function setup()
{
Google2FA::setQRCodeBackend('svg');
$secret = Google2FA::generateSecretKey();
$qr = Google2FA::getQRCodeInline(
config('app.name'),
Auth::user()->email,
$secret
);
return view('google2fa.setup', compact('secret', 'qr'));
}
public function verify(Request $request)
{
$request->validate([
'otp' => 'required|numeric',
]);
if (!Google2FA::verifyKey(Auth::user()->google2fa_secret, $request->otp)) {
return back()->withErrors('Invalid One Time Password');
}
Google2FA::login();
return redirect('/home');
}
如果您使用
pragmarx/google2fa-qrcode
,还需要安装bacon/bacon-qr-code