Si trabajaste con el SDK de Firebase JS o con otros SDK de cliente de Firebase, es probable que conozcas la interfaz FirebaseApp
y cómo usarla para configurar instancias de apps. Para facilitar operaciones similares en el servidor, Firebase proporciona FirebaseServerApp
.
FirebaseServerApp
es una variante de FirebaseApp
para usar en entornos de renderización del servidor (SSR). Incluye herramientas para continuar las sesiones de Firebase que abarcan la división entre la renderización del cliente (CSR) y la renderización del servidor. Estas herramientas y estrategias pueden ayudar a mejorar las apps web dinámicas compiladas con Firebase y que se implementan en entornos de Google, como Firebase App Hosting.
Utiliza FirebaseServerApp
para:
- Ejecutar código del servidor en el contexto del usuario, a diferencia del SDK de Firebase Admin, que tiene derechos de administración completos
- Habilitar el uso de la Verificación de aplicaciones en entornos de SSR
- Continuar una sesión de Firebase Auth que se creó en el cliente
Ciclo de vida de FirebaseServerApp
Los frameworks de renderización del servidor (SSR) y otros entornos de ejecución que no son de navegador, como los trabajadores de la nube, optimizan el tiempo de inicialización reutilizando recursos en varias ejecuciones. FirebaseServerApp
está diseñado para adaptarse a estos entornos a través de un mecanismo de recuento de referencias. Si una app invoca a initializeServerApp
con los mismos parámetros que una initializeServerApp
anterior, recibe la misma instancia de FirebaseServerApp
que ya se inicializó. Esto reduce la sobrecarga de inicialización y las asignaciones de memoria innecesarias. Cuando se invoca deleteApp
en una instancia de FirebaseServerApp
, se reduce el recuento de referencias y la instancia se libera después de que el recuento de referencias llega a cero.
Limpia las instancias de FirebaseServerApp
Puede ser complicado saber cuándo llamar a deleteApp
en una instancia de FirebaseServerApp
, en especial si ejecutas muchas operaciones asíncronas en paralelo. El campo releaseOnDeref
de FirebaseServerAppSettings
ayuda a simplificar esto. Si asignas a releaseOnDeref
una referencia a un objeto con la duración del alcance de la solicitud (por ejemplo, el objeto de encabezados de la solicitud de SSR), FirebaseServerApp
reducirá su recuento de referencias cuando el framework reclame el objeto de encabezado. Esto limpia automáticamente tu instancia de FirebaseServerApp
.
A continuación, se muestra un ejemplo de uso de 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);
...
}
Reanuda sesiones autenticadas creadas en el cliente
Cuando se inicializa una instancia de FirebaseServerApp
con un token de ID de Auth, permite establecer una conexión entre las sesiones de usuario autenticadas entre los entornos de renderización del cliente (CSR) y de renderización del servidor (SSR). Las instancias del SDK de Firebase Auth inicializadas con un objeto FirebaseServerApp
que contiene un token de ID de Auth intentarán que el usuario acceda durante la inicialización sin que la aplicación invoque ningún método de acceso.
Proporcionar un token de ID de Auth permite que las apps usen cualquiera de los métodos de acceso de Auth en el cliente, lo que garantiza que la sesión continúe en el servidor, incluso para aquellos métodos de acceso que requieren interacción del usuario. Además, permite la transferencia de operaciones intensivas al servidor, como las consultas de Firestore autenticadas, lo que debería mejorar el rendimiento de renderización de tu app.
/// 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.
Usa la Verificación de aplicaciones en entornos de SSR
La Verificación de aplicaciones depende de una instancia del SDK de Verificación de aplicaciones que los SDK de Firebase usan para llamar a getToken
de forma interna. Luego, el token resultante se incluye en las solicitudes a todos los servicios de Firebase, lo que permite que el backend valide la app.
Sin embargo, como el SDK de Verificación de aplicaciones necesita un navegador para acceder a heurísticas específicas para la validación de apps, no se puede inicializar en entornos de servidor.
FirebaseServerApp
proporciona una alternativa. Si se proporciona un token de Verificación de aplicaciones generado por el cliente durante la inicialización de FirebaseServerApp
, los SDK de productos de Firebase lo usarán cuando invoquen los servicios de Firebase, lo que elimina la necesidad de una instancia del SDK de la Verificación de aplicaciones.
/// 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.
Pasa tokens de cliente a la fase de renderización del servidor
Para transmitir tokens de ID de Auth autenticados (y tokens de Verificación de aplicaciones) del cliente a la fase de renderización del servidor (SSR), usa un service worker. Este enfoque implica interceptar las solicitudes de recuperación que activan el SSR y anexar los tokens a los encabezados de la solicitud.
Consulta Administración de sesiones con service workers para obtener una implementación de referencia de un service worker de Firebase Auth. Consulta también Cambios del servidor para ver el código que muestra cómo analizar estos tokens de los encabezados para usarlos en la inicialización de FirebaseServerApp
.