来自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客户端,并告诉我为什么这不再起作用。
我真的很想做这个工作。我的选择是要求用户输入他们的凭证(这是笨重的,他们不应该这样做的),或者与服务器的另一个解决方案一起使用。
在此先感谢。
从Google工程师处获得帮助。原来我的authToken已过期。我最初在12月初获得了实施工作(准确地说是第9次)。显然AccountManager所做的是缓存authToken,所以我从12月9日起一直使用相同的authToken。当我从假期回来时,它已经过期。
为了解决这个问题,我现在调用getAuthToken,然后在该标记上调用invalidateAuthToken,然后再次调用getAuthToken。这会生成一个有效的authToken,并且工作得很好,即使它有点笨拙,如果AccountManager每次只获得一个新的authToken,或者检查缓存的是否过期,都不需要。
请注意,您不能将标记类型与帐户类型混淆:invalidateAuthToken必须使用“com.google”而不是“ah”调用,否则它将自动失败。
我有同样的问题&invalidateAuthToken是关键。您需要授予android.permission.MANAGE_ACCOUNTS权限。 – 2010-02-28 14:36:21
提示:当您调用invalidateAuthToken时,请确保您通过帐户类型(“com.google”)而不是令牌类型(“健康”)。我犯了这个错误,因此invalidateAuthToken没有返回任何错误。 – Artem 2010-09-17 16:32:44
没有冒犯,但请参阅手册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);
我们可以在运行谷歌的API的模拟器测试呢? – Gopinath 2011-02-21 09:35:35
对于那些想知道“合适的URL”是什么以及如何“获取有效的cookie”的人来说,它在[本博客文章](http://blog.notdot。net/2010/05 /从Android应用程序进行身份验证的应用程序引擎),也包括使authToken无效 – thomas88wp 2012-12-18 17:09:06