我正在尝试创建一个Google 2因子授权,只是作为一个实验,而不是出于任何真正的实际原因。
我使用的代码来自:here
我通过一个函数构建了一个QR Code URL,该函数有两个参数$username和$secret
$qrcode_url = "https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth://totp/{$username}%3Fsecret%3D{$secret}";
这将正确地构建一个URL。
$username参数是正在登录的用户。
$secret参数由Google2FA::generate_secret_key()生成
然而,当我加载一个请求二维码的页面时,Google宣称“您的客户发出了格式错误或非法的请求”。这就是让人讨厌的地方。如果我点击地址栏并再次发送请求,它将加载二维码,它提供了正确的OTP (一次性密码)。然后,如果我重新加载页面上的二维码,这也将正确加载。
你知道是什么导致了这个问题吗?这与我在本地XAMPP上运行它的事实无关,不是吗?
提前感谢!:]
编辑:只是想让你知道,我不认为这是一个缓存问题,因为我已经清除了它,它仍然阻塞。
发布于 2012-06-20 11:38:52
我似乎已经修复了这个问题,通过混合使用cURL和不同的网址来访问图像。
以下是我的完整解决方案:
<?php
public static function get_qr_code_url( $username, $secret )
{
$h = 100;
return 'http://chart.apis.google.com/chart?chs=' . $h . 'x' . $h .
'&chld=M|0&cht=qr&chl=' . urlencode( 'otpauth://totp/' . $username . '@' . $_SERVER['HTTP_HOST'] . '?secret=' . $secret );
}
public static function get_qr_code( $username, $secret )
{
if( FALSE === $secret )
{
return FALSE;
}
$url = self::get_qr_code_url( $username, $secret );
$curl_handle = curl_init();
$headers = array( 'Expect:' );
$options = array(
CURLOPT_URL => $url,
CURLOPT_CONNECTTIMEOUT => 2,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_USERAGENT => 'My-Google-Auth',
CURLOPT_HTTPHEADER => $headers
);
curl_setopt_array( $curl_handle, $options );
$query = curl_exec( $curl_handle );
curl_close( $curl_handle );
$base_64= chunk_split( base64_encode( $query ) );
return '<img class="google_qrcode" src="data:image/gif;base64,' . $base_64 . '" alt="QR Code" />';
}
?>我想唯一能改进这一点的方法是将图像保存到服务器上,并保留一个本地副本,直到密钥重新生成或其他什么。但前提是我要在适当的环境中实现它!:]
谢谢你的帮助@Brad!
https://stackoverflow.com/questions/11074191
复制相似问题