Незарегистрированный на консоли 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.
чтобы сделать это, вам надо :
- подпишите свой APK, вручную или через Gradle или что угодно: документация для Android довольно ясно на этом шаге;
- получите отпечаток пальца sha1; как упоминается в это так ответ, это своего рода легко на Android Studio: в панели Gradle выберите
signingReport
задача под вашим корневым проектом и запустите его - отпечаток SHA1 будет отображаться в текстовом выходе; - зарегистрируйте свой 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 для вашего приложения.