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

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

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

Solutions Collecting From Web of "Авторизовать пользователя на веб-сайте Google в WebView через диалог"

Часть 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 , но это грязно и немного более WebViewClient , чем с помощью API сервисов Google Plus.

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

И вот некоторые документы на WebViewClient, которые могут быть полезны.

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