37 Stimmen

AuthToken von AccountManager im Android-Client funktioniert nicht mehr

Ich bin ziemlich frustriert. Ich versuche, ein rundenbasiertes Mehrspieler-Online-Spiel für Android unter Verwendung von Google App Engine in Java als Server zu erstellen.

Sie scheinen perfekt zueinander zu passen. Android erfordert ein Google-Konto und GAE verwendet ein Google-Konto zur Authentifizierung, während es kostenlos und skalierbar ist.

Vor den Feiertagen konnte ich die Authentifizierung meiner GAE-App von meinem Android-Client aus mit der neuen AccountManager-API in Android 2.0 durchführen. Der folgende Code ermöglicht es Ihnen, auf das AuthToken des Google-Kontos des Benutzers zuzugreifen und es dann zur Authentifizierung zu verwenden, sodass der Benutzer seinen Kontonutzernamen und sein Passwort nicht manuell eingeben muss:

   AccountManager mgr = AccountManager.get(this); 
   Account[] accts = mgr.getAccountsByType("com.google"); 
   Account acct = accts[0];
   AccountManagerFuture accountManagerFuture = mgr.getAuthToken(acct, "ah", null, this, null, null);
   Bundle authTokenBundle = accountManagerFuture.getResult(); 
   String authToken = authTokenBundle.get(AccountManager.KEY_AUTHTOKEN).toString();

Dann konnte ich den resultierenden AuthToken-String an die entsprechende URL anhängen und ein gültiges Cookie erhalten, das ich dann für alle weiteren Anfragen verwenden konnte. Das Einzige ist, dass es letzte Woche einfach aufgehört hat, für mich zu funktionieren. Jetzt, wenn ich versuche, den AuthToken aus dem obigen Code zu verwenden, wird kein Cookie zurückgegeben und mein Code wirft eine NullPointerException für das fehlende Cookie.

Wenn ich auf die alte Methode zurückgehe, bei der der Benutzer seinen Google-Benutzernamen und sein Passwort manuell eingibt und ich das AuthToken von "https://www.google.com/accounts/ClientLogin" erhalte, funktioniert es einwandfrei.

Bitte sagen Sie mir, dass jemand da draußen einen Android-Client für eine Google App Engine-App erstellt hat, der das AuthToken vom Google-Konto auf dem Smartphone des Benutzers verwendet, und geben Sie mir einen Hinweis, warum dies nicht mehr funktioniert.

Ich möchte wirklich, dass dies funktioniert. Meine Alternativen bestehen darin, den Benutzer aufzufordern, seine Anmeldedaten einzugeben (was umständlich ist und was er nicht tun sollte) oder eine andere Lösung für den Server zu wählen.

Vielen Dank im Voraus.

0 Stimmen

Können wir dies auf einem Emulator testen, der Google APIs ausführt?

1 Stimmen

Für diejenigen, die sich fragen, was die "angemessene URL" ist und wie man "einen gültigen Cookie erhalten" kann, ist dies übersichtlich in diesem Blog-Beitrag erklärt, der auch die Ungültigmachung des AuthTokens behandelt.

26voto

polyclef Punkte 1271

Habe dabei Hilfe von einem Google-Ingenieur bekommen. Es stellte sich heraus, dass mein authToken abgelaufen war. Ich hatte die Implementierung Anfang Dezember (genauer gesagt am 9. Dezember) zum Laufen gebracht. Offenbar speichert der AccountManager den authToken im Cache, also hatte ich denselben authToken seit dem 9. Dezember verwendet. Als ich aus dem Urlaub zurückkam, war er abgelaufen.

Um das Problem zu lösen, rufe ich jetzt getAuthToken auf, rufe dann invalidateAuthToken für dieses Token auf und rufe dann erneut getAuthToken auf. Dadurch wird ein gültiger authToken generiert und funktioniert einwandfrei, auch wenn es etwas umständlich ist und unnötig wäre, wenn der AccountManager jedes Mal einen frischen authToken erhalten würde oder überprüfen würde, ob der gecachte abgelaufen ist.

Beachten Sie, dass Sie den Token-Typ nicht mit dem Kontotyp verwechseln dürfen: invalidateAuthToken muss mit "com.google" anstelle von "ah" aufgerufen werden, sonst schlägt es still fehl.

1 Stimmen

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

5 Stimmen

Tipp: Wenn Sie invalidateAuthToken aufrufen, stellen Sie sicher, dass Sie den Kontotyp ("com.google") übergeben und nicht den Tokentyp ("health"). Ich habe diesen Fehler gemacht und es hat eine Weile gedauert, ihn zu verfolgen, weil invalidateAuthToken keine Fehler zurückgibt.

2 Stimmen

Kein Angriff, aber bitte siehe die Anleitung developer.android.com/reference/android/accounts/…

4voto

bernstein Punkte 41

Keine direkte Antwort, aber ich musste das "ah" in Zeile 4 durch "android" ersetzen, um das richtige Token auf einem Android Nexus One mit Android v2.2.1 zu erhalten. Bin mir nicht sicher über andere Geräte/Versionen. Zeile 4 wird dann zu :

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

0 Stimmen

Ich hatte das gleiche Problem wie dieser Typ groups.google.com/group/android-developers/browse_thread/thr‌​ead/… und deine Antwort hat mir geholfen. Danke danke danke dir!

0 Stimmen

Es gab auch diese Antwort auf sein Problem hier als Referenz für zukünftige Generationen: groups.google.com/group/android-developers/browse_thread/thr‌​ead/…

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X