dolondro / google-authenticator
用于验证 Google Authenticator 应用程序的代码
Requires
- php: >=5.4
- christian-riesen/base32: ^1.2
- paragonie/random_compat: ^2.0|~9.99
- psr/cache: ^1.0
Requires (Dev)
- cache/array-adapter: ^1.0
- cache/filesystem-adapter: ^1.0
- endroid/qr-code: ~2.2|~3
- phpstan/phpstan: ^0.11.3
- phpunit/phpunit: ~6
README
作者注记
尽管这个库没有被弃用,并且应该继续良好工作,但自从这个库发布以来,其他项目已经以非糟糕的风格实现了这一功能,并且已经获得了合理的关注度。
在你实施此功能之前,请考虑是否 otphp 可能适合你的用例。
简介
双因素认证非常棒。太多的人为多件事使用相同的密码,有时拥有一个安全的应用程序是非常好的。
使用 Google Authenticator 允许人们拥有另一层安全措施,只有当他们在手机上有密码和正确设置的 Google Authenticator 应用程序时,才能访问你的 web 应用程序/服务。
实现
就我所知,在撰写本文时,有另外两个用于与 Google Authenticator 交互的 PHP 库。这两个库都能正常工作,但似乎都没有太多更新,也没有采用现代最佳实践。
这个库的优点是更容易(我希望)集成到现有库中,并且包含内置对 PSR-6 缓存接口的支持,以减少重放攻击的可能性。
使用方法
您可以使用以下代码在您的应用程序中创建用于应用的密钥代码:
$issuer = "MyAwesomeCorp"; $accountName = "MrsSmith"; $secretFactory = new SecretFactory(); $secret = $secretFactory->create($issuer, $accountName);
这将为您提供密钥。您应该:
- 将此对象输入 QrImageGenerator 以供您的用户扫描到他们的手机上。
- 将密钥附加到他们的用户账户上,以便您可以查询它。
此库包含两个 ImageGenerator 实现。
- EndroidQrImageGenerator 需要您使用 composer require
endroid/qr-code:~2.2|~3
,它可以在不依赖任何外部服务的情况下生成。 - GoogleImageGenerator 使用 Google 二维码 API 生成图像。
我建议使用 Endroid,因为现在 Google 已经 弃用了他们的二维码 API。
如果这两个都不适合您的某个原因,创建另一个实现也很容易,因为所有它需要做的就是为 $secret->getUri()
中的数据生成一个二维码。
您可以使用此方法验证用户是否成功:
$googleAuth = new GoogleAuthenticator(); $googleAuth->authenticate($secret, $code);
验证将返回布尔值 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 规范