Firebase App Check-Fehler beheben: 403, „App attestation failed“ und ungültige Tokens
Jeder App Check-Fehler entsteht in einem von zwei Schritten: wenn Ihre App bei ihrem Attestierungsanbieter (Play Integrity, App Attest, reCAPTCHA) ein Token abruft oder wenn ein Firebase-Dienst dieses Token prüft. Scheitert der erste Schritt, scheitert auch der zweite. Bleiben Sie deshalb nicht beim Fehler des Dienstes stehen: Suchen Sie zuerst den Fehler beim Token-Austausch und korrigieren Sie die registrierten Werte Ihrer Plattform. Emulatoren, Simulatoren und localhost können die Attestierung grundsätzlich nicht bestehen und verwenden deshalb ein Debug-Token.
Kurz gesagt
- Finden Sie zuerst den fehlgeschlagenen Schritt. Endet der Token-Austausch mit einem 403, liegt es an der Einrichtung des Anbieters; lehnt nur der Dienst ab, ohne Fehler beim Austausch, fehlt das Token oder ist ungültig. An der Meldung unterscheiden
- Verwenden Sie in der Entwicklung ein Debug-Token. Emulatoren, Simulatoren, localhost und Builds mit Debug-Signatur bestehen keine echte Attestierung. So registrieren Sie es
- Jede Plattform hat Werte, die übereinstimmen müssen. Unter Android der SHA-256-Fingerabdruck des Signaturzertifikats, bei Apple die Team-ID und die production-Umgebung von App Attest, im Web die Domains des reCAPTCHA-Schlüssels. Ursachen nach Plattform
- Für AI Logic wird App Check seit dem 2. November 2026 automatisch erzwungen. Aufschieben lässt sich das nur bis zum 21. Januar 2027. Was zu tun ist
Den fehlgeschlagenen Schritt an der Meldung erkennen
| Meldung | Fehlgeschlagener Schritt |
|---|---|
Android: Error returned from API. code: 403 body: App attestation failed. | Token abrufen. Der App Check-Server hat das Play Integrity-Ergebnis nicht akzeptiert. |
Apple: The server responded with an error … HTTP status code: 403 | Token abrufen. Das Ergebnis von App Attest oder DeviceCheck wurde nicht akzeptiert. |
Web: HTTP status: 403. (appCheck/fetch-status-error), danach appCheck/throttled | Token abrufen. Das reCAPTCHA-Ergebnis wurde nicht akzeptiert, und das SDK versucht es 24 Stunden lang nicht erneut. |
Cloud Storage: Firebase App Check token is invalid. (im Web-SDK storage/unauthorized-app) | Token verwenden. Das Token fehlt oder ist ungültig. |
Aufrufbare Funktionen (callable): functions/unauthenticated | Token verwenden. Eine Funktion mit enforceAppCheck: true hat es abgelehnt. Ein ungültiges Auth-Token liefert denselben Code; unterscheiden lassen sich die beiden an der Zeile AppCheck token was rejected im Log der Funktion. |
Realtime Database: Provided AppCheck credentials for the app named ... are invalid | Token verwenden. Das Token ist ungültig. |
Firebase AI Logic: 403 PERMISSION_DENIED: ... you must enforce Firebase App Check. | Token verwenden. Siehe Abschnitt AI Logic. |
Wird kein Token abgerufen, tragen die Anfragen an den Dienst kein gültiges Token (das Web-SDK hängt stattdessen ein Platzhalter-Token an). Prüfen Sie deshalb auch bei einem Fehler auf der Seite des Dienstes zuerst, ob im Log zusätzlich ein Fehler beim Abrufen des Tokens steht. Nach einem Fehler schiebt das SDK neue Versuche auf: im Web 24 Stunden nach einem 403 oder 404, unter Android und Apple 24 Stunden nach einem 400 oder 404, bei anderen Fehlern bis zu 4 Stunden. Dieser Zustand liegt nur im Speicher. Starten Sie die App nach dem Korrigieren der Einrichtung deshalb neu oder laden Sie die Seite neu, bevor Sie prüfen.
Debug-Token während der Entwicklung
Emulatoren und Simulatoren gelten nicht als gültige Geräte, und Debug-Builds, die nicht zu Google Play hochgeladen wurden, bestehen Play Integrity nicht. Grundsätzlich gehört localhost nicht in einen reCAPTCHA-Schlüssel. In diesen Umgebungen schalten Sie den Debug-Anbieter ein und registrieren das Token, das im Log erscheint, in der Console.
- Schalten Sie den Debug-Anbieter nur in Entwicklungs-Builds ein.
// Android (Kotlin): com.google.firebase:firebase-appcheck-debug Firebase.appCheck.installAppCheckProviderFactory( if (BuildConfig.DEBUG) DebugAppCheckProviderFactory.getInstance() else PlayIntegrityAppCheckProviderFactory.getInstance(), ) // iOS (Swift): before FirebaseApp.configure() #if DEBUG AppCheck.setAppCheckProviderFactory(AppCheckDebugProviderFactory()) #endif // Web: before initializeAppCheck(), in development builds only self.FIREBASE_APPCHECK_DEBUG_TOKEN = true; // Flutter (firebase_app_check 0.5+) await FirebaseAppCheck.instance.activate( providerAndroid: kDebugMode ? const AndroidDebugProvider() : const AndroidPlayIntegrityProvider(), providerApple: kDebugMode ? const AppleDebugProvider() : const AppleAppAttestWithDeviceCheckFallbackProvider(), ); - Starten Sie die App und suchen Sie das Debug-Token im Log. Aktuelle SDKs geben es im Format
Firebase App Check debug token: <UUID>aus (unter Android in logcat, bei Apple in der Xcode-Konsole, im Web in der Browserkonsole). - Registrieren Sie das Token. Öffnen Sie in der Firebase Console App Check, wechseln Sie zum Tab „Apps“ und wählen Sie im ⋮-Menü der App „Debug-Tokens verwalten“ (Manage debug tokens). Pro App lassen sich bis zu 20 registrieren.
- Tokens ändern sich. Ein neues entsteht, wenn Sie unter Android die App-Daten löschen oder die App neu installieren, bei Apple die App neu installieren und im Web ein anderes Browserprofil verwenden oder die Websitedaten löschen. Das neue Token müssen Sie erneut registrieren.
- Übergeben Sie in CI ein bereits registriertes Token. Im Web ist das der Token-String in
self.FIREBASE_APPCHECK_DEBUG_TOKEN, unter Android das InstrumentierungsargumentfirebaseAppCheckDebugSecret, bei Apple die UmgebungsvariableAppCheckDebugTokenim Schema und in Flutter der ParameterdebugToken. - Behandeln Sie das Token wie ein Passwort. Übertragen Sie es nicht ins Repository, und halten Sie den Debug-Anbieter und das Token aus Produktions-Builds heraus.
Ursachen nach Plattform
Android (Play Integrity)
| Symptom | Ursache | Lösung |
|---|---|---|
| Scheitert nur auf Emulatoren oder bei Debug-Builds | Emulatoren sind keine gültigen Geräte, und Google Play kennt die Debug-Signatur nicht. | Debug-Token |
| Die aus Play installierte App scheitert | Sie haben den SHA-256-Fingerabdruck des Uploadschlüssels registriert. Mit der Play App-Signatur signiert Google die App mit dem App-Signaturschlüssel neu. | Den SHA-256-Fingerabdruck des Zertifikats des App-Signaturschlüssels von der Seite „Play App-Signatur verwalten“ (Manage Play app signing) der Play Console in App Check registrieren |
| Eine außerhalb von Play vertriebene App scheitert | Standardmäßig kommen nur App-Versionen durch, die Google Play kennt (PLAY_RECOGNIZED). | In den Play Integrity-Einstellungen von App Check PLAY_RECOGNIZED auf „Nicht erforderlich“ (Not required) setzen und die Mindest-Geräteintegrität auf „Geräteintegrität“ (Device integrity) anheben |
Scheitert mit wachsender Nutzerzahl (TOO_MANY_REQUESTS, -8) | Cloud-Projekte, die nicht in der Play Console verknüpft sind, sind auf 10.000 Play Integrity-Anfragen pro Tag begrenzt. | In der Play Console im Abschnitt Play Integrity API das Firebase-Projekt über „Cloud-Projekt verknüpfen“ (Link Cloud project) verknüpfen und bei Bedarf eine Kontingenterhöhung beantragen. Nur Apps bei Google Play lassen sich verknüpfen. |
Apple (App Attest, DeviceCheck)
| Symptom | Ursache | Lösung |
|---|---|---|
| Scheitert im Simulator | Der Simulator ist kein gültiges Gerät. | Debug-Token |
| Nur aus Xcode installierte Builds scheitern | Mit der Capability App Attest wird die Umgebung auf development gesetzt, und App Check akzeptiert keine Ergebnisse aus dieser Umgebung. TestFlight- und App Store-Builds verwenden immer production. | In der Entitlements-Datei App Attest Environment auf production setzen |
| Scheitert auf allen Geräten | Die in Firebase registrierte Team-ID ist nicht die der App. | In den Firebase-Projekteinstellungen bei der Apple-App die richtige Team-ID eintragen |
| Scheitert auf Macs oder in App-Erweiterungen | Dort wird App Attest nicht unterstützt. | DeviceCheck als Fallback-Anbieter hinzufügen. Für DeviceCheck den auf der Apple-Entwicklerwebsite erstellten Schlüssel (.p8) und seine Schlüssel-ID in App Check registrieren |
| Flutter: Der gewählte Anbieter wird auf echten Geräten nicht verwendet | Wird in AppDelegate zuerst FirebaseApp.configure() aufgerufen, wird providerApple ignoriert. | configure() aus AppDelegate entfernen und nur Firebase.initializeApp() in Dart verwenden |
Web (reCAPTCHA)
| Symptom | Ursache | Lösung |
|---|---|---|
| Scheitert nur auf der bereitgestellten Website | Die Domain steht nicht in der Domainliste des reCAPTCHA-Schlüssels. | Domain in den Schlüsseleinstellungen hinzufügen. Bis die Änderung greift, können bis zu 30 Minuten vergehen |
| Scheitert auf localhost | Produktionsschlüssel enthalten kein localhost. | Debug-Token |
| Scheitert nach einem Schlüsselwechsel | Anbieterklasse und der in Firebase registrierte Wert passen nicht zusammen. | Enterprise-Schlüssel: ReCaptchaEnterpriseProvider im Code und der Websiteschlüssel in Firebase. v3-Schlüssel: ReCaptchaV3Provider im Code und der Secret-Schlüssel in Firebase |
| Scheitert auch nach der Korrektur | Nach einem 403 oder 404 versucht das SDK den Token-Austausch 24 Stunden lang nicht erneut. | Seite neu laden. Dieser Zustand liegt nur im Speicher. |
AI Logic: automatische Erzwingung seit dem 2. November 2026
Seit dem 2. November 2026 erzwingt Firebase App Check für Firebase AI Logic automatisch in den Projekten, die es bisher nicht erzwungen haben. Anfragen ohne gültiges Token werden blockiert, ebenso die von App-Versionen, die ohne App Check veröffentlicht wurden. Zwei Fehler von AI Logic nennen App Check.
403 PERMISSION_DENIED: To access this model, you must enforce
Firebase App Check.
403 PERMISSION_DENIED: Firebase AI Logic has been deactivated in this
project. To resume using Firebase AI Logic, you must enforce Firebase
App Check.- Der erste bedeutet, dass ohne gültiges App Check-Token ein häufig missbrauchtes Modell aufgerufen wurde. Richten Sie App Check ein und erzwingen Sie es. In der Entwicklung verwenden Sie den Debug-Anbieter.
- Der zweite bedeutet, dass das Projekt als inaktiv eingestuft wurde und App Check nicht erzwingt. Erzwingen Sie es bereits und erscheint der Fehler trotzdem, prüfen Sie den Replay-Schutz (replay protection): Ist er eingeschaltet, auch im Modus „Monitor only“, werden nur Tokens mit eingeschränkter Nutzung (limited-use tokens) anerkannt.
Sind Versionen ohne App Check noch bei Nutzern im Einsatz, können Sie die Erzwingung aufschieben. Dazu ändern Sie auf dem Tab „APIs“ von App Check in der Zeile von Firebase AI Logic das Datum bei „Erzwingt“ (Enforces); der 21. Januar 2027 ist der letztmögliche Termin. Steht in der Zeile bereits „Erzwungen“ (Enforced), ändern Sie das Datum und setzen danach unter „Einrichten“ (Set up) in dieser Zeile den „Basisschutz“ (Baseline protection) auf „Unenforced (monitoring only)“ und den Replay-Schutz auf „Disabled“; erst dann ist die Erzwingung aufgehoben. Google rät davon ab. Veröffentlichen Sie deshalb vor diesem Termin eine Version mit App Check.
Bevor Sie es für andere Dienste erzwingen
- Sehen Sie sich zuerst die Messwerte an. Der Tab „APIs“ von App Check teilt die Anfragen jedes Dienstes in bestätigte Anfragen (Verified), veraltete Clientanfragen (Outdated client, ohne Token), Anfragen unbekannten Ursprungs (Unknown origin) und ungültige Anfragen (Invalid) auf. Ist App Check erzwungen, kommen nur bestätigte Anfragen durch. Erzwingen Sie es also, wenn fast alle aktuellen Anfragen bestätigt sind.
- Alte App-Versionen werden blockiert. Bei Versionen ohne das App Check SDK werden die Anfragen abgewiesen, sobald Sie die Erzwingung einschalten.
- Bis zur Wirkung vergehen bis zu 15 Minuten. Beurteilen Sie das Ergebnis nicht direkt nach dem Einschalten.
- In Cloud Functions lässt sich App Check nur für aufrufbare Funktionen erzwingen. Wirksam wird es erst, wenn Sie
enforceAppCheck: trueergänzen und die Funktion neu bereitstellen.onRequest-Funktionen fallen nicht unter die Erzwingung von App Check, deshalb müssen Sie das Token dort selbst mit dem Admin SDK prüfen.
Quellen
- Überblick über App Check, Erzwingung aktivieren, Messwerte überwachen, Limit für Debug-Tokens (REST)
- Play Integrity-Anbieter, Play Integrity-Kontingent, Debug-Anbieter für Android
- App Attest-Anbieter, DeviceCheck-Anbieter, Debug-Anbieter für Apple, App Attest-Umgebung (Apple), wo App Attest verfügbar ist (Apple)
- reCAPTCHA Enterprise-Anbieter, reCAPTCHA v3-Anbieter, reCAPTCHA-Schlüssel erstellen, Debug-Anbieter für das Web
- Debug-Anbieter für Flutter,
activate()infirebase_app_check - App Check für AI Logic, Fehlercodes von AI Logic, App Check für Cloud Functions, Tokens im eigenen Backend prüfen
- SDK-Quellcode: Drosselung im Web, Platzhalter-Token im Web, Ablehnung durch Storage, Android-Fehlermeldung, Wiederholungen unter Android, Wiederholungen bei Apple, Ablehnung durch aufrufbare Funktionen
