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.
- Com.google.android.gms.auth.GoogleAuthException: excepción getToken (origen desconocido)
- Cómo traducir de un idioma a otro en Android
- Tarea de gradación de Android Google Appengine
- Cómo cargar el archivo HTML alojado en el motor de aplicaciones en Android mediante Phonegap
- ¿Cómo instalar manualmente App Engine en Android Studio?
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.
- ¿Qué es el error Apache-HttpClient / UNAVAILABLE (Android, Google App Engine)?
- ¿Cómo puedo enviar un campo de texto en la solicitud POST que carga un blob en Blobstore y lo recupero en el controlador de carga del blob?
- Iniciar sesión en appengine desde el cliente android
- Cambiar la ubicación de una "Fábrica de procesador de anotaciones" para un proyecto de Android con App Engine
- Android Multipart POST para Google App Engine no funciona
- HTTPPost multipart (archivo de carga) de Java a Python webapp2
- ¿Debo usar la autenticación de usuario basada en la conexión en mi aplicación de Android?
- Comprobación del usuario de Foursquare en V2
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);
- Tono de cambio de imagen de Android para simular el botón de clic
- ¿Cuál es el parámetro de icicle de Android?