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?
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:
signingReport
unter Ihrem Stammprojekt aus und führen Sie sie aus. Der SHA1-Fingerabdruck wird in der Textausgabe angezeigt.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
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.
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.
Danke Xavier Portebois, Ihre Antwort hat wirklich geholfen. Ich musste noch zwei Schritte machen.
Danke für die informative Antwort!
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.
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.