Firebase in dynamischen Webanwendungen mit SSR (serverseitiges Rendering) verwenden

Wenn Sie bereits mit dem Firebase JS SDK oder anderen Firebase-Client-SDKs gearbeitet haben, kennen Sie wahrscheinlich die FirebaseApp Schnittstelle und wissen, wie Sie damit App-Instanzen konfigurieren. Um ähnliche Vorgänge auf dem Server auszuführen, Firebase bietet FirebaseServerApp.

FirebaseServerApp ist eine Variante von FirebaseApp für die Verwendung in serverseitigen Rendering-Umgebungen (SSR). Es enthält Tools, um Firebase-Sitzungen fortzusetzen, die die Grenze zwischen clientseitigem Rendering (CSR) und serverseitigem Rendering überschreiten. Diese Tools und Strategien können dazu beitragen, dynamische Web-Apps zu verbessern, die mit Firebase erstellt und in Google-Umgebungen wie Firebase App Hostingbereitgestellt werden.

Verwenden Sie FirebaseServerApp für folgende Zwecke:

  • Serverseitigen Code im Kontext des Nutzers ausführen, im Gegensatz zum Firebase Admin SDK, das vollständige Administratorrechte hat.
  • Die Verwendung von App Check in SSR-Umgebungen aktivieren.
  • Eine Firebase Auth-Sitzung fortsetzen, die auf dem Client erstellt wurde.

Der Lebenszyklus von FirebaseServerApp

Frameworks für das serverseitige Rendering (SSR) und andere Nicht-Browser-Laufzeiten wie Cloud-Worker optimieren die Initialisierungszeit, indem sie Ressourcen bei mehreren Ausführungen wiederverwenden. FirebaseServerApp ist für diese Umgebungen konzipiert und verwendet einen Mechanismus zur Referenzzählung. Wenn eine App initializeServerApp mit denselben Parametern wie ein vorheriges initializeServerApp aufruft, erhält sie dieselbe FirebaseServerApp Instanz, die bereits initialisiert wurde. Dadurch werden unnötiger Initialisierungsaufwand und Speicherzuweisungen reduziert. Wenn deleteApp für eine FirebaseServerApp Instanz aufgerufen wird, wird die Referenzzählung verringert. Die Instanz wird freigegeben, nachdem die Referenzzählung null erreicht hat.

FirebaseServerApp-Instanzen bereinigen

Es kann schwierig sein, zu wissen, wann deleteApp für eine FirebaseServerApp Instanz aufgerufen werden muss, insbesondere wenn viele asynchrone Vorgänge parallel ausgeführt werden. Das Feld releaseOnDeref der FirebaseServerAppSettings kann dies vereinfachen. Wenn Sie releaseOnDeref eine Referenz zu einem Objekt mit der Lebensdauer des Anfragengeltungsbereichs zuweisen (z. B. das Headerobjekt der SSR Anfrage), verringert FirebaseServerApp die Referenzzählung, wenn das Framework das Headerobjekt freigibt. Dadurch wird Ihre FirebaseServerApp Instanz automatisch bereinigt.

Hier ein Beispiel für die Verwendung von releaseOnDeref:

/// Next.js
import { headers } from 'next/headers'
import { FirebaseServerAppSettings, initializeServerApp} from "firebase/app";

export default async function Page() {
  const headersObj = await headers();
  let appSettings: FirebaseServerAppSettings = {};
  appSettings.releaseOnDeref = headersObj;
  const serverApp = initializeServerApp(firebaseConfig, appSettings);
  ...
}

Authentifizierte Sitzungen fortsetzen, die auf dem Client erstellt wurden

Wenn eine Instanz von FirebaseServerApp mit einem Auth-ID-Token initialisiert wird, können authentifizierte Nutzersitzungen zwischen den Umgebungen für das clientseitige Rendering (CSR) und das serverseitige Rendering (SSR) überbrückt werden. Instanzen des Firebase Auth SDK, die mit einem FirebaseServerApp Objekt initialisiert wurden, das ein Auth-ID-Token enthält, versuchen, den Nutzer bei der Initialisierung anzumelden, ohne dass die Anwendung Anmeldemethoden aufrufen muss.

Durch die Bereitstellung eines Auth-ID-Tokens können Apps alle Anmeldemethoden von Auth auf dem Client verwenden. So wird sichergestellt, dass die Sitzung auf dem Server fortgesetzt wird, auch bei Anmeldemethoden, die eine Nutzerinteraktion erfordern. Außerdem können so ressourcenintensive Vorgänge wie authentifizierte Firestore-Abfragen auf den Server ausgelagert werden, was die Rendering-Leistung Ihrer App verbessern sollte.

/// Next.js
import { initializeServerApp } from "firebase/app";
import { getAuth } from "firebase/auth";

// Replace the following with your app's
// Firebase project configuration
const firebaseConfig = {
  // ...
};

const firebaseServerAppSettings = {
  authIdToken: token  // See "Pass client tokens to the server side
                      // rendering phase" for an example on how transmit
                      // the token from the client and the server.
}

const serverApp =
  initializeServerApp(firebaseConfig,
                      firebaseServerAppSettings);
const serverAuth = getAuth(serverApp);

// FirebaseServerApp and Auth will now attempt
// to sign in the current user based on provided
// authIdToken.

App Check in SSR-Umgebungen verwenden

Die App Check-Erzwingung basiert auf einer App Check SDK-Instanz, die von Firebase SDKs verwendet wird um intern getToken aufzurufen. Das resultierende Token ist dann in Anfragen an alle Firebase-Dienste enthalten, sodass das Backend die App validieren kann.

Da das App Check SDK jedoch einen Browser benötigt, um auf bestimmte Heuristiken für die App-Validierung zuzugreifen, kann es nicht in Serverumgebungen initialisiert werden.

FirebaseServerApp bietet eine Alternative. Wenn bei der Initialisierung von FirebaseServerApp ein vom Client generiertes App Check Token bereitgestellt wird, wird es von den Firebase-Produkt-SDKs beim Aufrufen von Firebase-Diensten verwendet. Eine App Check SDK-Instanz ist dann nicht erforderlich.

/// Next.js
import { initializeServerApp } from "firebase/app";

// Replace the following with your app's
// Firebase project configuration
const firebaseConfig = {
  // ...
};

const firebaseServerAppSettings = {
  appCheckToken: token // See "Pass client tokens to the server side
                       // rendering phase" for an example on how transmit
                       // the token from the client and the server.
}

const serverApp =
  initializeServerApp(firebaseConfig,
                      firebaseServerAppSettings);

// The App Check token will now be appended to all Firebase service requests.

Client-Tokens an die serverseitige Renderingphase übergeben

Verwenden Sie einen Service Worker, um authentifizierte Auth-ID-Tokens (und App Check-Tokens) vom Client an die serverseitige Renderingphase (SSR) zu übertragen. Dabei werden Fetch-Anfragen abgefangen, die SSR auslösen, und die Tokens werden an die Anfrageheader angehängt.

Eine Referenzimplementierung eines Firebase Auth-Service Workers finden Sie unter Sitzungsverwaltung mit Service Workern. Unter Serverseitige Änderungen finden Sie Code, der zeigt, wie diese Tokens aus den Headern geparst werden, um sie bei der Initialisierung von FirebaseServerApp zu verwenden.