Подтвердить что ты не робот

Авторизовать пользователя на веб-сайте Google в WebView через диалог

Например, пользователь переходит на google.com в WebView.

Можно ли разрешить его там с помощью Google Account Picker (что-то вроде описанного здесь https://developers.google.com/android/guides/http-auth), чтобы упростить авторизацию вместо ручного входа в систему через веб-форму? Android-браузеры (например, Google Chrome) авторизуют пользователя с помощью этого метода).

4b9b3361

Ответ 1

Часть I: Использование API сервисов Google Plus

Если я правильно понял ваш вопрос, вы сможете достичь того, что вы пытаетесь сделать, используя API служб Google Plus.

Вы создаете свой GoogleSignInOptions, а затем создаете свой GoogleApiClient, используя эти параметры входа. Оттуда вы используете Auth.GoogleSignInApi.getSignInIntent с вашим GoogleApiClient в качестве параметра.

Это намерение должно запустить SignInIntent, который представляет собой сборщик учетных записей Google (который будет включать учетные записи, которые ранее были доступны на устройстве, и возможность добавления другой учетной записи).

Как только вы вернетесь к GoogleSignInResult, вы можете проверить, что пользователь был аутентифицирован, а затем создать поток аутентификации, как и в противном случае.

Даже в Android SDK входит Google SignInButton, который вы можете использовать прямо в своем макете вместо того, чтобы создавать пользовательскую кнопку для входа.

Часть II: Использование WebViewClient

Теперь, если вы пытаетесь использовать WebView для их аутентификации, лучше всего расширить класс WebViewClient.

Вещи, которые вам понадобятся: clientId, clientSecret и clientScope (все эти данные будут предоставлены вам при создании приложения в консоли разработчика Google)

Прежде всего, ваш URL для авторизации, вероятно, будет следующим: https://accounts.google.com/o/oauth2/auth?response_type=code&clientId={your client id}&state={SOMESTATEINFO}&access_type=offline (тип доступа, если вы хотите автономный доступ). Это должен быть начальный URL вашего WebView

Далее вам нужно изменить расширенный класс WebViewClient. Что вы хотите сделать, это переопределить метод shouldOverrideUrlLoading(WebView webView, String url), чтобы прослушать ваш redirectURL. Вероятно, проще всего использовать url.startsWith(<your redirect URL>), чтобы обнаружить это. Затем вы можете разобрать ответ. Если ваш ответ содержит error, значит, что-то пошло не так. В противном случае вы должны вернуть два поля в URL: code и state. Если вы не получите error назад, верните true для shouldOverrideUrlLoading.

Как только вы получите code, вы можете создать новый GoogleAuthorizationCodeFlow, используя свой клиент, области и секреты.

После вашего потока вам понадобится GoogleTokenResponse, который вы сможете получить с помощью code, полученного выше для вашего кода авторизации, используя GoogleTokenResponse response = flow.newTokenResponse(<code>).setRedirectUri(<redirectUri>).execute().

Как только вы это сделаете, и у вас есть response, вы можете получить Credential с помощью flow.createAndStoreCredential(response, null).

И voila, используя этот Credential, вы можете аутентифицировать свои звонки.

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

tl; dr Это можно сделать с помощью WebView и WebViewClient, но это беспорядочно и немного более круто, чем с помощью API сервисов Google Plus.

Этот пример лучше иллюстрирует материал потока полномочий авторизации после получения кода авторизации и т.д.

И вот какая-то документация по WebViewClient, которая также может быть полезна.

Надеюсь, это поможет вам в правильном направлении!