6

我想从 AccountManager 获取一个 Google Authtoken,我可以将其发送到我的 Web 服务(未托管在 App Engine 上)以验证用户(如果不需要此权限,我只需要电子邮件地址和最终他的姓名)。

“getAuthToken”方法的“authTokenType”参数我必须使用什么?

我必须使用哪个 google Api 来获取用户电子邮件?

4

3 回答 3

4

使用 OpenID Connect 可以做到这一点,但是它是一种实验性的,所以未来可能会改变细节。如果您获得“https://www.googleapis.com/auth/userinfo.email”或“https://www.googleapis.com/auth/userinfo.profile”范围的 OAuth 令牌,您可以使用它来获取来自https://www.googleapis.com/oauth2/v1/userinfo的用户信息(包括电子邮件)。当然,用户需要对此进行授权。

理论上,您应该能够通过AcccountManager使用“oauth2:https://www.googleapis.com/auth/userinfo.profile”作为令牌类型来获取令牌,但这似乎不适用于我的设备(Galaxy Nexus库存 4.0.4)。由于通过 获取令牌AccountManager不起作用(至少目前如此),唯一可靠的方法是使用 WebView 并通过浏览器获取一个,如下所述:https ://developers.google.com/accounts/docs/移动应用

这里有一个演示网络应用程序可以执行此操作:https ://oauthssodemo.appspot.com

(后期)更新:Google Play 服务已经发布,它是获取 OAuth 令牌的首选方式。它应该可以在所有装有 Android 2.2 及更高版本的设备上使用。获取配置文件令牌确实可以使用它,实际上他们在演示应用程序中使用它

于 2012-05-18T02:58:53.000 回答
3

I have had problems with this as well, since I was not able to find anything like a reference. Perhaps this can help you (code copied from an Android example on using the account manager):

  1. Somewhere in an event handler of your Android app, issue a request for an auth token to get the user's email address in 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. In the callback, extract the access token:

    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. Make some request to your web server, supplying the access token.

  4. On the web server, validate the access token and obtain the email address:

    curl -d 'access_token=<this is the token the app sent you>' https://www.googleapis.com/oauth2/v1/tokeninfo
    

    You should get something like this:

    {
      "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"
    }
    

    or if something went wrong:

    {
      "error": "invalid_token",
      "error_description": "Bad Request"
    }
    
于 2012-09-15T10:47:53.750 回答
0

您可以使用 Google+ People API 获取用户的姓名。(它不会提供用户的电子邮件地址)。

如果没问题,您可以使用“知道您在 Google 上的身份”作为 authTokenType。

Google 提供了一个示例应用程序,演示了如何将 AndroidAccountManager 与 Google+ API 结合使用。

链接:http ://code.google.com/p/google-plus-java-starter/source/browse/#hg%2Fandroid

于 2012-05-14T20:02:21.410 回答