gpt4 book ai didi

php - 如何在 PHP 中使用 Google Authenticator 生成唯一的二维码?

转载 作者:行者123 更新时间:2023-11-29 15:58:51 29 4
gpt4 key购买 nike

希望我们的 PHP 系统上的每个用户都有一个唯一的二维码。我已经实现了 Google 身份验证器系统,但它只能为每个用户生成相同的二维码,并且一个用户可以使用他们的代码登录另一个用户的帐户。

如何让 Google 身份验证器为每个用户生成唯一的代码?我需要将什么值/变量传递给 Google 身份验证器,以便它为我们系统上的每个用户帐户提供唯一的代码?

我们尝试传递用户的电子邮件地址或用户名,但尽管电子邮件地址是唯一的,但身份验证器会发回相同的二维码。

[1]使用 username ,用户名变量名为 $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 ,email 变量名为 $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;
}

我希望该代码为每个用户生成唯一的二维码,以便每个用户在其手机上的 Google 身份验证器应用中拥有自己的身份验证码。

最佳答案

这个 secret 只不过是一个随机的 Base32 字符串。所以可以像

一样简单地完成
 substr( str_shuffle( "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567" ), 0, 32 );

其中“ABCDEFGHIJKLMNOPQRSTUVWXYZ234567”是base32字母表

关于php - 如何在 PHP 中使用 Google Authenticator 生成唯一的二维码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56321547/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com