2010-01-03 5 views
37

Sono abbastanza esasperato. Sto tentando di creare un gioco online multiplayer a turni per Android utilizzando Google App Engine in Java come server.AuthToken da AccountManager nel client Android non più funzionante

Sembrano una misura perfetta. Android richiede un account Google e GAE utilizza un account Google per l'autenticazione, pur essendo gratuito e scalabile.

Quindi prima delle vacanze sono riuscito a ottenere l'autenticazione per la mia app GAE dal mio client Android utilizzando la nuova API AccountManager in Android 2.0. Il seguente codice permette di accedere alla authtoken di account Google dell'utente e quindi utilizzarlo per l'autenticazione, in modo che l'utente non deve inserire manualmente il nome utente e password dell'account:

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

Mi è stato poi in grado di accodare la stringa AuthToken risultante per l'URL appropriato e ottenere un cookie valido che potrei quindi utilizzare per tutte le ulteriori richieste. L'unica cosa è che, qualche volta la settimana scorsa, ha smesso di funzionare per me. Ora, quando provo a utilizzare AuthToken dal codice precedente, non viene restituito un cookie e il mio codice genera una NullPointerException per il cookie mancante.

Quando torno alla vecchia maniera, quando l'utente inseriva manualmente il nome utente e la password Google e ottengo AuthToken da "https://www.google.com/accounts/ClientLogin", funziona perfettamente.

Per favore dimmi che qualcuno ha creato un client Android per un'app di Google App Engine utilizzando AuthToken dall'account Google sul telefono dell'utente e mi fornisce un indizio sul perché questo non funziona più.

Mi piacerebbe davvero farlo funzionare. Le mie alternative consistono nel richiedere all'utente di inserire le proprie credenziali (che è goffo e che non dovrebbero avere), o di andare con un'altra soluzione per il server.

Grazie in anticipo.

+0

Possiamo provare questo su un emulatore in esecuzione API di Google? – Gopinath

+1

Per coloro che si chiedono quale sia "l'URL appropriato" e come "ottenere un cookie valido", è trattato in modo preciso in [questo post del blog] (http: //blog.notdot.net/2010/05/Authenticating-contro-App-Engine-from-an-Android-app), che copre anche l'invalidazione dell'autentToken – thomas88wp

risposta

26

Ho ricevuto assistenza per questo da un tecnico Google. Risulta che il mio authToken è scaduto. Inizialmente avevo realizzato l'implementazione all'inizio di dicembre (il 9 per la precisione). Apparentemente ciò che fa l'AccountManager è la cache di authToken, quindi ho usato lo stesso authToken dal 9 dicembre. Quando sono tornato dalle vacanze era scaduto.

Per risolvere il problema, ora chiamo getAuthToken, quindi invoco invalidateAuthToken su quel token, quindi richiamo getAuthToken di nuovo. Questo genera un authToken valido e funziona bene, anche se è un po 'goffo e non sarebbe necessario se AccountManager avesse appena ricevuto un nuovo authToken ogni volta, o fatto un controllo per vedere se la cache era scaduta.

Nota che non devi mischiare il tipo di token con il tipo di account: invalidateAuthToken deve essere chiamato con "com.google" invece di "ah" altrimenti fallirà in modo silenzioso.

+1

Ho avuto lo stesso problema e l'invalidateAuthToken è la chiave. Avrai bisogno del permesso android.permission.MANAGE_ACCOUNTS concesso. –

+4

Suggerimento: quando chiami invalidateAuthToken, assicurati di passare il tipo di account ("com.google") e non il tipo di token ("salute"). Ho fatto questo errore e ci è voluto un po 'per rintracciare perché invalidateAuthToken non restituisce errori. – Artem

+2

Senza offesa, ma si prega di consultare il manuale http://developer.android.com/reference/android/accounts/AccountManager.html#get(android.content.Context) – kellogs

4

non è una risposta di per sé, ma ho dovuto sostituire "ah" con "android" nella riga 4 per ottenere il token corretto su un nexus Android con Android v2.2.1. non sono sicuro di altri dispositivi/versioni. linea 4 si trasforma poi da:

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

in:

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

Ho avuto lo stesso problema di questo ragazzo http://groups.google.com/group/android-developers/browse_thread/thread/d66ff537b04ec9a8 e la tua risposta mi ha salvato. Grazie, grazie! – atraudes

+0

Anche questa risposta al suo problema è stata qui di seguito per riferimento alla generazione futura: http://groups.google.com/group/android-developers/browse_thread/thread/81d427905c5a54bb – atraudes

Problemi correlati