FirexportBlog

Fehler 10 und 28444 bei Google Sign-In beheben: Developer console is not set up correctly

ApiException: 10 aus dem alten SDK für Google Sign-In und [28444] Developer console is not set up correctly aus dem Credential Manager sind dasselbe Konfigurationsproblem. Die App, die die Anmeldung anfordert (ihr Paketname und der SHA-1-Fingerabdruck des Zertifikats, mit dem dieser Build signiert wurde), oder die Webclient-ID, die sie übergeben hat, stimmt nicht mit dem überein, was im Projekt registriert ist. Zu korrigieren ist die Registrierung, nicht der Code. Prüfen Sie zuerst, ob der SHA-1-Fingerabdruck des Schlüssels, mit dem der laufende Build signiert wurde, in Firebase eingetragen ist.

Kurz gesagt

  • Derselbe Fehler unter anderem Namen. 10 ist der DEVELOPER_ERROR des alten SDK, 28444 die gleichbedeutende Meldung, die der Credential Manager zurückgibt. Ursache ist der Paketname, der SHA-1-Fingerabdruck der Signatur oder die Webclient-ID. Fehler unterscheiden
  • Registrieren Sie den SHA-1-Fingerabdruck des Schlüssels, der den laufenden Build signiert hat. Debug-Schlüssel, Uploadschlüssel und der App-Signaturschlüssel von Google Play sind alle verschieden. SHA-1 je Build
  • In serverClientId gehört die Webclient-ID. Nicht die Android-Client-ID. Was hineingehört
  • Das alte SDK wurde im August 2026 entfernt. Beim Credential Manager kann derselbe Konfigurationsfehler auch wie ein Abbruch durch den Nutzer aussehen. Umstieg

Die Fehler unterscheiden

FehlerWoBedeutung
ApiException: 10Das alte Google Sign-In for AndroidDEVELOPER_ERROR. Die App ist falsch konfiguriert.
[28444] Developer console is not set up correctly.Credential Manager. In Flutters google_sign_in 7: GoogleSignInExceptionCode.unknownErrorDer Code ist nicht dokumentiert. Wie die Meldung sagt, passt die OAuth-Konfiguration nicht zur App.
Abgebrochen, ohne dass der Nutzer abgebrochen hatCredential Manager (GetCredentialCancellationException, in Flutter canceled)Konfigurationsfehler werden manchmal als Abbruch gemeldet.
ApiException: 12500Das alte Google Sign-In for AndroidLaut Firebase-Dokumentation fehlt die Support-E-Mail-Adresse oder ein SHA-Schlüssel.
NoCredentialExceptionCredential ManagerKein Konfigurationsproblem. Auf dem Gerät ist kein Google-Konto vorhanden, oder die Anfrage ist so eingestellt, dass sie nur Konten anbietet, die sich schon einmal in dieser App angemeldet haben (siehe unten).

Die ersten drei haben dieselben Ursachen. Die Dokumentation des Flutter-Plug-ins (google_sign_in_android) nennt als häufige Ursachen von Konfigurationsfehlern einen fehlenden oder falschen SHA-Fingerabdruck der Signatur eines Builds, einen falschen Paketnamen auf der Serverseite und eine fehlende oder falsche serverClientId. Prüfen Sie sie in dieser Reihenfolge.

Der SHA-1-Fingerabdruck des Schlüssels, der diesen Build signiert hat

Google erkennt die App, die die Anmeldung anfordert, an ihrem Paketnamen und am SHA-1-Fingerabdruck des Zertifikats, mit dem das APK signiert wurde. Der Paketname ist die applicationId in build.gradle (samt dem Suffix, das ein Build-Typ anhängt) und muss mit dem der in Firebase registrierten Android-App übereinstimmen. Die Signatur hängt davon ab, wie die App installiert wurde.

Installierter BuildSigniert mitSHA-1 ermitteln
Debug-Build, aus Android Studio gestartetDer Debug-Keystore dieses Computers (auf jedem Computer anders)Der Eintrag „debug“ in signingReport
Release-Build, selbst signiert und installiertIhr Uploadschlüssel (Release-Schlüssel)Der Eintrag „release“ in signingReport
Aus Google Play installierte App (jeder Track)Der App-Signaturschlüssel, den Google verwaltetDie Seite „Play App-Signatur verwalten“ (Manage Play app signing) in der Play Console
Über die interne App-Freigabe (Internal app sharing) installierte AppDas interne Testzertifikat von Play„Internes Testzertifikat“ (Internal test certificate) auf der Seite „Interne App-Freigabe“ der Play Console
# Every build variant's signing key, from the project root
./gradlew signingReport

# The debug keystore (password: android)
keytool -list -v -alias androiddebugkey -keystore ~/.android/debug.keystore

# The certificate that signed an APK or AAB you already have
keytool -printcert -jarfile app-release.aab

Fügen Sie den gefundenen SHA-1-Fingerabdruck in der Firebase Console unter Projekteinstellungen (Project settings) > Allgemein (General) > Meine Apps (Your apps) bei der Android-App unter SHA-Zertifikat-Fingerabdrücke (SHA certificate fingerprints) hinzu, laden Sie google-services.json neu herunter und ersetzen Sie damit Ihre Datei. Firebase legt für diesen Fingerabdruck den Android-OAuth-Client an. Registrieren Sie alle Schlüssel, die Sie verwenden, dann funktioniert die Anmeldung, egal wie die App installiert wurde.

  • Funktioniert die Anmeldung, wenn Sie selbst installieren, aber nicht über Play, fehlt der App-Signaturschlüssel. Play signiert die App neu, und zwar mit dem App-Signaturschlüssel, den Google verwaltet, nicht mit Ihrem Uploadschlüssel.
  • Neue Apps signiert Play standardmäßig mit drei Schlüsseln (quantenresistente Signatur). Die Play Console-Hilfe fordert Sie dann auf, alle drei Fingerabdrücke bei Ihren API-Anbietern zu registrieren.
  • Ein Paar aus Paketname und SHA-1 lässt sich über alle Firebase- und Google Cloud-Projekte hinweg nur in einem einzigen Projekt registrieren. Wenn Sie getrennte Projekte für Entwicklung und Produktion nutzen, geben Sie jedem Build einen eigenen Paketnamen.

In serverClientId gehört die Webclient-ID

In serverClientId gehört die OAuth-Client-ID der Webanwendung aus Ihrem Google Cloud-Projekt. Sie dient als Zielgruppe (Audience) der Google-ID-Tokens, deshalb hat die Android-Client-ID dort nichts zu suchen. In einem Firebase-Projekt ist das der Eintrag mit client_type 3 in google-services.json, aus dem das google-services-Plug-in R.string.default_web_client_id erzeugt.

// Android (Kotlin): the Sign in with Google button
val buttonOption = GetSignInWithGoogleOption.Builder(
    serverClientId = getString(R.string.default_web_client_id),
).build()

// Android (Kotlin): the bottom sheet, offering every account on the device
val sheetOption = GetGoogleIdOption.Builder()
    .setServerClientId(getString(R.string.default_web_client_id))
    .setFilterByAuthorizedAccounts(false)
    .build()

// Flutter (google_sign_in 7), without google-services.json
await GoogleSignIn.instance.initialize(
  serverClientId: 'YOUR_WEB_CLIENT_ID.apps.googleusercontent.com',
);
  • Flutters google_sign_in 7 liest diesen Wert auch ohne serverClientId, wenn google-services.json einen Webclient-Eintrag enthält. Fehlt er, fügen Sie dem Firebase-Projekt eine Web-App hinzu und laden Sie die Datei neu herunter. Unter Android wird clientId nicht verwendet.
  • Ist 28444 erst nach dem Update von 6.x auf 7 aufgetreten, steht serverClientId unter Verdacht. Das Flutter-Team erklärt, dass das alte SDK, das 6.x nutzte, diesen Wert nicht immer geprüft hat; ein falscher Wert kann deshalb funktioniert haben (flutter/flutter #174319).

Vom alten SDK zum Credential Manager wechseln

Die APIs des alten Google Sign-In for Android wurden mit play-services-auth 22.0.0 (26. August 2026) entfernt. Ab dieser Version lässt sich Anmeldecode, der auf GoogleSignInClient aufbaut, nicht mehr kompilieren. Wechseln Sie deshalb zum Credential Manager.

Altes SDKCredential Manager
Der Anmeldebildschirm von GoogleSignInClientGetSignInWithGoogleOption (Schaltfläche) oder GetGoogleIdOption (Ansicht am unteren Rand)
silentSignIn()GetGoogleIdOption mit setFilterByAuthorizedAccounts(true) und setAutoSelectEnabled(true)
requestIdToken(webClientId)Dieselbe Webclient-ID in serverClientId
signOut()clearCredentialState()
ApiException: 10[28444] Developer console is not set up correctly oder ein Abbruch
  • setFilterByAuthorizedAccounts ist standardmäßig true. Nutzer, die sich noch nie in dieser App angemeldet haben, erhalten eine NoCredentialException. Setzen Sie den Wert für Registrierung und erste Anmeldung deshalb auf false oder verwenden Sie den Ablauf mit der Schaltfläche.
  • Melden Sie sich im Emulator bei einem Google-Konto an. Verwenden Sie ein System-Image mit Google APIs. Ohne Konto auf dem Gerät erhalten Sie eine NoCredentialException.

Quellen

Alle Beiträge →