TOTP 二维码适用于安卓,但不适用于 iOS 设备?



我已经使用 TOTP 和 Java 中的二维码实现了 2 因素身份验证,这在 Android 上效果很好。但是,当我尝试在任何iOS设备上扫描QR码时,我遇到了一个非常奇怪的错误,到目前为止我无法找到原因。

似乎该问题可能是由于编码不良而出现的,这在iOS版本的Google身份验证器应用程序上是不允许的,但这只是一个猜测。

我收到的错误消息是:

条形码

不是有效的身份验证令牌条形码

这是代码

public String generateQRUrl() {

String secret = "hXYmnYsVWoEAXjKuAZcj";
String QR_PREFIX = "https://chart.googleapis.com/chart?chs=200x200&chld=M%%7C0&cht=qr&chl=";
try {
return QR_PREFIX + URLEncoder.encode(
String.format("otpauth://totp/%s:%s?secret=%s&issuer=%s",
"Test X", "test@gmail.com", secret, "Issuer Y"),"UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return "";
}

我已经为URLEncoder尝试了许多不同的组合,到目前为止都没有奏效。在我看来,iOS 应用程序不喜欢某种特殊字符,正如此 C# 线程(单击(中建议的那样,但有人知道如何解决此问题吗?

谢谢!

生成的二维码和来自谷歌的 iOS 身份验证器应用程序也有同样的问题。双重编码为我解决了它:

@Test
void useUriUtils() throws UnsupportedEncodingException {
String encodedString = UriUtils.encodeFragment("HELLO WORLD", "UTF-8");
assertEquals("HELLO%20WORLD", encodedString);
String doubleEncoded = UriUtils.encodeFragment(encodedString, "UTF-8");
assertEquals("HELLO%2520WORLD", doubleEncoded);
}

或作为 URL 示例,而不是将字符串HELLO WORLD中的空格编码为HELLO%20WORLD,如以下 URL 所示:

https://chart.googleapis.com/chart?chs=200x200&cht=qr&chl=otpauth://totp/HELLO%20WORLD%3Aalexander.pietsch%40foo.com%3Fsecret%3DJFWMPPNUIPG7CAOL%26issuer%3DHELLO%20WORLD

双重编码为HELLO%2520WORLD

https://chart.googleapis.com/chart?chs=200x200&cht=qr&chl=otpauth://totp/HELLO%2520WORLD%3Aalexander.pietsch%4040foo.com%3Fsecret%3DYLCDNEHV5MSIOI5A%26issuer%3DHELLO%2520WORLD

最后一个将被iOS Google Authenticator App接受。

在发行者字段中使用老挝语时,我在 iOS 中的二维码遇到了类似的问题。几年前,我似乎还记得在空间编码方式方面遇到问题。

在这两种情况下,我的解决方法都是简化数据 - 在发行者字段中仅使用数字和字母。

最新更新