我想从帐户管理器获取一个Google Authtoken,我可以将其发送到我的网络服务(未托管在App Engine上(以验证用户(我只需要电子邮件地址,最终需要他的名字,如果不需要许可的话(。
对于"getAuthToken"方法的"authTokenType"参数,我必须使用什么?
我必须使用哪个谷歌 API 来获取用户电子邮件?
使用OpenID Connect这是可行的,但是它是实验性的,因此将来细节可能会发生变化。如果获取"https://www.googleapis.com/auth/userinfo.email"或"https://www.googleapis.com/auth/userinfo.profile"范围的 OAuth 令牌,则可以使用它从 https://www.googleapis.com/oauth2/v1/userinfo(包括电子邮件(获取用户信息。当然,用户需要授权。
理论上,您应该能够使用"oauth2:https://www.googleapis.com/auth/userinfo.profile"作为令牌类型从AcccountManager
获取令牌,但这似乎不适用于我的设备(Galaxy Nexus与股票4.0.4(。由于通过AccountManager
获取令牌不起作用(至少目前是这样(,因此唯一可靠的方法是使用 WebView 并通过浏览器获取令牌,如下所述:https://developers.google.com/accounts/docs/MobileApps
这里有一个演示 Web 应用程序可以做到这一点:https://oauthssodemo.appspot.com
(后期(更新:Google Play服务已发布,这是获取OAuth令牌的首选方式。它应该在所有装有 Android 2.2 及更高版本的设备上可用。获取配置文件令牌确实适用于它,实际上他们在演示应用程序中使用它
我对此也遇到了问题,因为我找不到类似参考的东西。也许这可以帮助您(从使用帐户管理器的 Android 示例中复制的代码(:
-
在 Android 应用的事件处理程序中的某个位置,发出身份验证令牌请求,以获取用户在 Android 中的电子邮件地址:
_accountMgr = AccountManager.get(this); Account [] accounts = _accountMgr.getAccounts(); Account account = accounts[0]; // For me this is Google, still need to figure out how to get it by name. _accountMgr.getAuthToken(account, AUTH_TOKEN_TYPE, false, new GetAuthTokenCallback(), null);
-
在回调中,提取访问令牌:
private class GetAuthTokenCallback implements AccountManagerCallback<Bundle> { public void run(AccountManagerFuture<Bundle> result) { Bundle bundle; try { bundle = result.getResult(); final String access_token = bundle.getString(AccountManager.KEY_AUTHTOKEN); // store token somewhere you can supply it to your web server. } catch (Exception e) { // do something here. } } }
-
向 Web 服务器发出一些请求,提供访问令牌。
-
在 Web 服务器上,验证访问令牌并获取电子邮件地址:
curl -d 'access_token=<this is the token the app sent you>' https://www.googleapis.com/oauth2/v1/tokeninfo
你应该得到这样的东西:
{ "issued_to": "<something>.apps.googleusercontent.com", "audience": "<something>.apps.googleusercontent.com", "scope": "https://www.googleapis.com/auth/userinfo.email", "expires_in": 3562, "email": "<users email address>", "verified_email": true, "access_type": "online" }
或者如果出现问题:
{ "error": "invalid_token", "error_description": "Bad Request" }
您可以使用Google+ People API获取用户名。(它不会提供用户的电子邮件地址(。
如果这没问题,你可以使用"知道你在谷歌上是谁"作为authTokenType。
Google提供了一个示例应用程序,演示了如何将AndroidAccountManager与Google+ API结合使用。
链接: http://code.google.com/p/google-plus-java-starter/source/browse/#hg%2Fandroid