studio google credential auth android google-app-engine authentication accountmanager

android - credential - google login java



AuthToken de AccountManager en Android Client ya no funciona (2)

Recibí ayuda 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 día 9 para ser exactos). Aparentemente, lo que el AccountManager hace es almacenar en caché el authToken, así que he estado usando el mismo authToken desde el 9 de diciembre. Cuando volví de las vacaciones había expirado.

Para resolver el problema, ahora llamo getAuthToken, luego invoco invalidateAuthToken en ese token y luego vuelvo a llamar a getAuthToken. Esto genera un authToken válido y funciona bien, incluso si es un poco torpe y no sería necesario si AccountManager acaba de obtener un authToken nuevo cada vez, o hizo una comprobación para ver si el caché estaba caducado.

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

Estoy bastante exasperado. Intento crear un juego en línea multijugador por turnos para Android que utilice Google App Engine en Java como servidor.

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

Entonces, antes de las vacaciones, pude obtener la autenticación de mi aplicación GAE desde mi cliente Android usando 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 luego usarlo para la autenticación, de modo que el usuario no tenga que ingresar manualmente el nombre de usuario y 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();

Luego pude agregar la cadena AuthToken resultante a la URL adecuada y obtener una cookie válida que luego pude usar para todas las solicitudes adicionales. Lo único es que, en algún momento de la semana pasada, simplemente dejó de funcionar para mí. Ahora, cuando intento usar AuthToken del código anterior, no obtengo una cookie y mi código arroja una NullPointerException para la cookie faltante.

Cuando vuelvo al modo anterior, cuando el usuario ingresaba manualmente su nombre de usuario y contraseña de Google y obtengo el AuthToken de " https://www.google.com/accounts/ClientLogin ", funciona perfectamente.

Dígame que alguien creó un cliente de Android para una aplicación de Google App Engine utilizando AuthToken de la cuenta de Google en el teléfono del usuario, y me dio alguna pista de por qué esto ya no funciona.

Realmente me gustaría hacer que esto funcione. Mis alternativas son exigir al usuario que ingrese sus credenciales (lo que es torpe, y que no deberían hacer), o ir con otra solución para el servidor.

Gracias por adelantado.


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

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

dentro :

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