我很恼火。我试图建立一个回合制多人在线游戏在Java中使用谷歌应用程序引擎作为服务器的Android。

他们就像是一个完美的结合。机器人需要一个谷歌帐户,GAE使用谷歌帐户进行身份验证,而被自由和可扩展的。

所以,我能够从我的使用新的AccountManager API在Android 2.0的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。

当我回到老样子,当用户在谷歌自己的用户名和密码进行手动输入和我从的authToken“的 https://www.google.com/accounts/ClientLogin ”,它工作得很好。

请告诉我,有人在那里已经建立了一个Android客户端使用的authToken从用户的手机上的谷歌帐户谷歌的App Engine应用程序,并给我一些线索,为什么这不再工作。

我很想来完成这项工作。我的替代品,要求用户输入他们的凭证(这是笨重,而且他们不应该这样做),或与服务器的另一个解决方案去。

预先感谢。

有帮助吗?

解决方案

得到帮助这个由谷歌工程师。原来我的authToken即将到期。我最初得到的实施工作在十二月初(9日是精确的)。显然什么的AccountManager做的是缓存的authToken,所以我一直在使用相同的authToken自12月第9位。当我从假期回来它已经过期了。

要解决这个问题,我现在请getAuthToken,然后调用invalidateAuthToken上记号,然后再打电话getAuthToken。这会产生一个有效的authToken和工作得很好,哪怕是一点点笨重,将是不必要的,如果的AccountManager刚买了一台新的authToken每一次,或做了检查,看是否缓存一个即将到期。

请注意,你不能混淆令牌类型与帐户类型:invalidateAuthToken必须的,而不是“啊”“com.google”被称为否则将静默失败

其他提示

不是答案本身,但我不得不替代在Android的Nexus One采用Android V2.2.1的“啊”在第4行的“Android”,以获得正确的令牌。不知道其他设备/版本。 线4然后从接通:

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

成:

... = mgr.getAuthToken(acct, "android", null, this, null, null);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top