Zum Inhalt

Firebase Security Rules & Cloud Functions

Wichtige Unterscheidung

🔒 Security Rules gelten für:

  • Client Apps (Web, iOS, Android)
  • Direkte Firebase SDK Zugriffe
  • Firestore REST API (mit User-Authentifizierung)

🔓 Security Rules gelten NICHT für:

  • Cloud Functions (nutzen Admin SDK)
  • Firebase Admin SDK (Server-seitig)
  • Service Accounts

Wie Cloud Functions auf Firestore zugreifen

❌ FALSCH - Client SDK (unterliegt Security Rules)

// In Client-Apps - WIRD von Security Rules geprüft
import { getFirestore } from 'firebase/firestore';

const db = getFirestore();
await db.collection('orders').add({...}); // ← Unterliegt Security Rules

✅ RICHTIG - Admin SDK in Cloud Functions (umgeht Security Rules)

// In Cloud Functions - UMGEHT Security Rules
const admin = require('firebase-admin');
admin.initializeApp();

const db = admin.firestore();
await db.collection('orders').add({...}); // ← Voller Admin-Zugriff!

Deine Functions nutzen Admin SDK

Schaue in /functions/index.js:

const admin = require('firebase-admin');
admin.initializeApp();

// Diese Zeile gibt deinen Functions VOLLEN Zugriff
const db = admin.firestore();

Bedeutung: - Deine Cloud Functions können IMMER auf Firestore zugreifen - Auch wenn Security Rules allow read, write: if false; haben - Auch wenn keine Authentifizierung vorhanden ist

Beispiel: Statistik-Berechnung

// functions/internal_statistic_calculation.js
const admin = require('firebase-admin');
const db = admin.firestore();

// Cloud Function schreibt Statistiken
exports.calculateStatistics = functions.pubsub
  .schedule('every 24 hours')
  .onRun(async (context) => {
    // ✅ Funktioniert IMMER - auch wenn Security Rules
    //    für normale User "write: if false" haben
    await db.collection('articleSalesStatistics').doc('today').set({
      totalSales: 1000,
      calculatedAt: admin.firestore.FieldValue.serverTimestamp()
    });
  });

Security Rules:

match /articleSalesStatistics/{statId} {
  allow read: if isAuthenticated();
  allow write: if false;  // ← Normale User können NICHT schreiben
  // Aber Cloud Functions KÖNNEN trotzdem schreiben!
}

Best Practices für Production

1. Statistics Collections - Nur Functions schreiben

match /articleSalesStatistics/{statId} {
  allow read: if isAuthenticated();
  allow write: if false;  // Nur Cloud Functions (Admin SDK) können schreiben
}

2. Orders - User können erstellen, Functions können alles

match /orders/{orderId} {
  allow read: if isAuthenticated();
  allow create: if isAuthenticated();
  allow update: if isAuthenticated() && 
                (!resource.data.keys().hasAny(['sourceSystem']));
  allow delete: if false;  // Nur Cloud Functions können löschen
}

3. Audit Logs - Nur Functions schreiben

match /auditLogs/{logId} {
  allow read: if request.auth != null && 
              request.auth.token.admin == true;  // Nur Admins
  allow write: if false;  // Nur Cloud Functions
}

Wie testest du das?

1. Security Rules testen (Client-Perspektive)

# Emulator starten
firebase emulators:start --only firestore

# In deiner App testen
# Sollte FEHLSCHLAGEN wenn Rules es verbieten

2. Cloud Function testen

# Function lokal ausführen
firebase emulators:start --only functions,firestore

# Function aufrufen
# Sollte FUNKTIONIEREN auch wenn Rules es verbieten

Zusammenfassung

Zugriff über Security Rules Beispiel
Flutter App ✅ Ja FirebaseFirestore.instance.collection('orders')
Web App ✅ Ja getFirestore().collection('orders')
Cloud Function ❌ Nein admin.firestore().collection('orders')
Admin SDK (Server) ❌ Nein admin.firestore()
REST API (mit Auth) ✅ Ja https://firestore.googleapis.com/v1/...

Merke: - Wenn admin.firestore() → Voller Zugriff, Rules egal - Wenn Firebase SDK → Security Rules gelten - Cloud Functions = Vertrauenswürdiger Server-Code = Voller Zugriff