2014-08-28 16 views
6

Ciao Sto avendo problemi recuperare mia authToken quando chiamoAndroid Account Manager non cache l'authToken

mAccountManager.blockingGetAuthToken(Auth.getAccount(), Auth.AUTH_TOKEN_TYPE, true)

ottengo una stringa nulla di nuovo, che mi portano a cercare nella mia classe AbstractAccountAuthenticator, specificamente getAuth(). Ecco cosa il suo fare:

public Bundle getAuthToken(AccountAuthenticatorResponse response, 
     Account account, String authTokenType, Bundle options) 
     throws NetworkErrorException { 

    final AccountManager am = AccountManager.get(mContext); 

    String authToken = am.peekAuthToken(account, authTokenType); 
    String uid = am.getUserData(account, AccountManager.KEY_CALLER_UID); 


    // return bundle with authToken 
    if (!TextUtils.isEmpty(authToken)) { 
     final Bundle result = new Bundle(); 
     result.putString(AccountManager.KEY_ACCOUNT_NAME, account.name); 
     result.putString(AccountManager.KEY_ACCOUNT_TYPE, account.type); 
     result.putString(AccountManager.KEY_AUTHTOKEN, authToken); 
     result.putString(AccountManager.KEY_CALLER_UID, uid); 
     return result; 
    } 


    return null; 
} 

Il peekAuthToken restituisce un nulla, però io sono sempre il corretto uid da getUserData che mi portano a credere che sto aggiungendo correttamente il conto. Ecco come ho impostato authToken:

mAccountManager.addAccountExplicitly(account, accountPassword, extraData); 
//The addAccount is working, and I can obtain the extraData in getAuth 
mAccountManager.setAuthToken(account, Auth.AUTH_TOKEN_TYPE, authtoken); 
//I assume this is where the authToken is to be cached…but I can't retrieve it… 
//The token does exist at this point 

Qualche suggerimento?

+0

Sei sicuro che la variabile dell'account che viene trasmessa è uguale a quella che si chiama setAuthToken? – CChi

+0

Credo di sì, Auth.getAccount() restituisce AccountManager.get (App.getContext()). GetAccountsByType (ACCOUNT_TYPE) [0]; E contiene correttamente le informazioni sull'account – AIntel

+0

Non riesco a capire cosa succede guardando questo frammento di codice. Ma puoi controllare questo link per la copertura completa dell'account manager. http://udinic.wordpress.com/2013/04/24/write-your-own-android-authenticator/ – CChi

risposta

3

Come si può leggere nella documentazione, il metodo peek ottiene solo authToken dalla authtoken-cache. Se restituisce null, vuol dire che il tuo authtoken è stato invalidato, altrimenti il ​​metodo AccountManager#getAuthToken ti avrebbe restituito quello memorizzato nella cache.

Questo è un po 'di confusione, ma proverò a spiegare.

È necessario tenere presente che lo getAuthToken da AccountManager NON è uguale a getAuthToken-Method nell'autenticatore. AccountManager sta facendo un po 'di cache in mezzo. Significa che se chiami getAuthToken sul Manager, restituirà il tuo AuthToken finché si trova nella cache SENZA chiamare il metodo getAuthToken dell'autenticatore.

Per la mia comprensione, ciò significa che è assolutamente inutile chiamare il metodo getAuthToken.

Come gestire questo momento:

Nell'attuazione della getAuthToken (nel autenticatore), mi ri-richiedere i authtoken dal server e aggiornare l'account con il nuovo token, che li memorizza nella cache. Non c'è bisogno di sbirciare da quella parte.

+0

Per semplificare la mia vita ho scritto una biblioteca. Se stai usando rxjava AND retrofit (<2.0.0), potresti considerare di usarlo. https://github.com/andretietz/retroauth – andre

+0

aggiornato questa libreria utilizzando retrofit2 senza rxjava come dipendenza – andre

1

Assicurati di aggiungere

setAccountAuthenticatorResult(authIntent.getExtras()); 
setResult(RESULT_OK,authIntent); 

una volta impostato authToken dal codice.

0

Questo può accadere se si dichiara il proprio Authenticator con android:customTokens=true.

Ulteriori informazioni sono disponibili nello AbstractAccountAuthenticatordocs.

Problemi correlati