Авторизовать пользователя на сайте 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, которая также может быть полезна.

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

Другие вопросы по тегам