Korzystanie z Firebase w dynamicznych aplikacjach internetowych z renderowaniem po stronie serwera

Jeśli korzystasz z pakietu SDK Firebase JS lub innego pakietu SDK klienta Firebase, prawdopodobnie znasz interfejs FirebaseApp i wiesz, jak go używać do konfigurowania instancji aplikacji. Aby ułatwić podobne operacje po stronie serwera, Firebase udostępnia funkcję FirebaseServerApp.

FirebaseServerApp to wariant FirebaseApp przeznaczony do użytku w środowiskach renderowania po stronie serwera (SSR). Zawiera ona narzędzia do kontynuowania sesji Firebase, które obejmują renderowanie po stronie klienta (CSR) i renderowanie po stronie serwera. Te narzędzia i strategie mogą pomóc w ulepszaniu dynamicznych aplikacji internetowych utworzonych za pomocą Firebase i wdrożonych w środowiskach Google, takich jak Firebase App Hosting.

Korzystaj z FirebaseServerApp, aby:

  • Wykonywanie kodu po stronie serwera w kontekście użytkownika, w przeciwieństwie do pakietu Firebase Admin SDK, który ma pełne uprawnienia administracyjne.
  • Włącz użycie Sprawdzania aplikacji w środowiskach SSR.
  • kontynuować sesję uwierzytelniania Firebase utworzoną w kliencie;

Cykl życia klasy FirebaseServerApp

Ramy renderowania po stronie serwera (SSR) i inne środowisko uruchomieniowe poza przeglądarką, takie jak workery w chmurze, optymalizują czas inicjowania, wykorzystując ponownie zasoby w wielu wykonaniach. Funkcja FirebaseServerApp została zaprojektowana z myślą o tych środowiskach i wykorzystuje mechanizm zliczania odwołań. Jeśli aplikacja wywołuje initializeServerApp z tymi samymi parametrami co poprzednio, initializeServerApp otrzymuje tę samą instancję FirebaseServerApp, która została już zainicjowana. Pozwala to ograniczyć niepotrzebne obciążenie związane z inicjalizacją i alokacją pamięci. Gdy wywołana zostanie funkcja deleteApp w instancji FirebaseServerApp, zmniejsza ona liczbę odwołań, a po osiągnięciu przez tę liczbę wartości 0 instancja jest uwalniana.

Czyszczenie instancji FirebaseServerApp

Trudno jest określić, kiedy wywołać metodę deleteApp instancji FirebaseServerApp, zwłaszcza jeśli wykonujesz wiele operacji asynchronicznych równolegle. Pole releaseOnDeref w sekcji FirebaseServerAppSettings ułatwia to zadanie. Jeśli przypiszesz releaseOnDeref odwołanie do obiektu o żywotności ograniczonej do zakresu żądania (np. obiekt nagłówków żądania SSR), FirebaseServerApp zmniejszy liczbę odwołań, gdy framework odzyska obiekt nagłówka. Spowoduje to automatyczne wyczyszczenie instancji FirebaseServerApp.

Oto przykład użycia właściwości 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);
  ...
}

wznowić uwierzytelnione sesje utworzone na kliencie;

Gdy instancja FirebaseServerApp jest inicjowana za pomocą tokena identyfikatora uwierzytelniania, umożliwia połączenie sesji uwierzytelnionych użytkowników między środowiskami renderowania po stronie klienta (CSR) i renderowania po stronie serwera (SSR). Wystąpienia pakietu SDK Uwierzytelniania Firebase zainicjowane za pomocą obiektu FirebaseServerApp zawierającego token tożsamości uwierzytelniania będą próbowały zalogować użytkownika podczas inicjowania bez konieczności wywoływania przez aplikację żadnych metod logowania.

Podanie tokenu identyfikatora autoryzacji umożliwia aplikacjom korzystanie z dowolnych metod logowania Auth na kliencie, co zapewnia kontynuację sesji po stronie serwera nawet w przypadku metod logowania, które wymagają interakcji użytkownika. Dodatkowo umożliwia przeniesienie na serwer operacji intensywnych, takich jak uwierzytelnione zapytania do Firehose, co powinno poprawić wydajność renderowania aplikacji.

/// 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.

Używanie App Check w środowiskach SSR

Egzekwowanie Sprawdzania aplikacji zależy od wystąpienia pakietu SDK Sprawdzania aplikacji, którego pakiety SDK Firebase używają do wywoływania getToken. Uzyskany token jest następnie dołączany do żądań do wszystkich usług Firebase, co umożliwia backendowi weryfikację aplikacji.

Pakiet SDK App Check wymaga jednak przeglądarki, aby uzyskać dostęp do określonych heurystycznych metod weryfikacji aplikacji, więc nie można go zainicjować w środowiskach serwera.

FirebaseServerApp zawiera alternatywę. Jeśli podczas inicjowania pakietu FirebaseServerApp zostanie podany wygenerowany przez klienta token Sprawdzania aplikacji, będzie on używany przez pakiety SDK usług Firebase podczas wywoływania usług Firebase, co eliminuje potrzebę tworzenia instancji pakietu SDK Sprawdzania aplikacji.

/// 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.

Przekazywanie tokenów klienta do fazy renderowania po stronie serwera

Aby przesyłać uwierzytelnione tokeny identyfikatora uwierzytelniania (i tokeny App Check) z klienta do fazy renderowania po stronie serwera (SSR), użyj serwisu workera. Polega ono na przechwytywaniu żądań pobierania, które wywołują SSR, i dodawaniu tokenów do nagłówków żądań.

Aby zapoznać się z implementacją usługi Firebase Auth na potrzeby zarządzania sesjami, zapoznaj się z artykułem Zarządzanie sesjami za pomocą usług workerów. Zapoznaj się też z zmianami po stronie serwera, aby zobaczyć kod, który pokazuje, jak parsować te tokeny z nagłówków na potrzeby inicjalizacji FirebaseServerApp.