Наше производственное приложение для Android использует настраиваемые вкладки Chrome для входа в систему OAuth.
Вчера он работал нормально, когда версия Chrome была 61.0.3163.98.
После ночного обновления Chrome до 72.0.3626.76 процесс входа в систему зависает во встроенном браузере, и пользователю предоставляется пустой белый экран.
Если мы удалим обновление Chrome, вход снова начнет работать.
Что изменилось в Chrome и/или настраиваемых вкладках Chrome, что нарушает процесс входа в систему?
Если я переключаю свой браузер по умолчанию на Firefox, вход в мои приложения работает нормально.
На самом деле, если я изменю браузер по умолчанию на любой другой, кроме Chrome, он будет работать нормально, даже 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-адрес с приглашением = 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, последний сделанный вызов - author.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.
Единственная проблема заключается в том, что пользователь видит этот экран подтверждения всякий раз, когда входит в систему.