簡體   English   中英

PHP - Google Authenticator URI 代碼並不總是有效

[英]PHP - Google Authenticator URI codes don't always work

所以我在使用 google 身份驗證器和我的 PHP 時遇到了問題。

所以我使用這個庫來生成二維碼: https : //github.com/PHPGangsta/GoogleAuthenticator

因此,當我使用我的用戶名生成代碼時,它工作正常。 我得到一些類似的東西:otpauth://totp/username?secret=aCodeInBase32&issuer=Mysite

就我而言,它是:otpauth://totp/NoahNok?secret=aCodeInBase32&issuer=Mysite

但是,當為任何其他用途執行此操作時,我在 Google 身份驗證器應用程序上收到無效令牌錯誤。 不管我放了什么,我似乎總是遇到這個錯誤,但它對我的帳戶來說很好用。

例如,這個不起作用:otpauth://totp/Test?secret=KRSX&issuer=MySite

有什么明顯的我做錯了嗎?

我正在使用的代碼:獲取數據之前的一些查詢

$g = new PHPGangsta_GoogleAuthenticator();
include("Base32.php");
$secret = substr(Base32::encode($username),0,-4);
echo $g->getQRCodeGoogleUrl($username, $secret, "MySite");

生成二維碼網址

    public function getQRCodeGoogleUrl($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.'';
}

Base32 被填充到最接近的 8 個字符的倍數,所以它不會總是在末尾有====來剝離。 從你的例子中我們得到:

NoahNok => JZXWC2CON5VQ====

和:

Test => KRSXG5A=

因此,如果您始終刪除最后 4 個字符,則會為后一種情況創建無效的 Base32 序列。 你可以像這樣使用rtrim

$secret = rtrim(Base32::encode($username), '=')

只是刪除所有尾隨等於(或只是保留它們)。

編輯

我只是在想這個,雖然上面的內容可以解決最接近的問題,但以這種方式生成秘密可能不是一個好主意。 如果您考慮一下,將機密設置為與用戶名相同意味着如果有人找到用戶名,他們可以生成有效的 OTP,因此能夠通過他們的 2FA。

為此,Secret 應該是唯一的並且通常是不可猜測的,您正在使用的庫有一個createSecret方法可以為您執行此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM