AccountManager – authToken установлен, но peekAuthToken возвращает null

Я пытаюсь добавить новую учетную запись (после проверки имени пользователя в Facebook + сервер) в AccountManager. Поток для этого случая выглядит следующим образом:

  1. Вход для пользователей с помощью Facebook
  2. Я получил детали после того, как логин сделан, и я проверяю их на данные, которые у меня есть на моем сервере
  3. Если все в порядке, сервер отправляет обратно auth_token (токен JWT)
  4. Имея данные пользователя и auth_token, я создаю учетную запись через AccountManager, и после ее создания я установил для нее authToken.
  5. При следующем входе в систему, когда пользователь снова откроет приложение, я вызываю getAuthToken, который сначала попытается получить кешированный authToken, вызвав peekAuthToken ().

Проблема

В пункте 5 peekAuthToken возвращает значение null, но это не должно потому, что я уже установил autotoken для этой учетной записи.

Код

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

Сначала я подумал, что, возможно, ссылка на мою новую учетную запись неверна (например, из AccountManager), поэтому я снова ищу учетную запись.

Не могли бы вы дать мне некоторые указания о том, что я делаю неправильно, или как я должен убедиться, что authToken будет настроен для учетной записи?

спасибо

Я бы не стал полагаться на явную настройку authToken на место, отличную от метода getAuthToken () AbstractThreadedAccountAuthenticator . Я предполагаю, что authToken не кэшируется, когда вы его запрашиваете.

Я предлагаю просто создать учетную запись через AccountManager.addAccountExplicitly () и отложить доступ к authToken, если вам это действительно нужно.

В getAuthToken AbstractThreadedAccountAuthenticator () я предлагаю применить логику, как в проекте, который я создал некоторое время назад.

  1. Запросить authToken через AccountManager.peekAuthToken ()
  2. Если authToken установлен в кеш, верните его.
  3. Если нет, то запросите его со своего сервера, затем выполните кеш через AccountManager.setAuthToken () и, наконец, вернитесь.

Ссылка: https://github.com/dawidgdanski/AccountAuthenticatorExample/blob/master/app/src/main/java/com/authenticator/account/auth/SimpleAuthenticator.java

Надеюсь, это поможет вам:

https://github.com/dawidgdanski/AccountAuthenticatorExample

Intereting Posts