Android客户端的AccountManager中的AuthToken不再工作

我很恼怒 我正在尝试使用Java中的Google App Engine作为服务器,为Android构build基于回合的多人在线游戏。

他们似乎是一个完美的合体。 Android需要一个Google帐户,GAE使用Google帐户进行身份validation,同时免费且可扩展。

所以在假期之前,我可以使用Android 2.0中新的AccountManager API从我的Android客户端获取身份validation到我的GAE应用程序。 以下代码允许您访问用户的Google帐户的AuthToken,然后将其用于身份validation,以便用户不必手动input他们的帐户用户名和密码:

AccountManager mgr = AccountManager.get(this); Account[] accts = mgr.getAccountsByType("com.google"); Account acct = accts[0]; AccountManagerFuture<Bundle> accountManagerFuture = mgr.getAuthToken(acct, "ah", null, this, null, null); Bundle authTokenBundle = accountManagerFuture.getResult(); String authToken = authTokenBundle.get(AccountManager.KEY_AUTHTOKEN).toString(); 

然后,我可以将生成的AuthTokenstring附加到适当的URL并获得一个有效的cookie,然后可以用于所有进一步的请求。 唯一的事情是,上个星期某个时候,它停止了为我工作。 现在,当我尝试从上面的代码中使用AuthToken时,我没有得到一个返回的cookie,我的代码抛出一个NullPointerException的缺less的cookie。

当我回到旧的方式,当用户手动input他们的Google用户名和密码,我从“ https://www.google.com/accounts/ClientLogin ”获得AuthToken,它工作得很好。

请告诉我,有人使用用户手机上的Google帐户中的AuthToken为Google App Engine应用程序构build了一个Android客户端,并告诉我为什么这不再起作用。

我真的想做这个工作。 我的select是要求用户input他们的凭据(这是笨重的,他们不应该这样做),或者与服务器的另一个解决scheme。

提前致谢。

从Google工程师那得到了帮助。 原来我的authToken已过期。 我最初在十二月初得到了实施工作(准确的说是第九天)。 显然AccountManager所做的是cachingauthToken,所以我从12月9日起一直使用相同的authToken。 当我从假期回来时已经过期了。

为了解决这个问题,我现在调用getAuthToken,然后在该标记上调用invalidateAuthToken,然后再次调用getAuthToken。 这会生成一个有效的authToken,并且工作得很好,即使它有点笨重,如果AccountManager每次只获得一个新的authToken,或者检查caching的是否过期,都是不必要的。

请注意,您不能将标记types与帐户types混淆:invalidateAuthToken必须使用“com.google”而不是“ah”调用,否则将自动失败。

本身并不是一个答案,但我不得不在第4行用“android”replace“ah”,以获得与android v2.2.1一个android连接符的正确标记。 不确定其他设备/版本。 第4行然后从:

 ... = mgr.getAuthToken(acct, "ah", null, this, null, null); 

进入:

 ... = mgr.getAuthToken(acct, "android", null, this, null, null);