2014-08-28 2 views
6

Привет У меня возникли проблемы восстановления моего authToken, когда я звонюМенеджер Android счета не кэшировать authToken

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

Я получаю пустую строку назад, что привело меня смотреть в мой класс AbstractAccountAuthenticator, в частности getAuth(). Вот что его делание:

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; 
} 

peekAuthToken возвращается нуль, однако я получаю правильный uid от getUserData, которые приводят меня к мысли, я добавляю счет правильно. Вот как я установил 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 

Любые предложения?

+0

Вы уверены, что переменная учетной записи, которая проходит, такая же, как и при вызове setAuthToken? – CChi

+0

Я так считаю, Auth.getAccount() возвращает AccountManager.get (App.getContext()). GetAccountsByType (ACCOUNT_TYPE) [0]; И он правильно хранит информацию об учетной записи – AIntel

+0

Я не могу понять, что произойдет, посмотрев на этот фрагмент кода. Но вы можете проверить эту ссылку для полного покрытия учетной записи. http://udinic.wordpress.com/2013/04/24/write-your-own-android-authenticator/ – CChi

ответ

3

Как вы можете прочитать в документации, метод peek получает только authToken из кэша authtoken. Если это возвращает null, это означает, что ваш authtoken был признан недействительным, потому что иначе метод AccountManager#getAuthToken вернул бы вам кешированный.

Это немного запутанно, но я попытаюсь объяснить.

Вы должны знать, что getAuthToken от AccountManager НЕ ТОЛЬКО как getAuthToken-Method в аутентификаторе. AccountManager выполняет некоторое кэширование между ними. Значит, если вы вызываете getAuthToken в Менеджере, он вернет ваш AuthToken до тех пор, пока он находится в кеше БЕЗ вызова метода getAuthToken для Authenticator.

Для моего понимания это означает, что совершенно бессмысленно вызывать заглядывание внутри метода getAuthToken.

Как справиться с этим сейчас:

В реализации getAuthToken (в идентифицирующей), я вновь запрашивающий authtoken с сервера и обновлять учетную запись с новым маркером, который будет хранить их в кэш. Не нужно заглядывать в эту часть.

+0

Чтобы упростить свою жизнь, я написал библиотеку. Если вы используете rxjava AND retrofit (<2.0.0), вы можете использовать его. https://github.com/andretietz/retroauth – andre

+0

обновил эту библиотеку, используя retrofit2 без rxjava в качестве зависимости – andre

1

Убедитесь, что вы добавить

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

как только вы установите authToken из вашего кода.

0

Это может произойти, если вы объявите свой аутентификатор с помощью android:customTokens=true.

Вы можете узнать больше в AbstractAccountAuthenticatordocs.

Смежные вопросы