AuthToken de AccountManager en cliente Android ya no funciona

Estoy muy exasperado. Estoy intentando construir un juego en línea multijugador basado en turnos para Android usando Google App Engine en Java como servidor.

Parecen un ajuste perfecto. Android requiere una cuenta de Google, y GAE utiliza una cuenta de Google para la autenticación, a la vez que es gratuita y escalable.

Así que antes de las vacaciones, pude obtener autenticación en mi aplicación GAE desde mi cliente Android con la nueva API de AccountManager en Android 2.0. El siguiente código le permite acceder al AuthToken de la cuenta de Google del usuario y utilizarlo para la autenticación, de modo que el usuario no tenga que introducir manualmente el nombre de usuario y la contraseña de su 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(); 

Entonces era capaz de añadir la cadena AuthToken resultante a la URL apropiada y obtener una cookie válida que podría utilizar para todas las solicitudes adicionales. La única cosa es que, en algún momento de la semana pasada, simplemente dejó de funcionar para mí. Ahora cuando intento utilizar el AuthToken del código antedicho, no consigo una galleta vuelta y mi código lanza una NullPointerException para la galleta que falta.

Cuando vuelvo a la vieja manera, cuando el usuario introdujo manualmente su nombre de usuario y contraseña de Google y obtengo el AuthToken de " https://www.google.com/accounts/ClientLogin ", funciona muy bien.

Por favor, dígame que alguien ha construido un cliente Android para una aplicación de Google App Engine utilizando AuthToken desde la cuenta de Google en el teléfono del usuario y me da algunas pistas sobre por qué ya no funciona.

Realmente me gustaría hacer este trabajo. Mis alternativas son para exigir 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 por adelantado.

Obtenido ayuda para esto de un ingeniero de Google. Resulta que mi authToken ha caducado. Inicialmente había conseguido que la implementación funcionara a principios de diciembre (el 9 para ser exacto). Aparentemente lo que hace el AccountManager es cache el authToken, así que había estado usando el mismo authToken desde el 9 de diciembre. Cuando volví de las vacaciones había expirado.

Para solucionar el problema, ahora llamo a getAuthToken, luego invoco invalidateAuthToken en ese token y luego llamo a getAuthToken de nuevo. Esto genera un authToken válido y funciona muy bien, incluso si es un poco torpe y sería innecesario si AccountManager acaba de obtener un authToken fresco cada vez, o hizo un cheque para ver si la caché se expiró.

Tenga en cuenta que no debe mezclar el tipo de token con el tipo de cuenta: invalidateAuthToken debe ser llamado con "com.google" en lugar de "ah" o fallará silenciosamente.

No una respuesta per se, pero tuve que sustituir el "ah" con "android" en la línea 4 para obtener el token correcto en un nexo de Android con Android v2.2.1. No estoy seguro acerca de otros dispositivos / versiones. La línea 4 pasa de:

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

dentro :

 ... = mgr.getAuthToken(acct, "android", null, this, null, null); 
  • Número máximo de temas en Google Cloud Messaging
  • Acceso al servidor web que se ejecuta dentro de Eclipse desde fuera de la estación de trabajo
  • Utilizar XMPP para enviar notificaciones de usuario en Android: cualquier forma de orientarlas para que no vayan a Google Talk, etc.
  • Sube a Appengine Blobstore en Android
  • ¿Qué framework de Java REST para usar con App Engine y Android para los estudiantes?
  • Cómo evitar que HttpClient 4 siga la siguiente redirección
  • Autenticación contra App Engine desde la aplicación de Android con inicio de sesión federado (OpenID)
  • Autenticar mi "aplicación" en Google Cloud Endpoints no es un "usuario"
  • ¿Cómo puedo evitar que alguien se comunique con mi servidor, excepto mi aplicación de Android?
  • Eclipse Android: No encontró la clase
  • Oauth en Appengine con los servicios de Google Play
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.