Pregunta

Estoy bastante exasperada. Estoy intentando crear un juego multijugador online basado en turnos para Android a través de Google App Engine en Java como el servidor.

Se parecen como un ajuste perfecto. Android requiere una cuenta de Google, y GAE utiliza una cuenta de Google para la autenticación, mientras que ser libre y escalable.

Así que antes de las vacaciones que era capaz de conseguir una autentificación a mi GAE aplicación de mi cliente de Android utilizando la nueva API AccountManager en Android 2.0. El siguiente código le permite acceder a la authToken de cuenta de Google del usuario y luego usarlo para la autenticación, por lo que el usuario no tiene que introducir manualmente su nombre de usuario y la contraseña de la cuenta:

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

I fue capaz de añadir la cadena authToken resultante a la URL adecuada y obtener una cookie válida que luego podría utilizar para todas las solicitudes posteriores. Lo único es que, en algún momento la semana pasada que dejó de funcionar para mí. Ahora cuando intento utilizar el token de autenticación en el código anterior, no lo entiendo una cookie regresó y mi código lanza una NullPointerException para la cookie que falta.

Cuando vuelva a la vieja manera, cuando el usuario estaba entrando manualmente en su nombre de usuario y contraseña de Google y consigo el authToken de " https://www.google.com/accounts/ClientLogin ", funciona muy bien.

Por favor, dime que alguien por ahí ha construido un cliente de Android para una aplicación de Google App Engine mediante el token de autenticación de la cuenta de Google en el teléfono del usuario, y me dan alguna pista de por qué esto no está funcionando.

Me gustaría mucho hacer este trabajo. Mis alternativas son para requerir al usuario que introduzca sus credenciales (que es torpe, y que no deberían tener que hacer), o ir con otra solución para el servidor.

Gracias de antemano.

¿Fue útil?

Solución

consiguió ayuda para esto de un ingeniero de Google. Resulta que mi authToken había expirado. Había conseguido inicialmente la aplicación de trabajo a principios de diciembre (el día 9 para ser exactos). Al parecer, lo que hace del administrador de cuentas es la caché authToken, por lo que había estado utilizando el mismo token de autenticación desde el 9 de diciembre. Cuando volví de las vacaciones que había expirado.

Para resolver el problema, tiene la palabra getAuthToken, a continuación, llamar invalidateAuthToken en ese modo, a continuación, llamar getAuthToken nuevo. Esto genera un token de autenticación válida y funciona muy bien, incluso si es un poco torpe y sería innecesario si AccountManager acaba de recibir un nuevo token de autenticación cada vez, o hizo una comprobación para ver si la caché se expiró.

Tenga en cuenta que no se debe mezclar con el tipo de token tipo de cuenta:. InvalidateAuthToken debe ser llamado con "com.google" en lugar de "ah" o en silencio se producirá un error

Otros consejos

no es una respuesta en sí, sino que tenía que sustituir el "ah" con "android" en la línea 4 para obtener el token correcto en un Nexus One con Android v2.2.1 androide. no está seguro acerca de otros dispositivos / versiones. línea 4 a continuación, se convierte en:

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

en

... = mgr.getAuthToken(acct, "android", null, this, null, null);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top