https://github.com/chregu/GoogleAuthenticator.php を使用して、作業中のWebアプリケーションの2要素認証を構築しました。すべてが機能して秘密を生成し、コードも機能しました。別のサーバーに同じコードを設定し、新しい秘密鍵を生成してGoogle認証システムモバイルアプリに追加しました。モバイルで生成されたコードが一致しません。
両方のサーバーで結果を比較して調べたところ、time()関数が異なる時間(1時間の差)を返すことに気付きました。次に、2番目のサーバー(Googleコードが機能しなかった)に最初のサーバーと同じ時間を強制し、機能しました。だから私は本当に混乱していますこれはある種のタイムゾーンの問題ですか? Coz私は本当にこれらのサーバーが独自のタイムゾーンを持つ必要があります。
回避策はありますか?
また、私は https://support.google.com/accounts/answer/185834?hl=en をフォローしましたが、同期したGoogle認証システムアプリはまだ機能しません。モバイルアプリで生成されたコードは、1時間後に2番目のサーバーで機能します。誰かが私を助けたり、私に別のアプローチを提案したりできますか?.
上記のライブラリに接続するために使用しているコードは次のとおりです
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;
}
}
サーバーの時刻がインターネットの時刻と同期されていないことがわかりました。 Webサーバーで時刻を同期した後、問題は解決しました。したがって、携帯電話とサーバーの両方が正しい時刻になるように同期している限り、タイムゾーンはオーセンティケーターに影響しません(NTPサーバー)。
同じ問題を抱えている人がサーバー時間と携帯電話時間をチェックする場合は、1分遅くても速くても正しい時間を表示していることを確認すると、間違ったコードが生成される可能性があります。