6

这是我生成二维码的代码

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;
}

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

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

但是当使用密钥“手动输入”时,它会起作用,我可以使用生成的密钥很好地登录。

我在互联网上发现了一些东西,说我应该对数据进行 urlencode,我做到了,但它仍然无法正常工作。

这是由上述函数生成的示例 url:

https://chart.googleapis.com/chart?chs=200x200&chld=M%70&cht=qr&chl=otpauth://totp/user4@noemail.com%26secret=UOPKN6QFW3J6PW74

我错过了什么或做错了什么?

4

4 回答 4

9

只需替换&secret=?secret=(不要忘记进行 url 编码)。

另外我不知道这里是否是这种情况,但帐户名不能有空格。如果你用安卓扫描它会起作用,但不能用 iPhone 扫描(去看看!)

于 2015-01-22T09:24:45.410 回答
9

Google 和 IOS Authenticator 应用程序似乎都不喜欢 OTP QR 码中“帐户名称”中的空格。将它们替换为 - 或 _ 或删除它们。

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

于 2016-12-07T11:44:38.087 回答
2

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

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

这应该确保数据被正确编码。

于 2014-06-18T09:19:20.973 回答
1

将二维码 URL 中的空格替换为 %20。此问题仅在 Google Authenticator iOS App 中出现。在 Android 中,它无需替换空格即可工作。

于 2017-01-06T08:59:45.703 回答