从AccountManager获取基本的谷歌身份验证令牌



我想从帐户管理器获取一个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 示例中复制的代码(:

  1. 在 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);
    
  2. 在回调中,提取访问令牌:

    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.
            }
        }
    }
    
  3. 向 Web 服务器发出一些请求,提供访问令牌。

  4. 在 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

相关内容

  • 没有找到相关文章