Почему обновление Android Chrome с 61.0.3163.98 до 72.0.3626.76 прерывает вход OAuth в пользовательские вкладки Chrome? - PullRequest
0 голосов
/ 30 января 2019

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

enter image description here

Я нашел решение этой проблемы следующим образом: -

Я добавил дополнительную подсказку "согласиться "на существующие запросы" нет ", а затем" войти ".

Теперь пользователь увидит экран согласия под названием

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.

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

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

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

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

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

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

0 голосов
/ 31 января 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...