Как генерировать уникальные QR-коды с Google Authenticator на PHP? - PullRequest
0 голосов
/ 27 мая 2019

хотите, чтобы каждый пользователь в нашей системе PHP имел уникальный QR-код. Я внедрил систему Google Authenticator, но она генерирует один и тот же QR-код для каждого пользователя, и один пользователь может использовать свой код для входа в учетную запись другого пользователя.

Как мне заставить Google Authenticator генерировать уникальный код для каждого пользователя? Какое значение / переменную мне нужно передать в Google Authenticator, чтобы он придумал уникальный код для каждой учетной записи пользователя в нашей системе?

Мы попытались передать адрес электронной почты или имя пользователя, но Authenticator отправляет тот же QR-код, несмотря на уникальность адресов электронной почты.

[1] с использованием имени пользователя, имя переменной имени пользователя - $ name

public function getQR($name, $secret, $title = null, $params = array())
    {
        $width = !empty($params['width']) && (int) $params['width'] > 0 ? (int) $params['width'] : 200;
        $height = !empty($params['height']) && (int) $params['height'] > 0 ? (int) $params['height'] : 200;
        $level = !empty($params['level']) && array_search($params['level'], array('L', 'M', 'Q', 'H')) !== false ? $params['level'] : 'M';


        $urlencoded = urlencode('otpauth://totp/'.$name.'?secret='.$secret.'');
        if (isset($title)) {
            $urlencoded .= urlencode('&issuer='.urlencode($title));
        }

        return 'https://chart.googleapis.com/chart?chs='.$width.'x'.$height.'&chld='.$level.'|0&cht=qr&chl='.$urlencoded.'';
    }

    public function verifyCode($secret, $code, $discrepancy = 1, $currentTimeSlice = null)
    {
        if ($currentTimeSlice === null) {
            $currentTimeSlice = floor(time() / 30);
        }

        if (strlen($code) != 6) {
            return false;
        }

        for ($i = -$discrepancy; $i <= $discrepancy; ++$i) {
            $calculatedCode = $this->getCode($secret, $currentTimeSlice + $i);
            if ($this->timingSafeEquals($calculatedCode, $code)) {
                return true;
            }
        }

        return false;
    }

[2] с использованием электронной почты, имя переменной электронной почты равно $ email

public function getQR($email, $secret, $title = null, $params = array())
    {
        $width = !empty($params['width']) && (int) $params['width'] > 0 ? (int) $params['width'] : 200;
        $height = !empty($params['height']) && (int) $params['height'] > 0 ? (int) $params['height'] : 200;
        $level = !empty($params['level']) && array_search($params['level'], array('L', 'M', 'Q', 'H')) !== false ? $params['level'] : 'M';


        $urlencoded = urlencode('otpauth://totp/'.$email.'?secret='.$secret.'');
        if (isset($title)) {
            $urlencoded .= urlencode('&issuer='.urlencode($title));
        }

        return 'https://chart.googleapis.com/chart?chs='.$width.'x'.$height.'&chld='.$level.'|0&cht=qr&chl='.$urlencoded.'';
    }

    public function verifyCode($secret, $code, $discrepancy = 1, $currentTimeSlice = null)
    {
        if ($currentTimeSlice === null) {
            $currentTimeSlice = floor(time() / 30);
        }

        if (strlen($code) != 6) {
            return false;
        }

        for ($i = -$discrepancy; $i <= $discrepancy; ++$i) {
            $calculatedCode = $this->getCode($secret, $currentTimeSlice + $i);
            if ($this->timingSafeEquals($calculatedCode, $code)) {
                return true;
            }
        }

        return false;
    }

Я хочу, чтобы код генерировал уникальный QR-код для каждого пользователя, чтобы у каждого пользователя были свои коды аутентификации в приложении Google Authenticator на своих телефонах.

1 Ответ

0 голосов
/ 29 мая 2019

Секрет - не более чем случайная строка base32.Это можно сделать так просто, как

 substr( str_shuffle( "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567" ), 0, 32 );

, где «ABCDEFGHIJKLMNOPQRSTUVWXYZ234567» - это алфавит base32

...