通过对话框在WebView上的Google网站上授权用户

时间:2015-11-03 19:03:34

标签: android webview google-authentication accountpicker

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

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

1 个答案:

答案 0 :(得分:5)

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

如果我正确理解您的问题,您可以使用Google Plus Services API来实现您尝试做的事情。

您创建了GoogleSignInOptions,然后使用这些登录选项创建GoogleApiClient。在那里,您使用Auth.GoogleSignInApi.getSignInIntentGoogleApiClient作为参数。

此意图应启动SignInIntent,其中包含Google帐户选择器(包括之前在设备上访问过的帐户,以及添加其他帐户的功能)。

返回GoogleSignInResult后,您可以验证用户是否已通过身份验证,然后再创建身份验证流程。

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

第二部分:使用WebViewClient

现在,如果您尝试使用WebView对其进行身份验证,最好的办法是扩展WebViewClient课程。

您需要的内容: clientIdclientSecretclientScope(在您创建应用程序时,将为您提供所有这些详细信息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,则表示出现了问题。否则,您应该返回网址中的两个字段:codestate。如果您未返回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 可以使用WebViewWebViewClient执行此操作,但它比使用Google Plus服务API更麻烦,更迂回。

一旦您获得授权代码等,

This example可以更好地说明授权流程/凭证内容。

And here's some documentation on the WebViewClient也可能有用。

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