Frage

Ich bin ziemlich verärgert. Ich versuche, ein rundenbasiertes Multiplayer-Online-Spiel für Android mit Google App Engine in Java als Server zu bauen.

Sie scheinen wie eine perfekte Passform. Android erfordert ein Google-Konto, und GAE verwendet ein Google-Konto für die Authentifizierung, während frei und skalierbar sein.

So vor dem Ferien konnte ich die Authentifizierung meiner GAE App von meinem Android-Client erhält die neuen Accountmanager API in Android 2.0 verwenden. 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 den Benutzernamen und das Passwort einzugeben:

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

war ich dann in der Lage, die resultierende authToken Zeichenfolge an den entsprechenden URL anhängen und ein gültiges Cookie erhalten, die ich dann für alle weiteren Anfragen nutzen könnten. Nur, was ist, irgendwann letzte Woche hat es für mich gerade aufgehört zu arbeiten. Nun, wenn ich versuche, die authToken aus dem obigen Code zu verwenden, ich habe nicht einen Cookie zurück, und mein Code wirft eine Nullpointer für den fehlenden Cookie.

Wenn ich wieder auf die alte Art und Weise, wenn der Benutzer manuell in ihren Google-Benutzername und Passwort eingeben wurde und ich die authToken bekommen von „ https://www.google.com/accounts/ClientLogin “, es funktioniert gut.

Bitte sagen Sie mir jemand da draußen ein Android-Client für ein Google App Engine App die authToken aus dem Google-Konto auf dem Telefon des Benutzers aufgebaut hat verwenden, und geben Sie mir einen Hinweis, warum dies nicht mehr funktioniert.

Ich möchte wirklich diese Arbeit machen. Meine Alternativen sind dem Anwender angewiesen werden, ihre Anmeldeinformationen einzugeben (die klobig ist, und die sie nicht tun sollten, müssen), oder gehen mit einer anderen Lösung für den Server.

Vielen Dank im Voraus.

War es hilfreich?

Lösung

Got Hilfe für diese von einem Google-Ingenieur. Stellt sich heraus, mein authToken war abgelaufen. Ich hatte zunächst die Umsetzung Arbeits Anfang Dezember bekommen (die neunte um genau zu sein). Offenbar, was der Accountmanager tut, ist Cache der authToken, so dass ich die gleiche authToken seit 9. Dezember verwendet hatte. Als ich wieder aus dem Urlaub kam es abgelaufen ist.

Um das Problem zu lösen, habe ich jetzt nennen getAuthToken, rufen Sie dann invalidateAuthToken auf diesem Token, dann getAuthToken wieder aufrufen. Dies erzeugt eine gültige authToken und funktioniert gut, auch wenn es ein wenig klobig ist und unnötig wäre, wenn nur Account eine frische authToken jedes Mal bekommt, oder hat eine Überprüfung, ob die zwischengespeicherte eines abgelaufen wurde.

Beachten Sie, dass Sie nicht Token-Typen mit Kontotyp mischen müssen. InvalidateAuthToken muss mit „com.google“ anstelle von „ah“ oder es wird still genannt werden scheitern

Andere Tipps

keine Antwort per se, aber ich hatte die „ah“ mit „Android“ in Zeile 4 zu ersetzen, die richtigen Token auf einem Android Nexus One mit Android v2.2.1 zu bekommen. 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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top