FirexportBlog

Errores de Firebase App Check: soluciona 403, “App attestation failed” y tokens no válidos

Los errores de App Check se producen en uno de dos pasos: cuando la app obtiene un token de su proveedor de certificación (Play Integrity, App Attest, reCAPTCHA) o cuando un servicio de Firebase verifica ese token. Si falla el primero, también falla el segundo, así que no te quedes en el error del servicio: busca primero el error del intercambio de tokens y corrige los valores registrados de tu plataforma. Los emuladores, los simuladores y localhost no pueden superar la certificación de por sí, así que usan un token de depuración.

En resumen

  • Primero, encuentra el paso que falló. Si el intercambio de tokens terminó en un 403, el problema está en la configuración del proveedor; si solo el servicio rechaza las solicitudes, sin error de intercambio, el token falta o no es válido. Distinguirlos por el mensaje
  • En desarrollo, usa un token de depuración. Los emuladores, los simuladores, localhost y las compilaciones con firma de depuración no superan la certificación real. Cómo registrarlo
  • Cada plataforma tiene valores que deben coincidir. En Android, el SHA-256 del certificado de firma; en Apple, el Team ID y el entorno production de App Attest; en la web, los dominios de la clave de reCAPTCHA. Causas por plataforma
  • Desde el 2 de noviembre de 2026, App Check se aplica automáticamente a AI Logic. Solo puedes posponerlo hasta el 21 de enero de 2027. Qué hacer

Encontrar por el mensaje el paso que falló

MensajePaso que falló
Android: Error returned from API. code: 403 body: App attestation failed.Obtención del token. El servidor de App Check no aceptó el resultado de Play Integrity.
Apple: The server responded with an error … HTTP status code: 403Obtención del token. No se aceptó el resultado de App Attest o DeviceCheck.
Web: HTTP status: 403. (appCheck/fetch-status-error), seguido de appCheck/throttledObtención del token. No se aceptó el resultado de reCAPTCHA, y el SDK no vuelve a intentarlo durante 24 horas.
Cloud Storage: Firebase App Check token is invalid. (en el SDK web, storage/unauthorized-app)Uso del token. El token falta o no es válido.
Funciones que admiten llamadas (callable): functions/unauthenticatedUso del token. Lo rechazó una función con enforceAppCheck: true. Un token de Auth incorrecto da el mismo código, así que se distinguen por la línea AppCheck token was rejected en el log de la función.
Realtime Database: Provided AppCheck credentials for the app named ... are invalidUso del token. El token no es válido.
Firebase AI Logic: 403 PERMISSION_DENIED: ... you must enforce Firebase App Check.Uso del token. Consulta la sección AI Logic.

Si no se obtiene el token, las solicitudes al servicio no llevan ningún token válido (el SDK web adjunta en su lugar un token ficticio). Por eso, aunque veas un error del lado del servicio, comprueba primero si en los logs aparece también un error al obtener el token. Tras un fallo, el SDK pospone los reintentos: en la web, 24 horas después de un 403 o un 404; en Android y Apple, 24 horas después de un 400 o un 404, y con los demás errores, hasta 4 horas. Ese estado solo se guarda en memoria, así que, después de corregir la configuración, reinicia la app o vuelve a cargar la página antes de comprobarlo.

Token de depuración durante el desarrollo

Los emuladores y los simuladores no cuentan como dispositivos válidos, y las compilaciones de depuración que no están en Google Play no superan Play Integrity. Por norma, las claves de reCAPTCHA no incluyen localhost. En estos entornos, activa el proveedor de depuración y registra en la consola el token que aparece en los logs.

  1. Activa el proveedor de depuración solo en las compilaciones de desarrollo.
    // 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(),
    );
  2. Ejecuta la app y busca el token de depuración en los logs. Los SDK actuales lo imprimen con el formato Firebase App Check debug token: <UUID> (en Android, en logcat; en Apple, en la consola de Xcode; en la web, en la consola del navegador).
  3. Registra el token. En la consola de Firebase, abre la pestaña Apps de App Check y, en el menú ⋮ de la app, elige Administrar tokens de depuración (Manage debug tokens). Puedes registrar hasta 20 por app.
  • Los tokens cambian. Se crea uno nuevo en Android si borras los datos de la app o la reinstalas; en Apple, si la reinstalas, y en la web, si usas otro perfil del navegador o borras los datos del sitio. El token nuevo hay que volver a registrarlo.
  • En CI, pasa un token que ya hayas registrado. En la web se usa la cadena del token en self.FIREBASE_APPCHECK_DEBUG_TOKEN; en Android, el argumento de instrumentación firebaseAppCheckDebugSecret; en Apple, la variable de entorno del esquema AppCheckDebugToken, y en Flutter, el parámetro debugToken.
  • Trata el token como una contraseña. No lo subas al repositorio, y deja el proveedor de depuración y el token fuera de las compilaciones de producción.

Causas por plataforma

Android (Play Integrity)

SíntomaCausaSolución
Solo falla en emuladores o compilaciones de depuraciónLos emuladores no son dispositivos válidos, y Google Play no conoce la firma de depuración.Token de depuración
Falla la app descargada de PlayRegistraste el SHA-256 de la clave de carga. Con la firma de apps de Play, Google vuelve a firmar la app con la clave de firma de la app.Registrar en App Check el SHA-256 del certificado de la clave de firma de la app que aparece en la página Administrar la firma de apps de Play (Manage Play app signing) de Play Console
Falla una app distribuida fuera de PlayPor defecto, solo pasan las versiones de la app que Google Play reconoce (PLAY_RECOGNIZED).En la configuración de Play Integrity de App Check, cambiar PLAY_RECOGNIZED a No obligatorio (Not required) y subir la integridad mínima del dispositivo a Integridad del dispositivo (Device integrity)
Falla a medida que crecen los usuarios (TOO_MANY_REQUESTS, -8)Los proyectos de Cloud que no están vinculados en Play Console tienen un límite de 10.000 solicitudes de Play Integrity al día.En la sección API de Play Integrity de Play Console, vincular el proyecto de Firebase con Vincular proyecto de Cloud (Link Cloud project) y, si hace falta, pedir un aumento de cuota. Solo se pueden vincular apps que estén en Google Play.

Apple (App Attest, DeviceCheck)

SíntomaCausaSolución
Falla en el simuladorEl simulador no es un dispositivo válido.Token de depuración
Solo fallan las compilaciones instaladas desde XcodeAl agregar la capability App Attest, el entorno queda en development, y App Check no acepta los resultados de ese entorno. Las compilaciones de TestFlight y de App Store siempre usan production.Poner App Attest Environment en production en el archivo de entitlements
Falla en todos los dispositivosEl Team ID registrado en Firebase no es el de la app.Ingresar el Team ID correcto de la app de Apple en la configuración del proyecto de Firebase
Falla en Mac o en extensiones de appSon entornos que no admiten App Attest.Agregar DeviceCheck como proveedor de respaldo. Para DeviceCheck, registrar en App Check la clave (.p8) creada en el sitio para desarrolladores de Apple y su ID de clave
Flutter: el proveedor elegido no se usa en dispositivos realesSi se llama primero a FirebaseApp.configure() en AppDelegate, se ignora providerApple.Quitar configure() de AppDelegate y usar solo Firebase.initializeApp() en Dart

Web (reCAPTCHA)

SíntomaCausaSolución
Solo falla en el sitio desplegadoEl dominio no está en la lista de dominios de la clave de reCAPTCHA.Agregar el dominio en la configuración de la clave. Puede tardar hasta 30 minutos en surtir efecto
Falla en localhostLas claves de producción no incluyen localhost.Token de depuración
Falla después de cambiar de claveLa clase del proveedor y el valor registrado en Firebase no se corresponden.Clave Enterprise: ReCaptchaEnterpriseProvider en el código y la clave del sitio en Firebase. Clave v3: ReCaptchaV3Provider en el código y la clave secreta en Firebase
Sigue fallando después de corregirloTras un 403 o un 404, el SDK no vuelve a intentar el intercambio de tokens durante 24 horas.Volver a cargar la página. Ese estado solo se guarda en memoria.

AI Logic: aplicación automática desde el 2 de noviembre de 2026

Desde el 2 de noviembre de 2026, Firebase aplica App Check automáticamente a Firebase AI Logic en los proyectos que no lo aplicaban. Las solicitudes sin un token válido se bloquean, y lo mismo pasa con las versiones de la app publicadas sin App Check. Hay dos errores de AI Logic que mencionan 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.
  • El primero aparece cuando se llama sin un token de App Check válido a un modelo del que se abusa a menudo. Configura App Check y aplícalo. Durante el desarrollo, usa el proveedor de depuración.
  • El segundo aparece cuando el proyecto se consideró inactivo y no aplica App Check. Si ya lo aplicas y aun así aparece, revisa la protección contra repeticiones (replay protection): si está activada, también en el modo Monitor only, solo se aceptan los tokens de uso limitado (limited-use tokens).

Si todavía hay usuarios con versiones sin App Check, puedes posponer la aplicación forzosa. Basta con cambiar la fecha del selector Aplicación (Enforces) en la fila de Firebase AI Logic de la pestaña APIs de App Check; el 21 de enero de 2027 es la última fecha posible. Si la fila ya dice Aplicada (Enforced), para levantarla tienes que cambiar la fecha y, después, en Configurar (Set up) de esa fila, poner la Protección de referencia (Baseline protection) en Unenforced (monitoring only) y la protección contra repeticiones en Disabled. Google no lo recomienda, así que publica antes de esa fecha una versión con App Check.

Antes de aplicarlo a otros servicios

  • Mira primero las métricas. La pestaña APIs de App Check divide las solicitudes de cada servicio en verificadas (Verified), de cliente desactualizado (Outdated client, sin token), de origen desconocido (Unknown origin) y no válidas (Invalid). Con App Check aplicado, solo pasan las solicitudes verificadas, así que aplícalo cuando casi todas las solicitudes recientes estén verificadas.
  • Las versiones antiguas de la app quedan bloqueadas. Las versiones sin el SDK de App Check ven rechazadas sus solicitudes en cuanto lo aplicas.
  • Tarda hasta 15 minutos en surtir efecto. No juzgues el resultado justo después de activar la aplicación forzosa.
  • En Cloud Functions, App Check solo se puede aplicar a las funciones que admiten llamadas. Hay que agregar enforceAppCheck: true y volver a desplegar para que surta efecto. Las funciones onRequest quedan fuera de la aplicación forzosa de App Check, así que verifica el token tú mismo con el Admin SDK.

Fuentes

Todos los artículos →