Ответ 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, которая также может быть полезна.
Надеюсь, это поможет вам в правильном направлении!