TOTP QR代码可以在Android上使用,但不能在iOS设备上使用吗?

时间:2018-06-30 08:13:13

标签: java spring-mvc spring-boot qr-code google-authenticator

我已经在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)中建议的某种特殊字符,但是有人知道如何解决此问题吗?

谢谢!

2 个答案:

答案 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应用接受。