我已经在Java中使用带有QR码的TOTP实现了2要素身份验证,在Android上效果很好。但是,当我尝试在任何iOS设备上扫描QR码时,我收到一个非常奇怪的错误,到目前为止,我仍无法找到原因。
似乎该问题可能是由于编码不正确造成的,这在iOS的Google Authenticator应用中是不允许的,但这只是一个猜测。
我收到的错误消息是:
条形码不是有效的身份验证令牌条形码
这是代码
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#线程(click)中建议的某种特殊字符,但是有人知道如何解决此问题吗?
谢谢!
答案 0 :(得分:0)
在发行人字段中使用老挝语时,iOS中的QR码也遇到类似的问题。几年前,我似乎还记得在空间编码方面遇到问题。
在这两种情况下,我的解决方法都是简化数据-在发布者字段中仅使用数字和字母。
答案 1 :(得分:0)
生成的QR码和Google的iOS Authenticator App出现相同的问题。双重编码为我解决了这个问题:
@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示例,而不是像在此URL中那样将字符串HELLO WORLD
中的空格编码为HELLO%20WORLD
:
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应用接受。