Если вы работали с Firebase JS SDK или другими клиентскими SDK Firebase, вы, вероятно, знакомы с интерфейсом FirebaseApp
и тем, как его использовать для настройки экземпляров приложения. Для облегчения подобных операций на стороне сервера Firebase предоставляет FirebaseServerApp
.
FirebaseServerApp
— это вариант FirebaseApp
для использования в средах серверного рендеринга (SSR). Он включает в себя инструменты для продолжения сеансов Firebase, которые охватывают разделение рендеринга на стороне клиента (CSR) и рендеринга на стороне сервера. Эти инструменты и стратегии могут помочь улучшить динамические веб-приложения, созданные с помощью Firebase и развернутые в средах Google, таких как Firebase App Hosting .
Используйте FirebaseServerApp
, чтобы:
- Выполняйте серверный код в контексте пользователя , в отличие от Firebase Admin SDK, который имеет полные права администрирования.
- Включите использование проверки приложений в средах SSR.
- Продолжите сеанс аутентификации Firebase, созданный в клиенте.
Жизненный цикл FirebaseServerApp
Платформы серверного рендеринга (SSR) и другие среды выполнения, не связанные с браузером, такие как облачные работники, оптимизируют время инициализации за счет повторного использования ресурсов при нескольких выполнениях. FirebaseServerApp
предназначен для работы в этих средах с использованием механизма подсчета ссылок. Если приложение вызывает initializeServerApp
с теми же параметрами, что и предыдущий метод initializeServerApp
, оно получает тот же экземпляр FirebaseServerApp
, который уже был инициализирован. Это сокращает ненужные накладные расходы на инициализацию и выделение памяти. Когда deleteApp
вызывается в экземпляре FirebaseServerApp
, он уменьшает счетчик ссылок, и экземпляр освобождается после того, как счетчик ссылок достигает нуля.
Очистка экземпляров FirebaseServerApp
Может быть сложно определить, когда вызывать deleteApp
в экземпляре FirebaseServerApp
, особенно если вы параллельно выполняете множество асинхронных операций. Поле releaseOnDeref
в FirebaseServerAppSettings
помогает упростить это. Если вы назначите releaseOnDeref
ссылку на объект с продолжительностью жизни области запроса (например, объект заголовков запроса SSR), FirebaseServerApp
уменьшит количество ссылок, когда платформа восстановит объект заголовка. Это автоматически очистит ваш экземпляр FirebaseServerApp
.
Вот пример использования 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);
...
}
Возобновить сеансы с аутентификацией, созданные на клиенте.
Когда экземпляр FirebaseServerApp
инициализируется с помощью токена идентификатора аутентификации, он обеспечивает соединение аутентифицированных пользовательских сеансов между средами рендеринга на стороне клиента (CSR) и рендеринга на стороне сервера (SSR). Экземпляры Firebase Auth SDK, инициализированные с помощью объекта FirebaseServerApp
, содержащего токен идентификатора аутентификации, будут пытаться войти в систему пользователя при инициализации без необходимости вызова приложения каких-либо методов входа.
Предоставление токена идентификатора аутентификации позволяет приложениям использовать любые методы входа Auth на клиенте, гарантируя продолжение сеанса на стороне сервера, даже для тех методов входа, которые требуют взаимодействия с пользователем. Кроме того, он позволяет переносить на сервер интенсивные операции, такие как аутентифицированные запросы Firestore, что должно улучшить производительность рендеринга вашего приложения.
/// 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.
Используйте проверку приложений в средах SSR
Принудительная проверка приложений зависит от экземпляра App Check SDK, который SDK Firebase использует для внутреннего вызова getToken
. Полученный токен затем включается в запросы ко всем сервисам Firebase, позволяя серверной части проверять приложение.
Однако, поскольку пакету App Check SDK требуется браузер для доступа к определенным эвристикам для проверки приложения, его нельзя инициализировать в серверных средах.
FirebaseServerApp
предоставляет альтернативу. Если во время инициализации FirebaseServerApp
предоставляется сгенерированный клиентом токен App Check, он будет использоваться SDK продукта Firebase при вызове сервисов Firebase, что устраняет необходимость в экземпляре App Check SDK.
/// 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.
Передача клиентских токенов на этап рендеринга на стороне сервера.
Чтобы передать аутентифицированные токены идентификатора аутентификации (и токены проверки приложений) от клиента на этап рендеринга на стороне сервера (SSR), используйте Service Worker. Этот подход предполагает перехват запросов на выборку, которые запускают SSR, и добавление токенов в заголовки запросов.
См. раздел «Управление сеансами с сервисными работниками», где приведена эталонная реализация сервисного работника Firebase Auth. Также см. «Изменения на стороне сервера» для кода, который демонстрирует, как анализировать эти токены из заголовков для использования при инициализации FirebaseServerApp
.