web-dev-qa-db-fra.com

UNREGISTR_ON_API_CONSOLE lors de l'obtention du jeton OAuth2 sur Android

Nous sommes sous Android (Jellybean et versions supérieures) et nous avons une application qui doit utiliser OAuth2 avec Google pour l'authentification.

J'ai simplifié l'activité de connexion, mais ça ressemble à ça:

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);

Lorsque nous appelons accountManagerFuture.getResult(), il déclenche cette exception:

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)

Je ne trouve aucun document à ce sujet ni d'autres personnes ayant la même exception, et je suis assez confus: l'appel à AccountManager.getAuthToken fournit uniquement un compte (nom et type), une étendue et une méthode de rappel, aucun paramètre permettant de spécifier un application ou quelque chose que je pourrais personnaliser dans la console de l'API de dev.

Je suis sûr qu'il me manque quelque chose, mais quoi?

13
Xavier Portebois

Eh bien, j'ai finalement compris. Je ne sais pas si j'ai mal interprété la documentation ou s'il manque des liens, mais quoi qu'il en soit.

Le fait est que lorsque vous signez un fichier APK et que vous demandez ensuite à Google un jeton OAuth2, vous devez enregistrer votre application signée via la console de développement. Il s'agit d'une mesure de sécurité basée sur le nom du package d'application et l'empreinte digitale de sha1.

Pour ce faire, vous devez:

  1. signez votre APK, manuellement ou via Gradle ou autre chose: la documentation Android est assez claire sur cette étape;
  2. obtenez votre empreinte digitale sha1; Comme mentionné dans cette SO réponse , c’est assez simple sous Android Studio: dans le panneau Gradle, sélectionnez la tâche signingReport sous votre projet racine et exécutez-la;
  3. enregistrez votre APK par le biais de la console de développement Google : créez un nouvel identifiant client Credentials/OAuth/Android, défini par l'empreinte SHA1 que vous avez obtenue et le nom de votre package APK.

Et le tour est joué!

Pour information, la seule documentation officielle que j'ai trouvée expliquant le pourquoi et le comment des deux étapes finales se trouve ici: https://developers.google.com/drive/Android/auth

32
Xavier Portebois

Pour ceux qui ont encore du mal avec ça, voici ce qui a fonctionné pour moi:

Si vous inscrivez votre application dans le programme Google Play App Signing, votre KeyStore n'est pas utilisé de facto pour signer l'application une fois qu'elle est parvenue au Play Store. C'est pourquoi les empreintes digitales ne correspondent pas.

Google supprime votre certificat et crée un nouveau certificat de signature utilisé pour signer votre APK.

Dans la Play Console, accédez à Gestion des versions -> Signature de l'application

Si vous avez choisi Google Play App Signing, vous verrez 2 certificats avec toutes leurs empreintes digitales. Utilisez l’empreinte digitale App Signing Certificate au lieu de Upload Certificate, qui est votre KeyStore.

13
Itai Hanski

Vous n'avez pas la réputation de commenter la réponse acceptée ...

L'enregistrement de mon application dans la console de développement de Google ne fonctionnait pas pour moi. Il s’est avéré que depuis que j’utilisais la construction du gradué de débogage, je devais ajouter ".debug" au nom du paquet dans la console de développement Google. 

J'ai découvert cela en déboguant le code Android AccountManager. Quand je suis entré dans le code, j'ai remarqué que la variable du nom du paquet de mon application avait ".debug" à la fin. Ainsi, au lieu d'utiliser le nom de package actuel "com.package.name" dans la console de développement de Google, je l'ai remplacé par "com.package.name.debug", ce qui a corrigé l'exception UNREGISTR_ON_API_CONSOLE.

La raison en est que mon type de construction debug dans gradle avait 'applicationIdSuffix ".debug"'. 

8
Jeff Angelini

Merci Xavier Portebois, ta réponse a beaucoup aidé. Je devais faire deux autres étapes.

  • Assurez-vous d'activer l'API pour le service que vous utilisez (dans mon cas, l'API de calendrier) dans cette même console de développement Google.
  • Si vous utilisez Google Play App Signing, vous ne souhaitez pas utiliser l'empreinte de débogage SHA d'Android Studio. À la place, accédez à la console de publication de votre application -> Gestion des versions -> Signature des applications. Utilisez l'empreinte digitale SHA-1 du certificat de signature d'application. 2ème ligne de cette capture d'écran

Merci pour la réponse informative!

0
Emilie

Pour moi, les solutions ci-dessus ne fonctionnent pas du tout. J'ai enfin résolu le bogue par moi-même ... J'ai plusieurs dossiers dans mon espace de travail et chacun d'eux a son propre fichierManifest.xml, ce qui signifie qu'ils ont des noms de paquetages différents. Dans ce cas, lorsque nous nous enregistrons sur Google API, nous devons utiliser le nom du package dans le fichierbuild.gradle, propriétéapplicationId . Alors le voici.

0
Weiheng Lian

Pour moi, le problème était l'empreinte digitale du certificat de signature (SHA-1) de l'application de débogage et l'application finale ne correspond pas lorsque je mets à niveau l'application et que je change le nom du paquet. J'ai perdu des jours à vérifier le nom du paquet, puis à comprendre que le problème est son nom.

Pour obtenir la clé SHA-1 correcte, suivez la position S.O post , puis utilisez cette clé pour créer un nouvel ID client OAuth pour votre application.

0
nhoxbypass