TOTP QR-код работает на Android, но не на устройствах iOS?
Я реализовал двухфакторную аутентификацию с использованием 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# ( клик), но кто-нибудь знает, как решить эту проблему?
Спасибо!
1 ответ
Была такая же проблема с сгенерированными 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.
У меня были похожие проблемы с QR-кодами в iOS при использовании лаосского языка в поле издателя. Несколько лет назад я также, кажется, помню, как получал проблемы с тем, как кодировались пробелы.
Мое исправление в обоих случаях состояло в том, чтобы упростить данные - использовать только цифры и буквы в поле эмитента.