【问题标题】:AuthToken from AccountManager in Android Client No Longer WorkingAndroid客户端中AccountManager的AuthToken不再工作
【发布时间】:2010-01-03 23:01:22
【问题描述】:

我很生气。我正在尝试使用 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。

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

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

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

提前致谢。

【问题讨论】:

  • 我们可以在运行 Google API 的模拟器上进行测试吗?
  • 对于那些想知道“适当的 URL”是什么,以及如何“获取有效的 cookie”的人,this blog post 巧妙地介绍了它,其中还介绍了使 authToken 无效

标签: android google-app-engine authentication accountmanager


【解决方案1】:

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

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

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

【讨论】:

  • 我遇到了同样的问题,invalidateAuthToken 是关键。您需要授予 android.permission.MANAGE_ACCOUNTS 权限。
  • 提示:当您调用 invalidateAuthToken 时,请确保您传递的是帐户类型 ("com.google") 而不是令牌类型 ("health")。我犯了这个错误,因为 invalidateAuthToken 没有返回错误,所以花了一段时间才找到。
  • 无意冒犯,但请参阅手册developer.android.com/reference/android/accounts/…
  • @Artem 你是救命稻草,尝试将令牌类型置于无效状态,但它不起作用,你救了我的命 :) 非常感谢!
  • @KK_07k11A0585 Android 绝不会泄露任何人的 Google 密码。
【解决方案2】:

本身不是一个答案,但我必须在第 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);

【讨论】:

猜你喜欢
  • 2011-10-02
  • 1970-01-01
  • 2011-09-10
  • 1970-01-01
  • 2012-05-03
  • 2015-03-04
  • 2013-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多