wake-up-neo.net

UNREGISTERED_ON_API_CONSOLE beim Abrufen des OAuth2-Token unter Android

Wir sind unter Android (Jellybean und höher) und haben eine App, die OAuth2 mit Google zur Authentifizierung verwenden muss.

Ich habe die Login-Aktivität vereinfacht, aber es sieht so aus:

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

Wenn wir accountManagerFuture.getResult() aufrufen, wird diese Ausnahme ausgelöst:

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)

Ich kann weder ein Dokument zu diesem Thema noch andere Personen mit derselben Ausnahme finden, und ich bin ziemlich verwirrt: Der Aufruf von AccountManager.getAuthToken enthält nur ein Konto (Name und Typ), einen Bereich und eine Callback-Methode App oder etwas, das ich in der Dev-API-Konsole anpassen könnte.

Ich bin sicher, dass mir etwas fehlt, aber was?

13

Nun, ich habe es endlich herausgefunden. Nicht sicher, ob ich die Dokumentation falsch gelesen habe oder ob Links fehlen, aber trotzdem.

Wenn Sie ein APK unterschreiben und dann Google nach einem OAuth2-Token fragen, müssen Sie Ihre signierte App über die Dev-Konsole registrieren. Diese Sicherheitsmaßnahme basiert auf dem Namen des App-Pakets und dem Fingerabdruck sha1.

Um das zu tun, musst du:

  1. unterzeichnen Sie Ihre APK manuell oder über Gradle oder was auch immer: Die Android-Dokumentation ist bei diesem Schritt ziemlich klar;
  2. holen Sie sich Ihren sha1 Fingerabdruck; Wie in dieser SO Antwort erwähnt ist es für Android Studio irgendwie einfach: Wählen Sie im Gradle-Bedienfeld die Aufgabe signingReport unter Ihrem Stammprojekt aus und führen Sie sie aus. Der SHA1-Fingerabdruck wird in der Textausgabe angezeigt.
  3. registrieren Sie Ihr APK über die Google dev-Konsole : Erstellen Sie eine neue ID/Android-Client-ID/Android, die durch den SHA1-Fingerabdruck, den Sie erhalten haben, und den Namen Ihres APK-Pakets definiert wird.

Und voila!

Die einzige offizielle Dokumentation, die das Warum und Wie der beiden letzten Schritte erläutert, ist hier zu finden: https://developers.google.com/drive/Android/auth

32

Für alle, die noch immer mit diesem Problem zu kämpfen haben, hat sich Folgendes für mich bewährt:

Wenn Sie Ihre App im Google Play App Signing -Programm registrieren, wird Ihr KeyStore nicht faktisch zum Signieren der Anwendung verwendet, sobald sie den Play Store erreicht. Deshalb stimmen die Fingerabdrücke nicht überein.

Google entfernt Ihr Zertifikat und erstellt ein neues Signaturzertifikat, das zum Signieren Ihres APK verwendet wird.

Gehen Sie in der Play Console zu Release Management -> App signing.

Wenn Sie sich für Google Play App Signing angemeldet haben, werden dort 2 Zertifikate mit allen Fingerabdrücken angezeigt. Verwenden Sie den Fingerabdruck App Signing Certificate anstelle des Upload Certificate, das Ihr KeyStore ist.

13
Itai Hanski

Haben Sie nicht den Ruf, die akzeptierte Antwort zu kommentieren ...

Die Registrierung meiner App in der Google Dev-Konsole hat für mich nicht funktioniert. Es stellte sich heraus, dass ich, da ich den Debug-Gradle-Build verwendete, ".debug" an den Paketnamen in der google dev-Konsole anhängen musste. 

Ich habe dies durch das Debuggen des Android AccountManager-Codes herausgefunden. Als ich den Code betrat, bemerkte ich, dass die Variable für den Paketnamen meiner App am Ende ".debug" hatte. Anstatt den tatsächlichen Paketnamen "com.package.name" in der Google Dev Console zu verwenden, änderte ich ihn in "com.package.name.debug", wodurch die UNREGISTERED_ON_API_CONSOLE-Ausnahme für mich behoben wurde.

Der Grund dafür ist, dass mein DebugbuildType in Gradle 'applicationIdSuffix ".debug" "hatte. 

8
Jeff Angelini

Danke Xavier Portebois, Ihre Antwort hat wirklich geholfen. Ich musste noch zwei Schritte machen.

  • Stellen Sie sicher, dass Sie die API für den Dienst, den Sie verwenden (in meinem Fall die Kalender-API) in derselben Google-Dev-Konsole aktivieren
  • Wenn Sie Google Play App Signing verwenden, möchten Sie den Debug-Fingerabdruck SHA von Android Studio nicht verwenden. Gehen Sie stattdessen zu Ihrer App-Veröffentlichungskonsole -> Versionsverwaltung -> App-Signatur. Verwenden Sie den SHA-1-Fingerabdruck aus dem App-Signing-Zertifikat. 2. Zeile in diesem Screenshot

Danke für die informative Antwort!

0
Emilie

Für mich funktionieren die oben genannten Lösungen überhaupt nicht. Ich finde den Fehler schließlich selbst heraus ... Ich habe mehrere Ordner in meinem Arbeitsbereich, und jeder von ihnen hat seine eigene DateiManifest.xml, was bedeutet, dass sie unterschiedliche Paketnamen haben. In diesem Fall müssen wir bei der Registrierung bei Google API den Paketnamen in der Dateibuild.gradle, der Eigenschaft applicationId ..__ verwenden. Dann ist es hier.

0
Weiheng Lian

Für mich war das Problem der Fingerabdruck des Signaturzertifikats (SHA-1) der Debug-App. Die Release-App stimmt nicht überein, wenn ich die App aktualisiere und den Paketnamen ändere. Ich habe Tage damit verschwendet, den Paketnamen zu überprüfen und dann herauszufinden, dass das Problem der Paketname ist.

Um den korrekten SHA-1-Schlüssel zu erhalten, folgen Sie diesem S.O post und erstellen Sie mit diesem Schlüssel eine neue OAuth-Client-ID für Ihre App.

0
nhoxbypass