2010-01-03 16 views
37

Estoy bastante exasperado. Intento crear un juego en línea multijugador por turnos para Android que utilice Google App Engine en Java como servidor.AuthToken de AccountManager en Android Client ya no funciona

Parecen un calce 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.

Así que antes de las vacaciones pude obtener la autenticación de mi aplicación GAE desde mi cliente Android utilizando la nueva API de AccountManager en Android 2.0. El siguiente código le permite acceder a la authToken de la 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 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(); 

Yo era entonces capaz de anexar la cadena resultante de AuthToken a la URL apropiada y obtener una cookie válida que luego podría usar para todas las demás solicitudes. 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 a la vieja usanza, 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 muy bien.

Por favor, dime que alguien ha creado un cliente Android para una aplicación de Google App Engine usando AuthToken de la cuenta de Google en el teléfono del usuario, y me da una 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 de antemano.

+0

Podemos probar esto en un emulador corriendo API de Google? – Gopinath

+1

Para aquellos que se preguntan qué es "la URL adecuada" y cómo "obtener una cookie válida", está claramente explicada en [esta publicación del blog] (http: //blog.notdot.net/2010/05/Authenticating-against-App-Engine-from-an-Android-app), que también cubre la invalidación de authToken – thomas88wp

Respuesta

26

Obtuve 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, 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 llamarse con "com.google" en lugar de "ah" o fallará en silencio.

+1

Tuve el mismo problema y invalidateAuthToken es la clave. Necesitará el permiso android.permission.MANAGE_ACCOUNTS concedido. –

+4

Consejo: Cuando llame a invalidateAuthToken, asegúrese de pasar el tipo de cuenta ("com.google") y no el tipo de token ("estado"). Cometí este error y me tomó un tiempo rastrear porque invalidateAuthToken no devuelve ningún error. – Artem

+2

Sin ánimo de ofender, pero consulte el manual http://developer.android.com/reference/android/accounts/AccountManager.html#get(android.content.Context) – kellogs

4

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 uno con Android v2.2.1. no estoy seguro acerca de otros dispositivos/versiones. línea 4 a continuación, se convierte de:

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

en:

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

Tuve el mismo problema que este tipo http://groups.google.com/group/android-developers/browse_thread/thread/d66ff537b04ec9a8 y su respuesta me salvó. ¡Gracias, gracias, gracias! – atraudes

+0

También hubo esta respuesta a su problema aquí para referencia de generación futura: http://groups.google.com/group/android-developers/browse_thread/thread/81d427905c5a54bb – atraudes

Cuestiones relacionadas