12

例如,用户在 WebView 中导航到 google.com。

是否可以通过 Google 帐户选择器(类似于此处描述的内容https://developers.google.com/android/guides/http-auth)授权他以简化授权,而不是通过网络表单手动登录?Android Web 浏览器(例如,Google Chrome)正在通过此方法授权用户)。

4

1 回答 1

5

第一部分:使用 Google Plus 服务 API

如果我正确理解您的问题,您也许可以使用Google Plus Services API实现您想要做的事情。

您创建您的GoogleSignInOptions,然后GoogleApiClient使用这些登录选项创建您的。从那里,您使用Auth.GoogleSignInApi.getSignInIntentwith yourGoogleApiClient作为参数。

这个意图应该启动一个SignInIntent显示谷歌帐户选择器(这将包括以前在设备上访问过的帐户,以及添加另一个帐户的能力)。

取回 后GoogleSignInResult,您可以验证用户是否已通过身份验证,然后像其他方式一样创建身份验证流程。

甚至包含在 Android SDK 中的是 Google SignInButton,您可以在布局中直接使用它,而不必为登录创建自定义按钮。

第二部分:使用 WebViewClient

现在,如果您尝试使用 aWebView对它们进行身份验证,最好的办法是扩展WebViewClient该类。

您将需要的东西: clientId、、clientSecretclientScope(当您在 Google Developer Console 中创建应用程序时,将为您提供所有这些详细信息)

首先,您要授权的 URL 可能如下所示:(https://accounts.google.com/o/oauth2/auth?response_type=code&clientId={your client id}&state={SOMESTATEINFO}&access_type=offline如果您想离线访问,则访问类型)。这应该是您的初始 URLWebView

接下来,您将要修改扩展的 WebViewClient 类。你想要做的是重写shouldOverrideUrlLoading(WebView webView, String url)方法来监听你的redirectURL. 可能最简单的方法是使用url.startsWith(<your redirect URL>)来检测这一点。然后,您可以解析响应。如果您的回复包含error,则表示出现问题。否则,您应该返回 URL 中的两个字段:codestate. 如果你不回来,error然后返回trueshouldOverrideUrlLoading

一旦你得到你的code,你可以创建一个新的GoogleAuthorizationCodeFlow,使用你的客户端、范围和秘密。

一旦你有了你的流程,你将需要一个GoogleTokenResponse,你将能够使用code上面获得的授权码来获得它,使用GoogleTokenResponse response = flow.newTokenResponse(<code>).setRedirectUri(<redirectUri>).execute().

完成此操作后,response您就可以Credential使用flow.createAndStoreCredential(response, null).

瞧,使用它Credential,您可以验证您的呼叫。

警告我无法WebView识别已在其他 Web 浏览器上登录的帐户,因此帐户选择器可能仅显示已在特定于应用程序的 WebView 上登录的帐户。

tl;drWebView可以使用and来执行此操作WebViewClient,但它比使用 Google Plus 服务 API 更麻烦且更迂回一些。

一旦您获得授权代码等,此示例可以更好地说明授权流程/凭证的内容。

这里有一些关于 WebViewClient 的文档也可能有用。

希望这有助于为您指明正确的方向!

于 2015-12-17T22:39:00.937 回答