phpqrcode и Google authenticator — не уверены в формате вещей и как заставить его правильно проверять

#php #qr-code #two-factor-authentication #google-2fa

#php #qr-код #двухфакторная аутентификация #google-2fa

Вопрос:

Я использую phpqrcode для создания qrcode для использования с двухфакторной аутентификацией. Я всегда использовал приложение Google Authenticator для всех моих потребностей 2FA. Хотя я могу создать qrcode, я не уверен в точном формате, чтобы он правильно проверялся. На данный момент, когда я пытаюсь его отсканировать, я получаю «неверный штрих-код» из приложения.

Использую ли я секрет, URL или комбинацию обоих при генерации qrcode? Я упускаю что-то глупое, и я уверен, что это потому, что я не понимаю, где и как использовать параметры и otpauth:// url.

 require $_SERVER['DOCUMENT_ROOT'].'/assets/phpqrcode/phpqrcode.php';

//get params
$secret = create2FASecret();
$name = 'somename';
$issuer = 'example.com';

//url encode, but not sure where or how I use this
$urlencoded = urlencode('otpauth://totp/'.$name.'?secret='.$secret.'amp;issuer='.$issuer.'');

//create the qrcode, base64 it, output it
ob_start();
QRCode::png($urlencoded, null, QR_ECLEVEL_L, 3, 4);
$newpng = base64_encode( ob_get_contents() );
ob_end_clean();

$src = 'data: image/png; base64,'.$newpng;


//show secret created and the qrcode
echo 'This is the secret that was generated : '.$secret,'<br>';
echo '<img src="' . $src . '" />';

//create a secret
function create2FASecret($secretLength = 16)
{
    $validChars = array(
        'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', //  7
        'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', // 15
        'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', // 23
        'Y', 'Z', '2', '3', '4', '5', '6', '7', // 31
        '='  // padding char
    );
    
    unset($validChars[32]);

    $secret = '';
    for ($i = 0; $i < $secretLength; $i  ) {
        $secret .= $validChars[array_rand($validChars)];
    }
    return $secret;
}
  

Комментарии:

1. Это решаемо. ?

Ответ №1:

Как оказалось, urlencoded должны быть только $name и $issuer, и это работает так, как должно. Я также изменил формат URL в соответствии с https://github.com/google/google-authenticator/wiki/Key-Uri-Format

 $name = urlencode($name);
$issuer = urlencode($issuer);

//: is encoded colon
$url = 'otpauth://totp/'.$issuer.':'.$name.'?secret='.$secret.'amp;issuer='.$issuer.'amp;algorithm=SHA1amp;digits=6amp;period=30';


//create the qrcode, base64 it, output it
ob_start();
QRCode::png($url, null, QR_ECLEVEL_L, 3, 4);
$newpng = base64_encode( ob_get_contents() );
ob_end_clean();