dolondro / google-authenticator

用于验证 Google Authenticator 应用程序的代码

2.2.0 2021-05-24 13:41 UTC

This package is auto-updated.

Last update: 2024-09-24 20:55:24 UTC


README

作者注记

尽管这个库没有被弃用,并且应该继续良好工作,但自从这个库发布以来,其他项目已经以非糟糕的风格实现了这一功能,并且已经获得了合理的关注度。

在你实施此功能之前,请考虑是否 otphp 可能适合你的用例。

简介

双因素认证非常棒。太多的人为多件事使用相同的密码,有时拥有一个安全的应用程序是非常好的。

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

实现

就我所知,在撰写本文时,有另外两个用于与 Google Authenticator 交互的 PHP 库。这两个库都能正常工作,但似乎都没有太多更新,也没有采用现代最佳实践。

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

使用方法

您可以使用以下代码在您的应用程序中创建用于应用的密钥代码:

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

这将为您提供密钥。您应该:

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

此库包含两个 ImageGenerator 实现。

  1. EndroidQrImageGenerator 需要您使用 composer require endroid/qr-code:~2.2|~3,它可以在不依赖任何外部服务的情况下生成。
  2. 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 规范