来自Android客户端的AccountManager的AuthToken不再工作

时间:2010-01-03 23:01:23

标签: android google-app-engine authentication accountmanager

我很生气。我正在尝试使用Java中的Google App Engine作为服务器,为Android构建一个基于回合制的多人在线游戏。

它们看起来非常合适。 Android需要一个Google帐户,GAE使用Google帐户进行身份验证,同时具有免费和可扩展性。

因此,在假期之前,我可以使用Android 2.0中的新AccountManager API从我的Android客户端获取我的GAE应用程序的身份验证。以下代码允许您访问用户Google帐户的AuthToken,然后将其用于身份验证,以便用户无需手动输入其帐户用户名和密码:

   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();

然后我可以将生成的AuthToken字符串附加到适当的URL并获得一个有效的cookie,然后我可以将其用于所有进一步的请求。唯一的问题是,上周的某个时候它刚刚停止为我工作。现在,当我尝试使用上面代码中的AuthToken时,我没有返回cookie并且我的代码为丢失的cookie抛出了NullPointerException。

当我回到旧方式时,当用户手动输入他们的Google用户名和密码并且我从“https://www.google.com/accounts/ClientLogin”获得AuthToken时,它就可以正常工作。

请告诉我有人使用用户手机上的Google帐户使用AuthToken为Google App Engine应用构建了一个Android客户端,并给我一些线索,了解为什么它不再有效。

我真的很想做这个工作。我的替代方案是要求用户输入他们的凭证(这是笨重的,他们不应该这样做),或者使用另一个服务器解决方案。

提前致谢。

2 个答案:

答案 0 :(得分:26)

从Google工程师那里获得帮助。结果我的authToken已过期。我最初在12月初(确切地说是第9个)开始实施。显然,AccountManager所做的是缓存authToken,所以我从12月9日开始使用相同的authToken。当我从假期回来时,它已经过期了。

要解决此问题,我现在调用getAuthToken,然后在该令牌上调用invalidateAuthToken,然后再次调用getAuthToken。这会生成一个有效的authToken,并且工作得很好,即使它有点笨重,如果AccountManager每次只获得一个新的authToken,或者检查一下缓存的是否已经过期,那就没有必要了。

请注意,您不得将令牌类型与帐户类型混淆:invalidateAuthToken必须使用“com.google”而不是“ah”调用,否则它将无声地失败。

答案 1 :(得分:4)

本身不是答案,但是我必须用第4行中的“android”替换“ah”来获取android v2.2.1的android nexus上的正确令牌。不确定其他设备/版本。 第4行然后转为:

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

进入:

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