2015-05-12 13 views
6

Sto tentando di aggiungere un nuovo account (dopo una convalida di login + server di Facebook) in AccountManager. Il flusso per questo caso è come questo:AccountManager - authToken è impostato ma peekAuthToken restituisce null

  1. User login con Facebook
  2. mi sono i dettagli dopo il login è fatto e li ho convalidare contro i dati che ho sul mio server
  3. Se tutto è ok , il server restituisce un auth_token (token JWT)
  4. Avendo i dettagli dell'utente e il token auth Sto creando un account tramite AccountManager e una volta creato, ho impostato il authToken per esso.
  5. Al successivo accesso quando l'utente riaprirà l'app chiamo getAuthToken che prima tenta di ottenere il authToken memorizzato nella cache chiamando peekAuthToken().

Il problema

Al punto 5, peekAuthToken restituisce nulla ma non dovrebbe perché ho già impostato l'autToken per quell'account.

Codice

public static Bundle handleUserLogin(Context context, User user) { 
    SharedPreferences mPrefs = context.getSharedPreferences(Constants.PREFS_NAME, Context.MODE_PRIVATE); 
    AccountManager am = AccountManager.get(context); 
    Account account = new Account(user.getEmail(), ACCOUNT_TYPE); 
    Account[] accounts = am.getAccountsByType(ACCOUNT_TYPE); 
    boolean isNewAccount = true; 


    for (int i = 0; i < accounts.length; i++) { 
     if (user.getEmail().equalsIgnoreCase(accounts[i].name) && ACCOUNT_TYPE.equalsIgnoreCase(accounts[i].type)) { 
      isNewAccount = false; 
      account = accounts[i]; 
      break; 
     } 
    } 

    if (isNewAccount) { 
     am.addAccountExplicitly(account, user.getPassword(), null); 
     accounts = am.getAccountsByType(ACCOUNT_TYPE); 

     for (int i = 0; i < accounts.length; i++) { 
      if (user.getEmail().equalsIgnoreCase(accounts[i].name) && ACCOUNT_TYPE.equalsIgnoreCase(accounts[i].type)) { 
       account = accounts[i]; 
       break; 
      } 
     } 
    } 

    if (null != user.getPassword()) { 
     am.setPassword(account, user.getPassword()); 
    } 

    Cs.error(TAG, "account " + account + " token " + user.getToken()); 
    am.setAuthToken(account, user.getToken(), Authenticator.AUTHTOKEN_TYPE_FULL_ACCESS); 
    setUserData(user, account, am); 

    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, user.getToken()); 
    mPrefs.edit().putString(Constants.KEY_CURRENT_USER, account.name).commit(); 

    return result; 
} 

primo momento ho pensato che forse il riferimento al mio nuovo account non è quella corretta (es quello da AccountManager) così ho ricerca per conto di nuovo.

Potresti darmi qualche indicazione su cosa sto facendo male o come dovrei assicurarmi che il authToken sia impostato per un account?

Grazie

risposta

0

non vorrei contare su esplicita impostazione authToken in luogo diverso da quello in AbstractThreadedAccountAuthenticator's getAuthToken() metodo. La mia ipotesi è che authToken non sia ancora memorizzato nella cache quando lo si richiede.

Suggerisco di creare un account tramite AccountManager.addAccountExplicitly() e rinviare l'accesso a authToken una volta che ne avete davvero bisogno.

In AbstractThreadedAccountAuthenticator's getAuthToken() suggerisco di applicare la logica come nel progetto che ho creato qualche tempo fa.

  1. Richiesta authtoken via AccountManager.peekAuthToken()
  2. Se authToken è impostato nella cache poi restituirlo.
  3. In caso contrario, richiederlo dal server, quindi effettuare la cache tramite AccountManager.setAuthToken() e infine tornare.

Link: https://github.com/dawidgdanski/AccountAuthenticatorExample/blob/master/app/src/main/java/com/authenticator/account/auth/SimpleAuthenticator.java

Spero che questo vi aiuterà fuori:

https://github.com/dawidgdanski/AccountAuthenticatorExample

+1

Si prega di includere qualche spiegazione nella tua risposta pure. Penso che tu stia parlando di https://github.com/dawidgdanski/AccountAuthenticatorExample/blob/master/app/src/main/java/com/authenticator/account/auth/SimpleAuthenticator.java? – shkschneider

Problemi correlati