Android AccountManager с несколькими типами токенов аутентификации

Я следовал примеру syncadapter, чтобы создать AccountManager и адаптер синхронизации. Я хотел иметь два разных типа токенов авторизации для разных целей (доступ к разным службам — адаптер синхронизации использует один из них) под одной и той же учетной записью.

Все работает, но я обнаружил, что когда я аутентифицируюсь (через getauthtoken) для одного типа authtoken, процесс его сохранения заменяет другой тип authtoken. Я смотрел в файле account.db до и после. Перед вызовом для получения токена для типа аутентификации "B" в таблице маркеров аутентификации в account.db есть маркер аутентификации для типа аутентификации "A". После вызова в таблице authtoken в account.db есть authtoken для типа «B», но «A» был удален. Независимо от порядка, подсистема accountmanager никогда не хранит более одного токена авторизации для каждой учетной записи для моего типа учетной записи.

Есть ли что-то особенное, что вам нужно настроить в каком-то файле xml где-то, когда у вас есть более одного типа токена аутентификации?


person BJV    schedule 10.09.2014    source источник
comment
Когда вы сохраняете токен, вы уверены, что сохраняете его в определенном типе?   -  person CChi    schedule 11.09.2014
comment
Сначала я подумал, что это может быть, но я не видел способа указать тип. Маркер устанавливается с помощью унаследованного метода setAccountAuthenticatorResult() от AccountAuthenticatorActivity. Значения в дополнительных пакетах не указывают тип — тип был передан с помощью getAuthToken(). Ни один из ключей в AccountManager (например, KEY_ACCOUNT_NAME) не относится к типу токена авторизации, если я его не упустил. Но я вижу, что тип authtoken установлен правильно в account.db - просто другая запись типа authtoken была удалена.   -  person BJV    schedule 11.09.2014
comment
в пакете дополнительных услуг вы можете указать тип, передать AccountManager.KEY_ACCOUNT_TYPE в качестве ключа и строковое представление типа учетной записи в качестве значения.   -  person CChi    schedule 11.09.2014
comment
Да, у меня есть тип моей учетной записи, указанный KEY_ACCOUNT_TYPE в пакете возврата (как в примере синкадаптера). Тип учетной записи отличается от типа токена авторизации.   -  person BJV    schedule 11.09.2014
comment
Ты прав. Как насчет того, когда вы вызываете setAuthToken, вы указали тип токена аутентификации?   -  person CChi    schedule 11.09.2014


Ответы (1)


Я нашел свою проблему. Если вы вызовете AccountManager.setPassword() в результате успешной аутентификации/входа, он сделает недействительными все токены аутентификации для вашей учетной записи. Это недокументированный побочный эффект, и в некоторых случаях он имеет смысл. Программное обеспечение, которое без разбора устанавливает пароль на одно и то же значение, случайно сделает недействительными свои токены аутентификации.

person BJV    schedule 15.09.2014