Незарегистрированный на консоли API при получении токена OAuth2 на Android

мы находимся под Android (Jellybean и выше), и у нас есть приложение, которое должно использовать OAuth2 с Google для аутентификации.

я упростил активность входа в систему, но это выглядит так:

AccountManager mAccountManager;
// [...]
Account account = new Account("myEmail@gmail.com", "com.google");
// same with professional email managed by Google as myEmail@myDomain.com
// real code recovers accounts with mAccountManager.getAccountsByType("com.google")
mAccountManager = AccountManager.get(getBaseContext());
mAccountManager.getAuthToken(account, "oauth2:https://www.googleapis.com/auth/userinfo.email", null, MyActivity.this, new AccountManagerCallback<Bundle>() {
    @Override
    public void run(AccountManagerFuture<Bundle> accountManagerFuture) {
        try {
            String token = accountManagerFuture.getResult().getString(AccountManager.KEY_AUTHTOKEN);
            // exception occurs here
            // [...]
        } catch (Exception e) {
            Log.e("account", "exception occurs", e);
        }
    }
}, null);

когда мы называем accountManagerFuture.getResult(), он запускает это исключение:

android.accounts.AuthenticatorException: UNREGISTERED_ON_API_CONSOLE
    at android.accounts.AccountManager.convertErrorToException(AccountManager.java:2024)
    at android.accounts.AccountManager.access0(AccountManager.java:144)
    at android.accounts.AccountManager$AmsTask$Response.onError(AccountManager.java:1867)
    at android.accounts.IAccountManagerResponse$Stub.onTransact(IAccountManagerResponse.java:69)
    at android.os.Binder.execTransact(Binder.java:446)

Я не могу найти ни дока об этом, ни других людей с тем же исключением, и я совсем запутался: вызов AccountManager.getAuthToken предоставляет только учетную запись (имя и тип), объем и метод обратного вызова, нет параметра, чтобы указать приложение или что-то, что я мог бы настроить в консоли API dev.

Я уверен, что что-то упускаю, но что?

6 ответов


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

факт в том, что когда вы подписываете APK, а затем спрашиваете Google о токене OAuth2, вы должны зарегистрировать подписанное приложение через консоль разработчика. Это мера безопасности, основанная на имени пакета приложения и отпечатке пальца sha1.

чтобы сделать это, вам надо :

  1. подпишите свой APK, вручную или через Gradle или что угодно: документация для Android довольно ясно на этом шаге;
  2. получите отпечаток пальца sha1; как упоминается в это так ответ, это своего рода легко на Android Studio: в панели Gradle выберите signingReport задача под вашим корневым проектом и запустите его - отпечаток SHA1 будет отображаться в текстовом выходе;
  3. зарегистрируйте свой APK через консоль Google dev: создайте новые учетные данные / идентификатор клиента OAuth / Android, определенный SHA1 отпечаток пальца вы получили и Ваше имя пакета APK.

и вуаля!

для информации, единственная официальная документация, которую я нашел, объясняющая, почему и как из двух последних шагов здесь: https://developers.google.com/drive/android/auth


для тех, кто все еще борется с этим, вот что сработало для меня:

Если вы зарегистрируете свое приложение в Google Play App Подписание программа, то ваше хранилище ключей не используется де-факто, чтобы подписать приложение, как только оно достигнет play store-вот почему отпечатки пальцев не совпадают.

Google удаляет ваш сертификат и создает новый сертификат подписи, который используется для подписания APK.

в игровой консоли перейдите в релиз Управление - > App signing

Если вы выбрали Google Play App Подписание, вы увидите там 2 сертификата вместе со всеми их отпечатками пальцев. Используйте Сертификат Подписи Приложения отпечаток пальца вместо Загрузить Сертификат это хранилище ключей.


не хватает репутации, чтобы прокомментировать принятый ответ...

Регистрация моего приложения в консоли Google dev не работала для меня. Оказалось,что поскольку я использовал сборку debug gradle, мне пришлось добавить".отладка" к имени пакета в консоли разработчика Google.

Я узнал об этом, отладив код Android AccountManager. Когда я вошел в код, я заметил, что переменная для имени пакета моего приложения имела ".debug " в конце концов. Поэтому вместо использования фактическое имя пакета " com.пакет.имя "в консоли Google dev я изменил его на" com.пакет.имя.debug", который исправил исключение UNREGISTERED_ON_API_CONSOLE для меня.

причина этого в том, что мой отладочный buildType в gradle имел "applicationIdSuffix".отлаживать.'"


для меня решения выше не работают вообще. Я наконец-то сам разбираюсь с этим жуком. У меня есть несколько папок в моем рабочем пространстве, и каждый из них имеет свои собственные Манифест.в XML file, что означает, что у них разные имена пакетов. В этом случае, когда мы регистрируемся в Google API, мы должны использовать имя пакета в файле построить.Gradle в свойство applicationId. Тогда вот оно.


спасибо Ксавье Портебуа, ваш ответ действительно помог. Мне пришлось сделать еще два шага.

  • убедитесь, что вы включили API для службы, которую вы используете (в моем случае API календаря) в той же консоли Google dev
  • Если вы используете подпись приложения Google Play, вы не хотите использовать отпечаток пальца debug SHA из Android Studio. Вместо этого перейдите в консоль публикации приложений - > управление выпуском - > подпись приложения. Используйте отпечаток пальца SHA-1 из подписи приложения сертификат. 2-я строка на этом скриншоте

Спасибо за содержательный ответ!


для меня проблема заключалась в подписи-отпечатке сертификата (SHA-1) приложения отладки, и приложение выпуска не совпадает при обновлении приложения и изменении имени пакета. Я потратил дни, проверяя имя пакета, а затем выяснил, что проблема-это имя пакета.

чтобы получить правильный ключ SHA-1, Следуйте этому S. O post, затем используйте этот ключ для создания нового идентификатора клиента OAuth для вашего приложения.