Авторизовать пользователя на сайте Google в WebView через диалог
Например, пользователь переходит на google.com в WebView.
Можно ли авторизовать его там с помощью средства выбора аккаунта Google (что-то вроде описанного здесь https://developers.google.com/android/guides/http-auth), чтобы упростить авторизацию вместо ручного входа через веб-форму? Веб-браузеры Android (например, Google Chrome) авторизуют пользователя с помощью этого метода).
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)
,
И вуаля, используя это Credential
, вы можете аутентифицировать ваши звонки.
Предостережения я не смог получить WebView
распознавать учетные записи, вошедшие в другие веб-браузеры, поэтому в средстве выбора учетных записей могут отображаться только те учетные записи, которые были зарегистрированы в веб-представлении приложения.
tl; dr Это можно сделать с помощью WebView
а также WebViewClient
, но это грязный и немного более окольный путь, чем при использовании API Google Plus Services.
Этот пример лучше иллюстрирует поток авторизации / учетные данные, как только вы получите код авторизации и тому подобное.
И вот некоторая документация по WebViewClient, которая также может быть полезна.
Надеюсь, это поможет вам в правильном направлении!