使用PHP实现谷歌身份验证器

13

我使用https://github.com/chregu/GoogleAuthenticator.php为正在开发的网络应用建立了两步验证。所有生成密钥和验证码的操作都正常。

现在我在另一台服务器上设置了相同的代码,生成了新的密钥,并将其添加到 Google Authenticator 移动应用程序中。但是移动应用程序生成的代码与之前不符。

通过比较这两个服务器的结果,我发现 time() 函数返回的时间不同(相差 1 小时),然后我强制我的第二个服务器(Google 代码不起作用的那台)与第一个服务器具有相同的时间,它就可以了。所以我真的很困惑,这是否是某种时区问题?因为我希望这些服务器有自己的时区。

有没有什么解决方法?

另外,我按照https://support.google.com/accounts/answer/185834?hl=en的说明同步了我的 Google Authenticator 应用程序,但仍然不起作用。移动应用程序生成的代码在一个小时后才能在我的第二个服务器上使用。请问有人能帮助我或建议我不同的方法吗?

这里是我用于连接上述库的代码:

class googleAuthLibrary extends GoogleAuthenticator
{
    public function getSecretKey()
    {
        $secretKey = $this->generateSecret();

        return $secretKey;
    }

    public function getQRLink($username, $hostname, $secretKey)
    {
        $url = 'https://chart.googleapis.com/chart?cht=qr&chs=300x300&chl=';

        $qrCode = 'otpauth://totp/'.$username.'@'.$hostname.'?secret='.$secretKey;

        $url = $url.$qrCode;

        return $url;
    }

    public function getAuthCode($secretKey)
    {
        $authCode =$this->getCode($secretKey);

        return $authCode;
    }
}

经过一番认真思考 :),我正在考虑保存更多的信息,例如用户的时区,然后通过根据他们所属的时区来操作时间来获取代码。是否有其他更好的解决方案? - Abhishek Salian
1个回答

20

发现我的服务器时间与互联网时间不同步。在同步网络服务器时间后,该问题得到解决。

时区不会影响认证器,只要移动电话和服务器已经同步以拥有正确的时间(NTP服务器)。

如果有任何人遇到相同问题,请检查服务器时间和移动电话时间,确保它们显示正确的时间,即使是一分钟慢或快也可能导致生成错误的代码。


4
这意味着来自美国的服务器和来自印度的人必须处于相同的时区吗?这似乎是不切实际的。客户可能有不同的时区,那么如何运行代码呢? - Ashu Kumar
不,那与所说的相反:“时区不会影响身份验证器”。相反,如果您的时钟偏移了,就会出现问题,因为计算机时钟有时会像模拟时钟一样偏移。如果发生这种情况,那么事情可能无法正常工作,因此您应该使用时间服务器来保持时钟同步。 - HappyDog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接