Наше производственное приложение для Android использует пользовательские вкладки Chrome для входа в OAuth
Вчера оно работало нормально, когда версия Chrome была 61.0.3163.98
После ночного обновления Chrome до 72.0.3626.76 при входе в систему.процесс застревает во встроенном браузере, и пользователю предоставляется пустой белый экран.
Если мы удаляем обновление Chrome, логин начинает работать снова
Что изменилось в Chrome и / илиПользовательские вкладки Chrome, которые нарушают наш процесс входа в систему?
Если я переключаю свой браузер по умолчанию на Firefox, вход в мои приложения работает нормально.
Фактически, если я изменяю браузер по умолчанию на что-либо кроме хрома, он работает нормальноДаже Opera работает, хотя Opera не показывает встроенный браузер.
Она также работает, когда я удаляю обновление Chrome и возвращаюсь обратно в версию chrome 61.0.3163.98
Дополнительная информация: -
Step 1). Load URL with prompt=none and my custom scheme Redirect URL.
Step 2). My App receives a NEW INTENT containing the auth code.
Step 3). I attempt to access my back end APIs with this code, which fails with 400
Step 4). Load URL prompt=login and my users are presented with a sign in screen where they enter their credentials and click on the Sign In button.
Step 5). NOTHING HAPPENS, the user is presented with a blank screen, my app does not receive a NEW INTENT.
Вот код, который я использую для открытия URL-адреса для входа через пользовательскую вкладку Chrome
private void openCustomTab() {
codeVerifier = generateRandomCodeVerifier();
checkCodeVerifier(codeVerifier);
codeChallenge = deriveCodeVerifierChallenge(codeVerifier);
CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
CustomTabsIntent customTabsIntent = builder.build();
customTabsIntent.launchUrl(this, getURL(PROMPT_NONE));
}
Наш код загружает URL-адрес с prompt = none, и в нем также указывается URL-адрес перенаправления моей пользовательской схемы.
Мое приложение Android получает новое намерение в onNewIntent, содержащее authCode, я пытаюсь получить токен доступа с помощью этого автокода, которыйзавершается с ошибкой 400.
Затем я использую пользовательские вкладки для загрузки второго URL-адреса с prompt = login следующим образом: -
final CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
builder.setToolbarColor(Color.BLUE);
final CustomTabsIntent customTabsIntent = builder.build();
customTabsIntent.launchUrl(SignInActivity.this, getURL(PROMPT_LOGIN, authCode));
Загружая этот URL-адрес с prompt = login, пользователь может ввести своиучетные данные и нажмите кнопку «Войти».
На этом этапе пользовательская вкладка Chrome застревает.
Вот сетевые вызовы, которые я перехватываю с помощью Stetho, последний сделанный вызов - authorization.pingкоторый отображается как отмененный
Я нашел решение этой проблемы следующим образом: -
Я добавил дополнительную подсказку "согласиться "на существующие запросы" нет ", а затем" войти ".
Теперь пользователь увидит экран согласия под названием
oauth.approval.page.template.title
, где пользователь видит список возможных вариантов, включая
ACCESS TO YOUR DATA
SIGN IN WITH OPENID CONNECT
OPENID CONNECT PROFILE SCOPE
OPENID CONNECT EMAIL SCOPE
в нижней части этого экрана есть две опции
oauth.approval.page.template.allow
oauth.approval.page.template.dontAllow
, когда пользователь выбирает
oauth.approval.page.template.allow
, теперь они могут перейти в приложение для Android.
Единственная проблема заключается в том, что пользователь видит этот экран подтверждения при входе в систему