使用 PHP 的 Google 身份验证器

Posted

技术标签:

【中文标题】使用 PHP 的 Google 身份验证器【英文标题】:Google Authenticator using PHP 【发布时间】:2014-12-19 19:16:58 【问题描述】:

我已经使用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;
    

【问题讨论】:

经过深思熟虑 :) 我正在考虑保存更多信息,例如用户时区,然后通过根据他们所属的时区操纵时间来获取代码。还有其他更好的解决方案吗? 【参考方案1】:

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

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

【讨论】:

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

以上是关于使用 PHP 的 Google 身份验证器的主要内容,如果未能解决你的问题,请参考以下文章

Google Calendar API 错误请求的身份验证范围不足

PHP Google 服务帐户身份验证日历 API

未经PHP身份验证,Google Drive API不允许上传文件

Google Calendar API v3 - 使用硬编码凭据进行身份验证

Google身份验证器怎么用

使用 php 设置 firebase v3 自定义身份验证