Google 2 因素身份验证 QR 码问题

Azi*_*ius 3 php

我试图创建 Google 2 因素授权只是作为一个实验,而不是出于任何真正的实际原因。

我正在使用以下提供的代码:这里

我通过一个函数构建了一个 QR 码 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()

但是,当我加载请求 QR 码的页面时,Google 会声明“您的客户端发出了格式错误或非法的请求”。这就是令人烦恼的地方。如果我单击地址栏并再次发送请求,它将加载提供正确 OTP(一次性密码)的 QR 码。然后,如果我重新加载带有二维码的页面,这也将正确加载。

关于导致此问题的原因有什么想法吗?这与我在本地 XAMPP 上运行它没有任何关系,不是吗?

提前致谢!:]

编辑:只是想让你知道,我不认为这是一个缓存问题,因为我已经清除了它,但它仍然无法解决。

Azi*_*ius 5

我似乎已经通过混合使用 cURL 和不同的 URL 来访问图像来解决此问题。

这是我的完整解决方案:

<?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" />';
}
    ?>
Run Code Online (Sandbox Code Playgroud)

我想我可以改进这一点的唯一方法是将图像实际保存到服务器并保留本地副本,直到重新生成密钥或其他内容。但前提是我要在适当的环境中实现这一点!:]

感谢您的帮助@Brad!