Google身份验证器扫描时无效的条形码

时间:2014-06-17 08:49:21

标签: php qr-code google-authenticator

这是我生成qr代码的代码

public function getUrl($user, $hostname, $secret) {
      $encoder = "https://chart.googleapis.com/chart?chs=200x200&chld=M%70&cht=qr&chl=";
      $encoderURL = sprintf( "%sotpauth://totp/%s@%s",$encoder, $user, $hostname);
      $finalEncodorURL = $encoderURL . "%26secret=". urlencode($secret);
      return $finalEncodorURL;
}

据说这会生成一个qr代码,而且确实如此。但是当我使用谷歌身份验证器应用程序扫描此代码时,它将生成错误

The barcode 'otpauth://totp/user4@noemail.com&secret=UOPKN6QFW3J6PW74' is not a valid authentication barcode.

但是当"手动输入"使用密钥,它可以工作,我可以使用生成的密钥登录。

我发现互联网上的内容说我应该对数据进行urlencode,我做了,但它仍然无法正常工作。

这是上面函数生成的示例网址:

https://chart.googleapis.com/chart?chs=200x200&chld=M%70&cht=qr&chl=otpauth://totp/user4@noemail.com%26secret=UOPKN6QFW3J6PW74
我错过了什么或做错了什么?

4 个答案:

答案 0 :(得分:7)

只需将&secret=替换为?secret=(不要忘记url-encode)。

此外,我不知道这是否是这种情况,但帐户名称不能有空格。如果您使用Androids进行扫描,而不是使用iPhone进行扫描(请参见图!)

答案 1 :(得分:3)

Google和IOS身份验证器应用似乎不喜欢OTP QR码中“帐户名”中的空格。将它们替换为 - 或_或删除它们。

Windows手机应用程序允许6个月前安装在Android手机上的空格和版本。我没有机会测试IOS,但看起来IOS有问题。手动输入密钥可以正常工作,但不能扫描带有SPACE的QR码。

答案 2 :(得分:2)

您应该完全对您传递给图表API的数据进行编码。

otpauth%3A%2F%2Ftotp%2Fuser4%40noemail.com%26secret%3DUOPKN6QFW3J6PW74

这应确保数据编码正确。

答案 3 :(得分:1)

在QR码网址中用%20替换空格。仅在Google身份验证器iOS应用中出现此问题。在Android中,它可以在不替换空格的情况下工作。

相关问题