2010-01-03 1 views
37

Je suis assez exaspéré. J'essaye de construire un jeu en ligne multijoueur au tour par tour pour Android en utilisant Google App Engine en Java comme serveur.AuthToken de AccountManager dans le client Android ne fonctionne plus

Ils semblent être parfaits. Android nécessite un compte Google, et GAE utilise un compte Google pour l'authentification, tout en étant gratuit et évolutif. Donc, avant les vacances, j'ai pu obtenir l'authentification de mon application Android auprès de mon application GAE à l'aide de la nouvelle API AccountManager dans Android 2.x Le code suivant vous permet d'accéder au AuthToken du compte Google de l'utilisateur et ensuite l'utiliser pour l'authentification, de sorte que l'utilisateur n'a pas à entrer manuellement leur nom d'utilisateur et mot de passe:

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

J'étais alors en mesure d'ajouter la chaîne AuthToken résultante à l'URL appropriée et obtenir un cookie valide que je pourrais ensuite utiliser pour toutes les autres demandes. La seule chose est, la semaine dernière, il a juste cessé de travailler pour moi. Maintenant, lorsque j'essaie d'utiliser le AuthToken à partir du code ci-dessus, un cookie n'est pas renvoyé et mon code renvoie une exception NullPointerException pour le cookie manquant. Lorsque je reviens à l'ancienne méthode, lorsque l'utilisateur saisissait manuellement son nom d'utilisateur et son mot de passe Google et que j'obtenais l'authentification AuthToken à partir de "https://www.google.com/accounts/ClientLogin", cela fonctionne très bien. S'il vous plaît dites-moi quelqu'un qui a construit un client Android pour une application Google App Engine en utilisant le AuthToken du compte Google sur le téléphone de l'utilisateur, et me dire pourquoi cela ne fonctionne plus.

Je voudrais vraiment faire ce travail. Mes alternatives sont de demander à l'utilisateur d'entrer ses informations d'identification (ce qui est maladroit, et ce qu'elles ne devraient pas avoir à faire), ou d'aller avec une autre solution pour le serveur.

Merci d'avance.

+0

Peut-on tester cela sur un émulateur en cours d'exécution API Google? – Gopinath

+1

Pour ceux qui se demandent quelle est «l'URL appropriée» et comment «obtenir un cookie valide», il est parfaitement couvert dans [ce blog] (http: //blog.notdot.net/2010/05/Authentification-contre-App-Engine-à partir d'une application Android), qui couvre également l'invalidation du authToken – thomas88wp

Répondre

26

Vous avez reçu de l'aide d'un ingénieur de Google. Il s'avère que mon authToken a expiré. J'avais initialement commencé la mise en œuvre début décembre (le 9 pour être exact). Apparemment, ce que fait le AccountManager est de mettre en cache le authToken, donc j'ai utilisé le même authToken depuis le 9 décembre. Quand je suis revenu des vacances, il avait expiré. Pour résoudre le problème, j'appelle maintenant getAuthToken, puis j'appelle invalidateAuthToken sur ce token, puis j'appelle getAuthToken à nouveau. Cela génère un authToken valide et fonctionne très bien, même si c'est un peu maladroit et ne serait pas nécessaire si AccountManager vient d'obtenir un nouveau authToken à chaque fois, ou a fait une vérification pour voir si le caché a expiré.

Notez que vous ne devez pas mélanger le type de jeton avec le type de compte: invalidateAuthToken doit être appelé avec "com.google" au lieu de "ah" ou il échouera silencieusement.

+1

J'ai eu le même problème et le invalidateAuthToken est la clé. Vous aurez besoin de l'autorisation android.permission.MANAGE_ACCOUNTS accordée. –

+4

Conseil: Lorsque vous appelez invalidateAuthToken, vérifiez que vous avez passé le type de compte ("com.google") et non le type de jeton ("health"). J'ai fait cette erreur et il a fallu du temps pour la localiser car invalidateAuthToken ne renvoie aucune erreur. – Artem

+2

Aucune infraction, mais s'il vous plaît voir le manuel http://developer.android.com/reference/android/accounts/AccountManager.html#get(android.content.Context) – kellogs

4

pas une réponse en soi, mais j'ai dû remplacer le "ah" par "android" dans la ligne 4 pour obtenir le jeton correct sur un android nexus avec android v2.2.1. pas sûr d'autres appareils/versions. ligne 4 tourne alors à partir de:

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

dans:

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

J'ai eu le même problème que ce gars http://groups.google.com/group/android-developers/browse_thread/thread/d66ff537b04ec9a8 et votre réponse m'a sauvé. Merci merci merci! – atraudes

+0

Il y avait aussi cette réponse à son problème ici pour la référence de la future génération: http://groups.google.com/group/android-developers/browse_thread/thread/81d427905c5a54bb – atraudes

Questions connexes