36

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

他们看起来很合身。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。

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

请告诉我有人已经使用用户手机上 Google 帐户中的 AuthToken 为 Google App Engine 应用程序构建了一个 Android 客户端,并给我一些关于为什么这不再工作的线索。

我真的很想完成这项工作。我的替代方法是要求用户输入他们的凭据(这很笨拙,他们不应该这样做),或者为服务器使用另一种解决方案。

提前致谢。

4

2 回答 2

26

从谷歌工程师那里得到了帮助。原来我的 authToken 已过期。我最初是在 12 月初(准确地说是 9 日)开始实施。显然 AccountManager 所做的是缓存 authToken,所以自 12 月 9 日以来我一直在使用相同的 authToken。当我从假期回来时,它已经过期了。

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

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

于 2010-01-07T15:23:52.630 回答
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);
于 2010-10-20T15:01:15.657 回答