QR-код TOTP работает на Android, но не на устройствах iOS? - PullRequest
0 голосов
/ 30 июня 2018

Я реализовал двухфакторную аутентификацию с использованием TOTP с QR-кодом в Java, которая прекрасно работает на Android. Тем не менее, я получаю очень странную ошибку, когда пытаюсь отсканировать QR-код на любом устройстве iOS, и до сих пор не смог найти причину этого.

Возможно, проблема возникает из-за плохого кодирования, что недопустимо в 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 голосов
/ 30 января 2019

Была такая же проблема с сгенерированными QR-кодами и приложением iOS Authenticator от Google. Двойное кодирование решило это для меня:

@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

Последний будет принят приложением Google Authenticator для iOS.

0 голосов
/ 17 сентября 2018

У меня были похожие проблемы с QR-кодами в iOS при использовании лаосского языка в поле издателя. Несколько лет назад я, кажется, также помнил, что у меня были проблемы с тем, как кодировались пробелы.

Мое исправление в обоих случаях состояло в том, чтобы упростить данные - использовать только цифры и буквы в поле эмитента.

...