android oauth-2.0 google-api

UNREGISSTEM_ON_API_CONSOLE al obtener el token OAuth2 en Android



oauth-2.0 google-api (6)

Bueno, finalmente lo descubrí. No estoy seguro si leí mal la documentación o si faltan enlaces, pero de todos modos.

El hecho es que cuando firmas un APK y luego le pides a Google un token OAuth2, debes registrar tu aplicación firmada a través de la consola de desarrollo. Es una medida de seguridad basada en el nombre del paquete de la aplicación y la huella digital sha1.

Para hacer eso, tienes que:

  1. firme su APK, manualmente o mediante Gradle o lo que sea: la documentación de Android es bastante clara en este paso;
  2. obtener su huella digital sha1; como se menciona en esta respuesta SO , es algo fácil en Android Studio: en el panel de Gradle, seleccione la tarea de signingReport en su proyecto raíz y ejecútela; la huella digital SHA1 se mostrará en la salida de texto;
  3. registre su APK a través de la consola de desarrollo de Google : cree un nuevo Credentials / OAuth client id / Android, definido por la huella digital SHA1 que obtuvo y el nombre de su paquete APK.

¡Y voilá!

Para obtener información, la única documentación oficial que encontré que explica el por qué y cómo de los dos pasos finales está aquí: https://developers.google.com/drive/android/auth

Estamos bajo Android (Jellybean y superior), y tenemos una aplicación que necesita usar OAuth2 con Google para la autenticación.

Simplifiqué la actividad de inicio de sesión, pero se ve así:

AccountManager mAccountManager; // [...] Account account = new Account("[email protected]", "com.google"); // same with professional email managed by Google as [email protected] // 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);

Cuando llamamos a accountManagerFuture.getResult() , accountManagerFuture.getResult() esta excepción:

android.accounts.AuthenticatorException: UNREGISTERED_ON_API_CONSOLE at android.accounts.AccountManager.convertErrorToException(AccountManager.java:2024) at android.accounts.AccountManager.access$400(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)

No puedo encontrar ningún documento sobre esto ni sobre otras personas con la misma excepción, y estoy bastante confundido: la llamada a AccountManager.getAuthToken solo proporciona una cuenta (nombre y tipo), un alcance y un método de devolución de llamada, no hay ningún parámetro para especifique una aplicación o algo que pueda personalizar en la consola API de desarrollo.

Estoy seguro de que me falta algo, pero ¿qué?


Gracias Xavier Portebois, tu respuesta realmente ayudó. Tuve que hacer dos pasos más.

  • Asegúrese de habilitar la API para el servicio que está utilizando (en mi caso, la API de calendario) en la misma consola de desarrollo de Google
  • Si está utilizando la firma de aplicaciones de Google Play, no desea utilizar la huella digital SHA de depuración de Android Studio. En su lugar, vaya a la consola de publicación de aplicaciones -> gestión de versiones -> firma de aplicaciones. Use la huella digital SHA-1 del certificado de firma de la aplicación. Segunda línea en esta captura de pantalla

Gracias por la respuesta informativa!


No tengo la reputación de comentar sobre la respuesta aceptada ...

Registrar mi aplicación en la consola de desarrollo de Google no me funcionó. Resultó que como estaba usando la construcción de depuración de gradle, tuve que agregar ".debug" al nombre del paquete en la consola de desarrollo de Google.

Lo descubrí depurando el código de Android AccountManager. Cuando entré en el código, noté que la variable para el nombre del paquete de mi aplicación tenía ".debug" al final. Entonces, en lugar de usar el nombre real del paquete "com.package.name" en la consola de desarrollo de Google, lo cambié a "com.package.name.debug", que solucionó la excepción UNREGISSTEM_ON_API_CONSOLE para mí.

La razón de esto es porque mi debug buildType en gradle tenía ''applicationIdSuffix ".debug"''.


Para cualquiera que todavía esté luchando con esto, esto es lo que funcionó para mí:

Si inscribe su aplicación en el programa de firma de aplicaciones de Google Play , su KeyStore no se utiliza de facto para firmar la aplicación una vez que llega a Play Store, es por eso que las huellas digitales no coinciden.

Google elimina su certificado y crea un nuevo certificado de firma que se utiliza para firmar su APK.

En Play Console, vaya a Administración de versiones -> Firma de aplicaciones

Si optó por la firma de aplicaciones de Google Play , verá 2 certificados allí junto con todas sus huellas digitales. Use la huella digital del Certificado de firma de la aplicación en lugar del Certificado de carga, que es su KeyStore.


Para mí, el problema era la huella digital del certificado de firma (SHA-1) de la aplicación de depuración y la aplicación de lanzamiento no coincide cuando actualizo la aplicación y cambio el nombre del paquete. He perdido días comprobando el nombre del paquete y luego descubro que el problema es el nombre del paquete.

Para obtener la clave SHA-1 correcta, siga esta publicación SO , luego use esta clave para crear una nueva ID de cliente OAuth para su aplicación.


Para mí, las soluciones anteriores no funcionan en absoluto. Finalmente descubrí el error por mí mismo. Tengo varias carpetas en mi espacio de trabajo y cada una de ellas tiene su propio archivo Manifest.xml , lo que significa que tienen diferentes nombres de paquetes. En este caso, cuando nos registramos en la API de Google, tenemos que usar el nombre del paquete en el archivo build.gradle , la propiedad applicationId . Entonces aquí está.