Редкое исключение «android.accounts.Исключение AuthenticatorException: ServiceDisabled» — что это значит?

#android #google-authentication #accountmanager

#Android #google-аутентификация #accountmanager

Вопрос:

ПРАВКА 3 (июль)

Проблема снова вернулась!

 android.accounts.AuthenticatorException: ServiceDisabled
  

Итак, мое почтовое приложение больше не может подключаться к GMail.

Кто-нибудь может помочь?

Спасибо

ПРАВКА 2 (7 марта)

Возможно, создание «ID clients OAuth 2.0» для Android решает эту проблему.. Этот идентификатор должен быть создан на этой странице https://console.developers.google.com/apis/credentials

Расследование продолжается..


Редактировать

Я думаю, это связано с этим https://wordpress.org/support/topic/be-careful-everybody-who-is-using-oauth-2-0-to-access-gmail-google-gsuite-apis/

Как я должен сделать, чтобы мое приложение было одобрено для использования oauth2: https://mail.google.com/ scope?


Отзыв затронутого пользователя — это причина этого?

Он создал множество учетных записей Google (для выполнения некоторых тестов). Может ли это быть связано со слишком большим количеством созданных учетных записей Google, учетных записей, которые «привязаны» к его первоначальному адресу электронной почты (используя ту же первоначальную учетную запись для восстановления)? Неверное предположение


Мое почтовое приложение использует AccountManager для доступа к GMail (с OAuthToken), и оно работает нормально (с 2102), за исключением того, что теперь у меня есть особое исключение, которое происходит только с определенной учетной записью Google

Похоже, это совершенно новое поведение

Вот ошибка:

 W/System.err: android.accounts.AuthenticatorException: ServiceDisabled
W/System.err:     at android.accounts.AccountManager.convertErrorToException(AccountManager.java:2507)
W/System.err:     at android.accounts.AccountManager.-wrap0(Unknown Source:0)
W/System.err:     at android.accounts.AccountManager$AmsTask$Response.onError(AccountManager.java:2350)
W/System.err:     at android.accounts.IAccountManagerResponse$Stub.onTransact(IAccountManagerResponse.java:69)
W/System.err:     at android.os.Binder.execTransact(Binder.java:697)
  

Вопросы:

  1. Что именно делает «android.accounts.Исключение AuthenticatorException: ServiceDisabled» означает ошибку?
  2. С какой стати это происходит только с этой учетной записью Google? (и, вероятно, для некоторых других, но это кажется действительно редким, согласно отзывам пользователей). Должен ли я проверить некоторые настройки учетной записи Android Google для этих учетных записей ..? Какие из них?

Итак, тот же код подходит примерно для 10 учетных записей, которые я тестировал на своем телефоне, и он не работает с этой очень специфической учетной записью Google! Почему?

К вашему сведению, я открыл проблему здесь:https://issuetracker.google.com/issues/127454208

Примечание:

По словам владельца этой учетной записи, приложение работало раньше и внезапно перестало работать: я нахожусь в процессе расследования, когда это произойдет, и может ли он дать мне несколько подсказок о некоторых возможных действиях, которые он предпринял в то время.

Заранее спасибо за вашу помощь.


Некоторая информация, которую я собрал:

Мне удалось немного отладить это и обнаружил, что трассировка стека продолжается в cpp:

 jboolean res = env->CallBooleanMethod(mObject, gBinderOffsets.mExecTransact,
        code, (int32_t)amp;data, (int32_t)reply, flags);
  

https://android.googlesource.com/platform/frameworks/base/ /f76a50c/core/jni/android_util_Binder.cpp

Я обнаружил, что «res = onTransact (код, данные, ответ, флаги);» (т. е. android.accounts.IAccountManagerResponse$Stub.onTransact(IAccountManagerResponse.java:69) из AIDL) вызывается с

 code = 2 (probably android.accounts.AccountManager.VISIBILITY_USER_MANAGED_VISIBLE = 2)
data : a Parcel Object 
reply : another Parcel Object 
flags = 17
  

Который кажется прекрасным и работает для всех других учетных записей Google!

Я также обнаружил, что кодом ошибки в исключении AccountManager.converterrorto был код ERROR_CODE_INVALID_RESPONSE

Ответ №1:

Проблема понята и решена!

С января 2019 года некоторые области OAuth2 ограничены.
Кроме того, дополнительные требования для определенных областей API удовлетворяют странице:

Принудительное выполнение требований в этом разделе начнется 15 января 2019 года, когда все новые приложения должны пройти новый процесс проверки приложений перед доступом к определенным областям API. Заявкам, отправленным на проверку до 15 января 2019 года, будет предоставлен льготный период для приведения в соответствие, и они должны быть отправлены на повторное рассмотрение не позднее 15 февраля 2019 года. Чтобы узнать больше об этих новых требованиях, прочитайте наш пост в блоге «Повышение доверия пользователей к нашей экосистеме API» и часто задаваемые вопросы о проверке приложений OAuth.

Чтобы ваши приложения для Android были совместимы с этим, вы должны создать новый «ID clients OAuth 2.0» для Android.

Этот идентификатор должен быть создан на этой странице https://console.developers.google.com/apis/credentials

Странно то, что все это, похоже, связано с G Suite и Google API, а не с Android SDK.
Вероятно, это потому, что часть OAuth Android SDK использует API Google за кулисами, точнее, метод AccountManager#getAuthToken использует его.

Комментарии:

1. Привет, oauth клиента id для Android был создан автоматически, но он не сработал, я удалил его, создал новый, но все же.. Вы думаете, это может быть вопросом времени? Как будто ему нужно некоторое время, чтобы быть активным? Если нет, есть ли у вас идея? я получаю то же самое «android.accounts. Исключение AuthenticatorException: ServiceDisabled » Спасибо

2. Привет, я думаю, это зависит от области OAuth, которую вы используете. Я предлагаю вам внимательно прочитать эту страницу support.google.com/cloud/answer/9110914#restricted-scopes 😉