Почему обновление Android Chrome с 61.0.3163.98 до 72.0.3626.76 прерывает вход OAuth на пользовательских вкладках Chrome?

Наше производственное приложение для 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.

Единственная проблема заключается в том, что пользователь видит этот экран подтверждения всякий раз, когда входит в систему.


person Hector    schedule 30.01.2019    source источник
comment
Почему минус? Google выпустил версию Chrome для Android, которая ломает пользовательские вкладки Chrome, и я спрашиваю, почему, и за нее проголосовали, интересно. В очередной раз сообщество Stock Overflow оказывает помощь с отрицательным голосованием.   -  person Hector    schedule 30.01.2019
comment
Вы не обновляли Chrome почти полтора года и хотите, чтобы кто-то объяснил, что сломалось, не включив код в ваш вопрос?   -  person Josh Lee    schedule 30.01.2019
comment
Какой код я бы вставил в свой вопрос? Я использую настраиваемую вкладку Chrome для загрузки своего URL-адреса oauth, мои пользователи вводят свои учетные данные и нажимают «ВОЙТИ», а встроенный браузер перестает отвечать на запросы. Какие варианты доступны для меня, чтобы показать код или исправить это? Веб-использование того же URL-адреса для входа по-прежнему работает, как и наше приложение для iOS.   -  person Hector    schedule 30.01.2019
comment
@ Гектор, ты проверяешь KEY_INTENT из AccountManagerCallback ??   -  person forthelulx    schedule 31.01.2019
comment
@KARAMJABER, мы вообще не используем AccountManager, просто хромированные пользовательские вкладки для загрузки наших URL-адресов для входа.   -  person Hector    schedule 31.01.2019
comment
Регистрирует ли Chrome какие-либо консольные сообщения?   -  person Josh Lee    schedule 31.01.2019
comment
@JoshLee, нет, все, что я вижу в logcat, это загружаемый URL-адрес приглашения = логин, а затем logcat пуст, я не вижу, чтобы журналы больше создавались. Однако, как упоминалось в моем последнем обновлении, когда я добавляю согласие на запрос входа в систему, все работает как требуется, и пользователь может войти в систему, хотя недостатком является то, что им приходится давать одобрение на дополнительном экране.   -  person Hector    schedule 31.01.2019


Ответы (2)


Я недавно ответил на этот же вопрос, я считаю, что обновление с Chrome добавляет некоторый уровень безопасности. У меня также была такая же проблема раньше с другим браузером (стандартный браузер, который поставляется с разными неофициальными пользовательскими ПЗУ), и я думаю, что мы не в безопасности, если другие браузеры реализуют такое же поведение.

Чтобы избежать всех этих проблем, я бы посоветовал вам реализовать промежуточную страницу, которая будет обрабатывать все ваши перенаправления OAuth2.

Это решение также имеет то преимущество, что пользователю не нужно каждый раз «Разрешать» вход в систему.

Здесь вы можете найти подробный ответ: Как реализовать единый вход/выход OAuth с помощью пользовательских вкладок Chrome

person 113408    schedule 06.02.2019

Единственное изменение, которое было сделано в этом обновлении, — это разрыв/удаление HPKP (закрепление открытого ключа на основе HTTP).

Закрепление открытого ключа на основе HTTP (HPKP) было предназначено для того, чтобы позволить веб-сайтам отправлять заголовок HTTP, который закрепляет один или несколько открытых ключей, присутствующих в цепочке сертификатов сайта. К сожалению, он имеет очень низкое распространение, и хотя он обеспечивает защиту от неправильной выдачи сертификатов, он также создает риски отказа в обслуживании и враждебного закрепления. По этим причинам эта функция удаляется.

Из-за этого вы получаете запрос 400 Bad, это только мое предположение.

Если все пойдет хорошо, Bundle содержит действительный токен в ключе KEY_AUTHTOKEN с использованием token = bundle.getString(AccountManager.KEY_AUTHTOKEN); из AccountMangerCallback, и вы отправитесь в гонки.

Аутентификация с помощью сервисов OAuth2 была изменена на сайте developer.android.com, требуется повторно запросить токен аутентификации, некоторые аутентификаторы требуют прямого взаимодействия с пользователем перед предоставлением действительного токена.

попробуйте запустить AccountManager или любой другой API, который вы реализуете, чтобы получить KEY_INTENT, прежде чем вы получите clientID, clientSecret, тип предоставления или ваш redirectURI

проверьте следующую ссылку и примите любые новые реализации: https://developer.android.com/training/id-auth/authenticate

person forthelulx    schedule 31.01.2019
comment
Если вам нужна помощь, предоставьте фрагмент кода ваших вызовов API, чтобы я мог выполнить отладку с новым набором правил. - person forthelulx; 31.01.2019
comment
Я не делаю никаких вызовов API, я просто загружаю URL-адреса в настраиваемые вкладки Chrome. Я только что нашел исправление для этой проблемы, как теперь показывает мой обновленный вопрос. - person Hector; 31.01.2019