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

问题描述:

我非常恼怒。我正在尝试使用Java中的Google App Engine作为服务器为Android构建基于回合的多人在线游戏。来自Android客户端的AccountManager中的AuthToken不再工作

他们看起来很合适。 Android需要Google帐户,而GAE使用Google帐户进行身份验证,同时免费且可扩展。

因此,在节假日之前,我可以使用Android 2.0中新的AccountManager API从我的Android客户端获取身份验证到我的GAE应用程序。下面的代码可以访问用户的谷歌帐户的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客户端,并告诉我为什么这不再起作用。

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

在此先感谢。

+0

我们可以在运行谷歌的API的模拟器测试呢? – Gopinath 2011-02-21 09:35:35

+1

对于那些想知道“合适的URL”是什么以及如何“获取有效的cookie”的人来说,它在[本博客文章](http://blog.notdot。net/2010/05 /从Android应用程序进行身份验证的应用程序引擎),也包括使authToken无效 – thomas88wp 2012-12-18 17:09:06

从Google工程师处获得帮助。原来我的authToken已过期。我最初在12月初获得了实施工作(准确地说是第9次)。显然AccountManager所做的是缓存authToken,所以我从12月9日起一直使用相同的authToken。当我从假期回来时,它已经过期。

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

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

+1

我有同样的问题&invalidateAuthToken是关键。您需要授予android.permission.MANAGE_ACCOUNTS权限。 – 2010-02-28 14:36:21

+4

提示:当您调用invalidateAuthToken时,请确保您通过帐户类型(“com.google”)而不是令牌类型(“健康”)。我犯了这个错误,因此invalidateAuthToken没有返回任何错误。 – Artem 2010-09-17 16:32:44

+2

没有冒犯,但请参阅手册http://developer.android.com/reference/android/accounts/AccountManager.html#get(android.content.Context) – kellogs 2011-04-12 03:30:04

本身并不是一个答案,但我必须用第4行中的“android”替换“ah”才能在android v2.2.1的android连接符上得到正确的标记。不确定其他设备/版本。

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

到: 4号线然后从打开

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

我和这个人http://groups.google.com/group/android-developers/browse_thread/thread/d66ff537b04ec9a8有同样的问题,你的回复救了我。谢谢谢谢谢谢! – atraudes 2012-01-25 05:34:47

+0

对于他的问题,对于未来世代的参考也有这样的回应:http://groups.google.com/group/android-developers/browse_thread/thread/81d427905c5a54bb – atraudes 2012-01-25 05:35:33