例如,用户在 WebView 中导航到 google.com。
是否可以通过 Google 帐户选择器(类似于此处描述的内容https://developers.google.com/android/guides/http-auth)授权他以简化授权,而不是通过网络表单手动登录?Android Web 浏览器(例如,Google Chrome)正在通过此方法授权用户)。
例如,用户在 WebView 中导航到 google.com。
是否可以通过 Google 帐户选择器(类似于此处描述的内容https://developers.google.com/android/guides/http-auth)授权他以简化授权,而不是通过网络表单手动登录?Android Web 浏览器(例如,Google Chrome)正在通过此方法授权用户)。
第一部分:使用 Google Plus 服务 API
如果我正确理解您的问题,您也许可以使用Google Plus Services API实现您想要做的事情。
您创建您的GoogleSignInOptions
,然后GoogleApiClient
使用这些登录选项创建您的。从那里,您使用Auth.GoogleSignInApi.getSignInIntent
with yourGoogleApiClient
作为参数。
这个意图应该启动一个SignInIntent
显示谷歌帐户选择器(这将包括以前在设备上访问过的帐户,以及添加另一个帐户的能力)。
取回 后GoogleSignInResult
,您可以验证用户是否已通过身份验证,然后像其他方式一样创建身份验证流程。
甚至包含在 Android SDK 中的是 Google SignInButton
,您可以在布局中直接使用它,而不必为登录创建自定义按钮。
第二部分:使用 WebViewClient
现在,如果您尝试使用 aWebView
对它们进行身份验证,最好的办法是扩展WebViewClient
该类。
您将需要的东西: clientId
、、clientSecret
和clientScope
(当您在 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 中的两个字段: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
识别已在其他 Web 浏览器上登录的帐户,因此帐户选择器可能仅显示已在特定于应用程序的 WebView 上登录的帐户。
tl;drWebView
可以使用and来执行此操作WebViewClient
,但它比使用 Google Plus 服务 API 更麻烦且更迂回一些。
一旦您获得授权代码等,此示例可以更好地说明授权流程/凭证的内容。
这里有一些关于 WebViewClient 的文档也可能有用。
希望这有助于为您指明正确的方向!