georgechaduneli/google-authenticator

用于将 Google Authenticator 集成到 PHP 项目的库

dev-master / 2.x-dev 2020-06-18 20:35 UTC

This package is auto-updated.

Last update: 2024-08-29 05:22:11 UTC


README

介绍

两步验证非常棒。太多人使用相同的密码进行多种操作,有时拥有一个真正安全的应用程序会很好。

使用 Google Authenticator 允许人们拥有另一层安全防护,只有当他们在手机上同时拥有密码和正确设置的 Google Authenticator 应用时,才能访问您的 Web 应用程序/服务。

实现

据我所知(在写作本文时),有另外两个 PHP 库可以与 Google Authenticator 交互。这两个库都可以工作,但似乎都没有更新,也没有采用现代最佳实践。

这个库的优点是更容易(我希望)集成到现有库中,并包含内置对 PSR-6 缓存接口的支持,以减少重放攻击的可能性。

使用

您可以使用以下方式为您的应用程序创建初始的密钥代码

$issuer = "MyAwesomeCorp";
$accountName = "MrsSmith";
$secretFactory = new SecretFactory();
$secret = $secretFactory->create($issuer, $accountName);

这会给你一个密钥。你应该

  1. 将此对象输入到 QrImageGenerator 中,以便用户可以将 QR 码扫描到他们的手机上
  2. 将其附加到用户账户上,以便您可以查询它

此库包含两个 ImageGenerator 实现

  1. EndroidQrImageGenerator,它需要您通过 composer require endroid/QrCode:~2.2|~3 安装,它可以生成不带任何外部服务依赖项的 QR 码。
  2. GoogleImageGenerator,它使用 Google QR 码 API 生成图像。

我建议使用 Endroid,因为看起来 Google 已经弃用了他们的 QR 码 API

如果这两个都不符合您的需求,很容易创建另一个实现,因为所有它需要做的就是为 $secret->getUri() 中的数据生成 QR 码。

您可以使用以下方式验证用户是否成功

$googleAuth = new GoogleAuthenticator();
$googleAuth->authenticate($secret, $code);

Authenticate 将返回布尔值 true/false。

如果您想使用 PSR-6 缓存接口来尝试防止重放攻击,可以这样做

$googleAuth = new GoogleAuthenticator();
$googleAuth->setCache($cacheItemPoolInterface);
$googleAuth->authenticate($secret, $code);

如果在过去 30 秒内使用过该密钥,它将返回 false。

示例

此代码的示例实现可以在 example.php 文件中找到,可以运行如下

php example.php

这将允许您生成密钥,然后测试它,或者

php example.php mysecretcode

这将允许您使用现有的代码进行测试,以验证您的代码是否有效

参考资料

其他 PHP Google Authenticator 实现

Google Authenticator 规范