我想从AccountManager获取一个Google Authtoken,我可以将其发送到我的Web服务(不在App Engine上托管)来验证用户(如果不需要此权限,我只需要电子邮件地址,最后是他的名字) )。
我必须使用“getAuthToken”方法的“authTokenType”参数吗?
我必须使用google Api来获取用户电子邮件吗?
答案 0 :(得分: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的用户信息(包括电子邮件)。当然,用户需要对此进行授权。
理论上你应该能够使用“oauth2:https://www.googleapis.com/auth/userinfo.profile”作为令牌类型从AcccountManager
获取令牌,但这不会出现在我的设备上工作(Galaxy Nexus,库存4.0.4)。由于通过AccountManager
获取令牌不起作用(至少目前为止),唯一可靠的方法是使用WebView并通过浏览器获取一个,如下所述:https://developers.google.com/accounts/docs/MobileApps
这里有一个演示网络应用程序:https://oauthssodemo.appspot.com
(已故)更新:Google Play服务已发布,是获取OAuth令牌的首选方式。它应该适用于Android 2.2及更高版本的所有设备。获取配置文件令牌确实可以使用它,实际上它们在演示应用程序中使用它
答案 1 :(得分: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服务器上,验证访问令牌并获取电子邮件地址:
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"
}
答案 2 :(得分:0)
您可以使用Google+ People API获取用户名。 (它不会提供用户的电子邮件地址)。
如果可以,您可以使用“了解您在Google上的身份”作为authTokenType。
Google提供了一个示例应用程序,演示了如何将AndroidAccountManager与Google+ API结合使用。
链接:http://code.google.com/p/google-plus-java-starter/source/browse/#hg%2Fandroid