36 votes

AuthToken de AccountManager dans le client Android ne fonctionne plus

Je suis assez exaspéré. Je suis d'essayer de construire une tour par tour multijoueur en ligne jeu pour Android à l'aide de Google App Engine Java en tant que serveur.

Ils semblent comme un ajustement parfait. Android nécessite un compte Google, et GAE utilise un compte Google pour l'authentification, tout en étant libre et évolutive.

Donc, avant les vacances, j'ai été en mesure d'obtenir l'authentification à mon GAE application à partir de mon Android client à l'aide de la nouvelle AccountManager API Android 2.0. Le code suivant vous permet d'accéder à la AuthToken de l'utilisateur du compte Google et ensuite l'utiliser pour l'authentification, de sorte que l'utilisateur n'a pas à entrer manuellement leur compte nom d'utilisateur et le 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 le résultant AuthToken chaîne de caractères de l'URL appropriée et d'obtenir un cookie valide qui je pourrais ensuite utiliser pour toutes les autres demandes. La seule chose c'est, parfois, la semaine dernière il s'est juste arrêté de travailler pour moi. Maintenant, quand j'essaie d'utiliser le AuthToken du code ci-dessus, je ne suis pas un cookie est retourné et mon code génère une exception NullPointerException pour le cookie manquant.

Quand je reviens à l'ancienne manière, lorsque l'utilisateur a été saisie manuelle dans leur Google nom d'utilisateur et le mot de passe et je reçois le AuthToken de "https://www.google.com/accounts/ClientLogin", il fonctionne très bien.

S'il vous plaît dites-moi quelqu'un a construit un client Android pour Google App Engine application à l'aide de la AuthToken du compte Google sur le téléphone de l'utilisateur, et de me donner quelques indices quant à pourquoi cela ne fonctionne plus.

J'aimerais vraiment faire ce travail. Mes solutions sont à obliger l'utilisateur à entrer leurs informations d'identification (qui est maladroit, et qu'ils ne devraient pas avoir à le faire), ou aller avec une autre solution pour le serveur.

Merci à l'avance.

26voto

polyclef Points 653

Obtenu de l'aide pour ce à partir d'un ingénieur Google. S'avère que mon authToken était expiré. J'avais d'abord eu la mise en place de travail au début de décembre (le 9 pour être exact). Apparemment ce que le AccountManager ne se cache le authToken, si j'avais été en utilisant le même authToken depuis Déc. 9. Quand je suis rentré de vacances, il avait expiré.

Pour résoudre le problème, j'appelle maintenant getAuthToken, puis d'appeler invalidateAuthToken sur ce jeton, puis d'appeler getAuthToken de nouveau. Cela génère un valide authToken et fonctionne très bien, même si il est un peu maladroit et serait inutile si AccountManager viens de recevoir une nouvelle authToken à chaque fois, ou a fait une vérification pour voir si la mise en cache l'un était expiré.

Notez que vous ne devez pas mélanger type de jeton avec le type de compte: invalidateAuthToken doit être appelé "com.google" au lieu de "ah" ou il en silence à l'échec.

4voto

bernstein Points 31

pas une réponse en soi, mais je devais remplacer "ah" par "android" à la ligne 4 pour obtenir le bon jeton sur un lien android avec android v2.2.1. pas sûr des autres appareils / versions. la ligne 4 passe alors de:

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

dans:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X