استفاده از Firebase در برنامه های وب پویا با SSR (رندر سمت سرور)، استفاده از Firebase در برنامه های وب پویا با SSR (رندر سمت سرور)، استفاده از Firebase در برنامه های وب پویا با SSR (رندر سمت سرور)

اگر با Firebase JS SDK یا سایر SDK های کلاینت Firebase کار کرده باشید، احتمالاً با رابط FirebaseApp و نحوه استفاده از آن برای پیکربندی نمونه‌های برنامه آشنا هستید. برای تسهیل عملیات مشابه در سمت سرور، Firebase FirebaseServerApp را ارائه می‌دهد.

FirebaseServerApp نوعی از FirebaseApp برای استفاده در محیط‌های رندر سمت سرور (SSR) است. این برنامه شامل ابزارهایی برای ادامه جلسات Firebase است که فاصله رندر سمت کلاینت (CSR) / رندر سمت سرور را پوشش می‌دهد. این ابزارها و استراتژی‌ها می‌توانند به بهبود برنامه‌های وب پویا که با Firebase ساخته شده‌اند و در محیط‌های Google مانند Firebase App Hosting مستقر شده‌اند، کمک کنند.

از FirebaseServerApp برای موارد زیر استفاده کنید:

  • کد سمت سرور را در چارچوب کاربر اجرا می‌کند، برخلاف Firebase Admin SDK که دارای حقوق مدیریتی کامل است.
  • استفاده از App Check را در محیط‌های SSR فعال کنید.
  • ادامه دادن یک جلسه احراز هویت Firebase که در کلاینت ایجاد شده است.

چرخه حیات FirebaseServerApp

چارچوب‌های رندر سمت سرور (SSR) و سایر زمان‌های اجرای غیر مرورگر مانند کارگران ابری، با استفاده مجدد از منابع در چندین اجرا، زمان اولیه‌سازی را بهینه می‌کنند. FirebaseServerApp برای تطبیق با این محیط‌ها با استفاده از مکانیسم شمارش مرجع طراحی شده است. اگر یک برنامه initializeServerApp با پارامترهای مشابه initializeServerApp قبلی فراخوانی کند، همان نمونه FirebaseServerApp را که قبلاً مقداردهی اولیه شده است، دریافت می‌کند. این امر سربار اولیه‌سازی غیرضروری و تخصیص حافظه را کاهش می‌دهد. هنگامی که deleteApp روی یک نمونه FirebaseServerApp فراخوانی می‌شود، تعداد مرجع را کاهش می‌دهد و نمونه پس از رسیدن تعداد مرجع به صفر آزاد می‌شود.

پاکسازی نمونه‌های FirebaseServerApp

تشخیص زمان فراخوانی deleteApp روی یک نمونه FirebaseServerApp می‌تواند دشوار باشد، به خصوص اگر عملیات ناهمزمان زیادی را به صورت موازی اجرا می‌کنید. فیلد releaseOnDeref از FirebaseServerAppSettings به ساده‌سازی این امر کمک می‌کند. اگر به releaseOnDeref یک ارجاع به یک شیء با طول عمر دامنه درخواست (به عنوان مثال، شیء headers درخواست SSR) اختصاص دهید، FirebaseServerApp تعداد ارجاعات خود را هنگامی که چارچوب شیء header را پس می‌گیرد، کاهش می‌دهد. این کار به طور خودکار نمونه 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 با یک توکن Auth ID مقداردهی اولیه می‌شود، امکان پل زدن بین جلسات احراز هویت شده کاربر بین محیط‌های رندر سمت کلاینت (CSR) و رندر سمت سرور (SSR) را فراهم می‌کند. نمونه‌هایی از Firebase Auth SDK که با یک شیء FirebaseServerApp حاوی توکن Auth ID مقداردهی اولیه شده‌اند، بدون نیاز به اینکه برنامه هیچ روش ورود به سیستمی را فراخوانی کند، سعی می‌کنند کاربر را در هنگام مقداردهی اولیه وارد سیستم کنند.

ارائه یک توکن Auth ID به برنامه‌ها اجازه می‌دهد تا از هر یک از روش‌های ورود به سیستم 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.

استفاده از App Check در محیط‌های SSR

اجرای App Check به یک نمونه App Check SDK متکی است که Firebase SDK ها از آن برای فراخوانی داخلی getToken استفاده می‌کنند. توکن حاصل سپس در درخواست‌های ارسالی به همه سرویس‌های Firebase گنجانده می‌شود و به backend اجازه می‌دهد تا برنامه را اعتبارسنجی کند.

با این حال، از آنجا که App Check SDK برای دسترسی به روش‌های اکتشافی خاص برای اعتبارسنجی برنامه به یک مرورگر نیاز دارد، نمی‌توان آن را در محیط‌های سرور مقداردهی اولیه کرد.

FirebaseServerApp یک جایگزین ارائه می‌دهد. اگر یک توکن App Check تولید شده توسط کلاینت در طول مقداردهی اولیه FirebaseServerApp ارائه شود، توسط 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.

توکن‌های کلاینت را به مرحله رندر سمت سرور منتقل کنید

برای انتقال توکن‌های احراز هویت‌شده‌ی Auth ID (و توکن‌های App Check) از کلاینت به مرحله‌ی رندرینگ سمت سرور (SSR)، از یک سرویس ورکر استفاده کنید. این رویکرد شامل رهگیری درخواست‌های واکشی (fetch) که SSR را فعال می‌کنند و افزودن توکن‌ها به هدرهای درخواست است.

برای پیاده‌سازی مرجع یک سرویس‌دهنده Firebase Auth به مدیریت جلسه با سرویس‌کارها مراجعه کنید. همچنین برای کدی که نحوه تجزیه این توکن‌ها از هدرها را برای استفاده در مقداردهی اولیه FirebaseServerApp نشان می‌دهد ، به تغییرات سمت سرور مراجعه کنید.