13

我已经使用https://github.com/chregu/GoogleAuthenticator.php为我正在开发的 Web 应用程序构建了一个 2 因素身份验证。一切都可以产生秘密,甚至代码也可以工作。现在我在不同的服务器中设置了相同的代码并生成了新的密钥并将其添加到谷歌身份验证器移动应用程序中,现在移动中生成的代码不匹配。

我通过比较两台服务器上的结果进行挖掘,并注意到 time() 函数返回不同的时间(1 小时差异)然后我强制我的第二台服务器(谷歌代码不起作用)与第一台服务器具有相同的时间并且它起作用了。所以我真的很困惑这是某种时区问题吗?因为我真的需要这些服务器有自己的时区。

有什么解决办法吗?

我也关注了https://support.google.com/accounts/answer/185834?hl=en并同步了我的谷歌身份验证器应用程序仍然无法正常工作。一小时后,移动应用程序中生成的代码可以在我的第二台服务器上运行。任何人都可以帮助我或建议我采用不同的方法。

这是我用来连接到上述库的代码

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;
    }
}
4

1 回答 1

19

发现我的服务器时间没有与互联网时间同步。在网络服务器中同步时间后,问题得到解决。因此,只要手机和服务器都同步了正确的时间(NTP 服务器),时区就不会影响身份验证器。

如果有人遇到同样的问题,请检查服务器时间和手机时间,确保他们显示正确的时间,即使慢一分钟或快一分钟也可能最终生成错误代码。

于 2014-10-28T01:11:55.367 回答