2012-06-17 5 views
2

Google 2 팩터 인증을 실험과 마찬가지로 실제 실제 이유가 없도록 만들려고합니다. 나는 두 개의 매개 변수, $ 사용자 이름과 $ 비밀Google 2 팩터 인증 QR 코드 문제

$qrcode_url = "https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth://totp/{$username}%3Fsecret%3D{$secret}";

이 올바르게 빌드를 가지고 함수를 통해 QR 코드 URL을 구축 here

: 나는에서 제공되는 코드를 사용하고

URL.

$username 매개 변수는 사용자가 로그인되고있다.

$secret 매개 변수 내가 QR 코드를 요청하는 페이지를로드 Google2FA::generate_secret_key() 그러나

에 의해 생성되고, 구글은 '당신의 클라이언트가 발행 한 선언 기형의 또는 불법적 인 요청 '이라고 주장했다. 이것은 성가신 곳입니다. 주소 표시 줄을 클릭하고 요청을 다시 보내면 정확한 OTP (일회용 암호)를 제공하는 QR 코드가로드됩니다. 그런 다음 QR 코드가있는 페이지를 다시로드하면 올바르게로드됩니다.

이 문제의 원인은 무엇입니까? XAMPP에서 로컬로 실행하고 있다는 사실과 관련이 없습니다. 그렇습니까?

미리 감사드립니다. :]

EDIT : 내가 알기로는 캐시 문제라고 생각하지 않습니다.

+0

'$ qrcode_url'이 (가) 데이터와 함께 표시되는 것을 보여줄 수 있습니까? 일부 값을 올바르게 URL 인코딩하지 않은 것 같습니다. – Brad

+0

@Brad 물론 결과는'https : //www.google.com/chart? chs = 200x200 & chld = M | 0 & cht = qr & chl = otpauth : // totp/azirius % 3Fsecret % 3DN6UHNH4XSETY6URO'입니다. 'chl' 매개 변수 값과 다른 인코딩 조합을 인코딩했습니다. 이것이 저의 첫 번째 생각이었습니다. – Azirius

+0

모든 매개 변수를'url_encode()해야합니다. 'chl'값은 'otpauth % 3A % 2F % 2Ftotp % 2Fazi % E2 % 80 % 8C % E2 % 80 % 8Brius % 253Fsecret % 253DN6UHNH4XSETY6URO'이어야합니다. – Brad

답변

4

이미지에 액세스하려면 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" />'; 
} 
    ?> 

:

여기 내 완벽한 솔루션입니다. 하지만 적절한 환경에서 이것을 구현하는 것이 었습니다. :]

도움 주셔서 감사합니다. @ 브래드!