Диспетчер учетных записей Android не кэширует authToken

Привет, у меня проблемы с восстановлением моего 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

Какие-либо предложения?


person AIntel    schedule 28.08.2014    source источник
comment
Вы уверены, что передаваемая переменная учетной записи такая же, как и при вызове setAuthToken?   -  person CChi    schedule 29.08.2014
comment
Я так думаю, Auth.getAccount() возвращает AccountManager.get(App.getContext()).getAccountsByType(ACCOUNT_TYPE)[0]; И правильно хранит информацию об аккаунте   -  person AIntel    schedule 29.08.2014
comment
Я не могу понять, что происходит, глядя на этот фрагмент кода. Но вы можете проверить эту ссылку для полного охвата accountmanager. udinic.wordpress.com/2013/04/24 /   -  person CChi    schedule 29.08.2014


Ответы (3)


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

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

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

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

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

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

person andre    schedule 17.06.2015
comment
Чтобы упростить себе жизнь, я написал библиотеку. Если вы используете rxjava И модификацию (‹2.0.0), вы можете рассмотреть возможность ее использования. github.com/andretietz/retroauth - person andre; 21.03.2016
comment
обновил эту библиотеку, используя retrofit2 без rxjava в качестве зависимости - person andre; 27.09.2016

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

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

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

person Aniruddh Ambarkar    schedule 14.09.2015

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

Дополнительную информацию можно найти в AbstractAccountAuthenticator документах.

person ffleandro    schedule 30.03.2017