2010-01-03 15 views
37

Ich bin ziemlich verärgert. Ich versuche, ein rundenbasiertes Multiplayer-Online-Spiel für Android mit Google App Engine in Java als Server zu erstellen.AuthToken von AccountManager in Android-Client funktioniert nicht mehr

Sie scheinen wie eine perfekte Passform. Android benötigt ein Google-Konto und GAE verwendet ein Google-Konto für die Authentifizierung, während es frei und skalierbar ist.

Also vor den Ferien konnte ich die Authentifizierung meiner GAE App von meinem Android Client mit der neuen AccountManager API in Android 2.0 bekommen. Mit dem folgenden Code können Sie die authToken des Benutzers Google-Konto zugreifen und es dann für die Authentifizierung verwenden, so dass der Benutzer nicht manuell müssen ihr Konto Benutzernamen und Passwort eingeben:

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(); 

Ich war dann in der Lage zu anhängen die resultierende AuthToken-Zeichenfolge an die entsprechende URL und ein gültiges Cookie erhalten, das ich dann für alle weiteren Anfragen verwenden könnte. Das einzige Problem ist, irgendwann letzte Woche hat es einfach aufgehört für mich zu arbeiten. Wenn ich versuche, den AuthToken aus dem obigen Code zu verwenden, erhalte ich keinen Cookie und mein Code löst eine NullPointerException für den fehlenden Cookie aus.

Wenn ich auf die alte Art und Weise zurückkomme, wenn der Benutzer seinen Google-Benutzernamen und sein Passwort manuell eingegeben hat und ich den AuthToken von "https://www.google.com/accounts/ClientLogin" bekomme, funktioniert es gut.

Bitte teilen Sie mir mit, dass jemand einen Android-Client für eine Google App Engine-App mithilfe des AuthTokens aus dem Google-Konto auf dem Telefon des Benutzers erstellt hat und mir Hinweise gibt, warum dies nicht mehr funktioniert.

Ich würde wirklich gerne diese Arbeit machen. Meine Alternativen bestehen darin, den Benutzer aufzufordern, seine Anmeldeinformationen einzugeben (was unhandlich ist und was er nicht tun sollte) oder mit einer anderen Lösung für den Server zu gehen.

Vielen Dank im Voraus.

+0

Können wir das auf einem Emulator testen läuft Google APIs? – Gopinath

+1

Für diejenigen, die sich fragen, was "die passende URL" ist, und wie man "einen gültigen Cookie erhält", ist es in [diesem Blog-Beitrag] (http: //blog.notdot.net/2010/05/Authentifizieren-gegen-App-Engine-von-einer-Android-App), die auch die AuthToken ungültig macht – thomas88wp

Antwort

26

Haben Sie Hilfe von einem Google-Ingenieur. Stellt sich heraus, dass mein authToken abgelaufen ist. Ich hatte die Implementierung anfangs Anfang Dezember in Betrieb genommen (die 9. um genau zu sein). Anscheinend speichert der AccountManager den authToken im Cache, also habe ich seit dem 9. Dezember den gleichen authToken verwendet. Als ich von den Ferien zurückkam, war es abgelaufen.

Um das Problem zu lösen, rufe ich jetzt getAuthToken auf, dann rufe invalidateAuthToken für dieses Token auf und rufe dann getAuthToken erneut auf. Dies erzeugt ein gültiges authToken und funktioniert gut, auch wenn es ein wenig klobig ist und unnötig wäre, wenn AccountManager jedes Mal nur ein neues authToken erhalten würde oder eine Überprüfung durchgeführt hätte, um zu sehen, ob das zwischengespeicherte abgelaufen ist.

Beachten Sie, dass Sie den Tokentyp nicht mit dem Kontotyp mixen müssen: invalidateAuthToken muss mit "com.google" anstelle von "ah" aufgerufen werden oder wird im Hintergrund fehlschlagen.

+1

Ich hatte das gleiche Problem, und die invalidateAuthToken ist der Schlüssel. Sie benötigen die Berechtigung android.permission.MANAGE_ACCOUNTS. –

+4

Tipp: Wenn Sie invalidateAuthToken aufrufen, vergewissern Sie sich, dass Sie den Kontotyp ("com.google") und nicht den Tokentyp ("Health") übergeben. Ich habe diesen Fehler gemacht, und es hat eine Weile gedauert, um aufzuspüren, weil invalidateAuthToken keine Fehler zurückgibt. – Artem

+2

Nichts für ungut, aber bitte lesen Sie das Handbuch http://developer.android.com/reference/android/accounts/AccountManager.html#get(android.content.Context) – kellogs

4

nicht eine Antwort per se, aber ich musste die "ah" mit "android" in Zeile 4 ersetzen, um das richtige Token auf einem Android-Nexus eins mit Android v2.2.1. bin mir nicht sicher über andere Geräte/Versionen. Linie 4 dreht sich dann aus:

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

in:

... = mgr.getAuthToken(acct, "android", null, this, null, null); 
+0

Ich hatte das gleiche Problem wie dieser Typ http://groups.google.com/group/android-developers/browse_thread/thread/d66ff537b04ec9a8 und Ihre Antwort hat mich gerettet. Danke, vielen Dank! – atraudes

+0

Es gab auch diese Antwort auf sein Problem für die Referenz der nächsten Generation: http://groups.google.com/group/android-developers/browse_thread/thread/81d427905c5a54bb – atraudes