2010-01-03 40 views
37

我非常惱怒。我正在嘗試使用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

回答

26

從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

本身並不是一個答案,但我必須用第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