例如,用户在WebView中导航到google.com。
是否可以通过Google帐户选择器(此处描述https://developers.google.com/android/guides/http-auth)授权他在那里简化授权而不是通过网络表单手动登录? Android Web浏览器(例如Google Chrome)通过此方法授权用户。)
答案 0 :(得分:5)
第一部分:使用Google Plus服务API
如果我正确理解您的问题,您可以使用Google Plus Services API来实现您尝试做的事情。
您创建了GoogleSignInOptions
,然后使用这些登录选项创建GoogleApiClient
。在那里,您使用Auth.GoogleSignInApi.getSignInIntent
和GoogleApiClient
作为参数。
此意图应启动SignInIntent
,其中包含Google帐户选择器(包括之前在设备上访问过的帐户,以及添加其他帐户的功能)。
返回GoogleSignInResult
后,您可以验证用户是否已通过身份验证,然后再创建身份验证流程。
Android SDK中甚至包含了Google SignInButton
,您可以在布局中使用它,而不必为登录创建自定义按钮。
第二部分:使用WebViewClient
现在,如果您尝试使用WebView
对其进行身份验证,最好的办法是扩展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
(如果您想要离线访问,则为访问类型)。这应该是WebView
接下来,您将需要修改扩展的WebViewClient类。您要做的是覆盖shouldOverrideUrlLoading(WebView webView, String url)
方法以收听redirectURL
。可能最简单的方法是使用url.startsWith(<your redirect URL>)
来检测这一点。然后,您可以解析响应。如果您的回复包含error
,则表示出现了问题。否则,您应该返回网址中的两个字段: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
识别已在其他网络浏览器上登录的帐户,因此帐户选择器可能只会显示已签名的帐户进入特定于应用程序的WebView。
tl; dr 可以使用WebView
和WebViewClient
执行此操作,但它比使用Google Plus服务API更麻烦,更迂回。
This example可以更好地说明授权流程/凭证内容。
And here's some documentation on the WebViewClient也可能有用。
希望这有助于指明你正确的方向!