3

実際の実用的な理由ではなく、実験として Google 2 要素認証を作成しようとしています。

ここから提供されたコードを使用しています

$username と $secret の 2 つのパラメーターを持つ関数を使用して、QR コード URL を作成します。

$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 コードが読み込まれます。次に、QR コードを含むページを再読み込みすると、これも正しく読み込まれます。

この問題の原因についてのアイデアはありますか? XAMPPでローカルに実行しているという事実とは何の関係もありませんよね?

前もって感謝します!:]

編集:お知らせするために、私はそれをクリアしたのでキャッシュの問題ではないと思いますが、それでもうまくいきません。

4

1 に答える 1

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" />';
}
    ?>

これを改善できる唯一の方法は、実際にイメージをサーバーに保存し、キーが再生成されるまでローカルコピーを保持することだと思います。しかし、それは私がこれを適切な環境で実装した場合です! :]

助けてくれてありがとう@ブラッド!

于 2012-06-20T03:38:52.270 に答える