agentleFS
DentVegaDentVega/firebase-agent-skills/skills/firebase-app-check/SKILL.md

firebase-app-check

Skill0 starsChanged 5 months agoMITView on GitHub

Protects Firebase backends from abuse by attesting that requests come from your real app — Play Integrity (Android), App Attest / DeviceCheck (iOS), reCAPTCHA Enterprise (web). Use whenever the user wants to prevent scraping, quota theft, or unauthorized API access to Firestore, Storage, Cloud Functions, or Realtime Database.

  • Reads credentials

1 other project uses a version of this.

Adopted by

Most recently taken up by

The file

We split this skill into the rules it gives an agent

4 rules. About 0 are common, 3 are distinctive, and 1 is very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈3

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 1

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Must run before any other Firebase call (auth, Firestore, etc).

    line 29
  2. Distinctive:

    CRITICAL: before enforcing on a live product, monitor the Unverified Requests panel for at least a week to confirm 100% of legitimate …

    line 118
  3. Distinctive:

    Run the app once — it prints a debug token to the console

    line 139
  4. Very specific:

    Shipping __DEV__ debug providers to production: Always confirm __DEV__ is false in release builds — the bundler should strip the dev …

    line 152

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Firebase App Check

App Check verifies that incoming traffic to your Firebase services comes from your authentic, unmodified app — not a script, scraper, or repackaged binary. Without it, anyone with your Firebase web config (which ships in your client bundle) can hit your APIs.

Minimum viable example

import appCheck from "@react-native-firebase/app-check";

const provider = appCheck().newReactNativeFirebaseAppCheckProvider();
provider.configure({
  android: { provider: "playIntegrity" },
  apple:   { provider: "appAttestWithDeviceCheckFallback" },
});
await appCheck().initializeAppCheck({ provider, isTokenAutoRefreshEnabled: true });

Must run before any other Firebase call (auth, Firestore, etc). Then flip enforcement on per product in the Firebase Console — but monitor unverified traffic for a week first.

1. Register attestation providers

In Firebase Console → App Check → register each app:

PlatformProviderSetup
iOSApp Attest (iOS 14+)Automatic — just enable. Falls back to DeviceCheck on iOS < 14.
AndroidPlay IntegrityRequires the app's SHA-256 fingerprint in Firebase Console.
WebreCAPTCHA EnterpriseCreate a key in Google Cloud Console, paste site key into Firebase Console.

For Android: eas credentials shows your SHA-256 — paste into Firebase Console → Project Settings → your Android app → Add fingerprint, then App Check picks it up automatically.

2. Install client (Expo / RN)

npx expo install @react-native-firebase/app-check

app.json:

{
  "expo": {
    "plugins": [
      "@react-native-firebase/app",
      "@react-native-firebase/app-check"
    ]
  }
}

Initialize early, before any other Firebase call:

import { Platform } from "react-native";
import appCheck from "@react-native-firebase/app-check";

const provider = appCheck().newReactNativeFirebaseAppCheckProvider();
provider.configure({
  apple: {
    provider: __DEV__ ? "debug" : "appAttestWithDeviceCheckFallback",
    debugToken: process.env.EXPO_PUBLIC_APP_CHECK_DEBUG_TOKEN,
  },
  android: {
    provider: __DEV__ ? "debug" : "playIntegrity",
    debugToken: process.env.EXPO_PUBLIC_APP_CHECK_DEBUG_TOKEN,
  },
});

await appCheck().initializeAppCheck({
  provider,
  isTokenAutoRefreshEnabled: true,
});

3. Web setup

import { initializeAppCheck, ReCaptchaEnterpriseProvider } from "firebase/app-check";

if (typeof window !== "undefined") {
  initializeAppCheck(app, {
    provider: new ReCaptchaEnterpriseProvider(process.env.NEXT_PUBLIC_RECAPTCHA_SITE_KEY!),
    isTokenAutoRefreshEnabled: true,
  });
}

For local dev, set a debug token on the window before init:

if (process.env.NODE_ENV === "development") {
  (self as any).FIREBASE_APPCHECK_DEBUG_TOKEN = true; // logs a token to register in console
}

Copy the token from the browser console → Firebase Console → App Check → your app → Manage debug tokens.

4. Enforcement (the important step)

Registering App Check does nothing on its own. You must explicitly enforce it per product in the Firebase Console:

  • Cloud Firestore: App Check → Firestore → Enforce
  • Cloud Storage: App Check → Storage → Enforce
  • Realtime Database: App Check → RTDB → Enforce
  • Cloud Functions: per-function in code (see below)

CRITICAL: before enforcing on a live product, monitor the Unverified Requests panel for at least a week to confirm 100% of legitimate traffic is sending valid tokens. Enforcing prematurely blocks real users.

Enforcing on a callable Cloud Function

import { onCall, HttpsError } from "firebase-functions/v2/https";

export const sensitive = onCall({ enforceAppCheck: true }, (request) => {
  if (!request.app) {
    throw new HttpsError("failed-precondition", "App Check required");
  }
  // ... safe to proceed
});

request.app is the verified App Check token. With enforceAppCheck: true the function rejects unverified requests before your handler runs.

5. Debug tokens

For simulators, emulators, and CI, you cannot generate real attestation tokens. Set a debug token:

  1. Run the app once — it prints a debug token to the console
  2. Firebase Console → App Check → your app → Manage debug tokens → Add
  3. Paste the token, give it a name (e.g. "iOS Simulator")

Debug tokens look like real tokens to Firebase; rotate or delete them when team members leave. They bypass attestation.

For full debug token playbook (CI, team rotation, leak detection) see references/debug-tokens.md.

6. Common mistakes

  • Enforcing without monitoring first. Blocks every user who hasn't received an updated client with App Check wired. Always monitor unverified traffic for at least a week before flipping enforcement.
  • Initializing App Check after Firestore/Auth. Order matters — App Check must be initialized first so subsequent calls attach the token.
  • Forgetting Android SHA-256 fingerprints. Play Integrity fails silently if Firebase doesn't know your app signature. Add fingerprints for both debug and release certs.
  • Shipping __DEV__ debug providers to production. Always confirm __DEV__ is false in release builds — the bundler should strip the dev branch automatically, but verify by checking the bundle.
  • Treating App Check as authentication. It's attestation — it proves the app is legit, not who is using it. Pair with Firebase Auth for user identity.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.