georgechaduneli / google-authenticator
用于将 Google Authenticator 集成到 PHP 项目的库
Requires
- php: ^7.0
- paragonie/random_compat: ^2.0
Requires (Dev)
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);
这会给你一个密钥。你应该
- 将此对象输入到 QrImageGenerator 中,以便用户可以将 QR 码扫描到他们的手机上
- 将其附加到用户账户上,以便您可以查询它
此库包含两个 ImageGenerator 实现
- EndroidQrImageGenerator,它需要您通过 composer require
endroid/QrCode:~2.2|~3
安装,它可以生成不带任何外部服务依赖项的 QR 码。 - 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 规范