Wenn Sie bereits mit dem Firebase JS SDK oder anderen Firebase-Client-SDKs gearbeitet haben, sind Sie wahrscheinlich mit der FirebaseApp
-Benutzeroberfläche und der Konfiguration von App-Instanzen vertraut. Für ähnliche Vorgänge auf der Serverseite bietet Firebase FirebaseServerApp
.
FirebaseServerApp
ist eine Variante von FirebaseApp
für die Verwendung in serverseitigen Rendering-Umgebungen (SSR). Es enthält Tools, mit denen Firebase-Sitzungen fortgesetzt werden können, die das clientseitige Rendering (CSR) und das serverseitige Rendering (SSR) umfassen. Mit diesen Tools und Strategien lassen sich dynamische Webanwendungen optimieren, die mit Firebase erstellt und in Google-Umgebungen wie Firebase App Hosting bereitgestellt werden.
Funktionen von FirebaseServerApp
:
- Serverseitigen Code im Kontext des Nutzers ausführen, im Gegensatz zum Firebase Admin SDK, das volle Administratorrechte hat.
- Aktivieren Sie die Verwendung von App Check in SSR-Umgebungen.
- Eine Firebase Auth-Sitzung fortsetzen, die auf dem Client erstellt wurde.
Lebenszyklus von FirebaseServerApp
Server-Side-Rendering-Frameworks (SSR) und andere nicht browserbasierte Laufzeiten wie Cloud-Worker optimieren die Initialisierungszeit, indem Ressourcen für mehrere Ausführungen wiederverwendet werden. FirebaseServerApp
ist für diese Umgebungen konzipiert und verwendet einen Referenzzählmechanismus. Wenn eine App initializeServerApp
mit denselben Parametern wie eine vorherige initializeServerApp
aufruft, wird dieselbe FirebaseServerApp
-Instanz zurückgegeben, die bereits initialisiert wurde. Dadurch wird der unnötige Initialisierungsaufwand und die Arbeitsspeicherzuweisung reduziert. Wenn deleteApp
auf einer FirebaseServerApp
-Instanz aufgerufen wird, wird die Referenzanzahl verringert und die Instanz wird freigegeben, sobald die Referenzanzahl null erreicht.
FirebaseServerApp
-Instanzen bereinigen
Es kann schwierig sein zu wissen, wann deleteApp
für eine FirebaseServerApp
-Instanz aufgerufen werden soll, insbesondere wenn viele asynchrone Vorgänge parallel ausgeführt werden. Das Feld releaseOnDeref
des FirebaseServerAppSettings
vereinfacht das. Wenn du releaseOnDeref
eine Referenz auf ein Objekt mit der Lebensdauer des Gültigkeitsbereichs der Anfrage zuweist (z. B. das Headers-Objekt der SSR-Anfrage), reduziert FirebaseServerApp
die Anzahl der Referenzen, wenn das Framework das Header-Objekt zurückfordert. 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();
appSettings.releaseOnDeref = headersObj;
let appSettings: FirebaseServerAppSettings = {};
const serverApp = initializeServerApp(firebaseConfig, appSettings);
...
}
Authentifizierte Sitzungen, die auf dem Client erstellt wurden, fortsetzen
Wenn eine Instanz von FirebaseServerApp
mit einem Auth-ID-Token initialisiert wird, können authentifizierte Nutzersitzungen zwischen den Umgebungen für clientseitiges Rendering (CSR) und serverseitiges Rendering (SSR) verbunden werden. Instanzen des Firebase Auth SDK, die mit einem FirebaseServerApp
-Objekt mit einem Authentifizierungs-ID-Token initialisiert werden, versuchen, den Nutzer bei der Initialisierung anzumelden, ohne dass die Anwendung Anmeldemethoden aufrufen muss.
Wenn Sie ein Auth-ID-Token angeben, können Apps alle Auth-Anmeldemethoden auf dem Client verwenden. So wird sichergestellt, dass die Sitzung auch bei Anmeldemethoden, die eine Nutzerinteraktion erfordern, auf der Serverseite fortgesetzt wird. Außerdem können Sie intensive Vorgänge wie authentifizierte Firestore-Abfragen auf den Server auslagern, was die Renderingleistung 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-Durchsetzung basiert auf einer App Check SDK-Instanz, die Firebase SDKs verwenden, um getToken
intern aufzurufen. Das resultierende Token wird dann in Anfragen an alle Firebase-Dienste eingeschlossen, 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 FirebaseServerApp
-Initialisierung ein clientgeneriertes App Check-Token angegeben 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 Phase des serverseitigen Renderings übergeben
Verwenden Sie einen Dienst-Worker, um authentifizierte Authentifizierungs-ID-Tokens (und App Check-Tokens) vom Client an die Phase des serverseitigen Renderings (SSR) zu übertragen. Bei diesem Ansatz werden Abrufanfragen abgefangen, die SSR auslösen, und die Tokens an die Anfrageheader angehängt.
Eine Referenzimplementierung eines Firebase Auth-Dienstarbeiters finden Sie unter Sitzungsverwaltung mit Service Workern. Unter Serverseitige Änderungen findest du Code, der zeigt, wie diese Tokens aus den Headern für die FirebaseServerApp
-Initialisierung geparst werden.