استفاده از 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 Auth که در کلاینت ایجاد شده است را ادامه دهید.

چرخه عمر 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 با یک نشانه Auth ID راه اندازی می شود، پل زدن جلسات کاربر تأیید شده بین محیط های رندر سمت کلاینت (CSR) و رندر سمت سرور (SSR) را امکان پذیر می کند. نمونه‌هایی از Firebase Auth SDK که با یک شی FirebaseServerApp حاوی یک نشانه Auth ID راه‌اندازی شده‌اند، بدون نیاز به استفاده از روش‌های ورود به سیستم، سعی می‌کنند کاربر را در زمان اولیه وارد کنند.

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

اجرای بررسی برنامه متکی به یک نمونه SDK بررسی برنامه است که SDKهای Firebase از آن برای فراخوانی داخلی getToken استفاده می کنند. سپس توکن به دست آمده در درخواست‌های تمام سرویس‌های Firebase گنجانده می‌شود و به Backend اجازه می‌دهد تا برنامه را تأیید کند.

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

FirebaseServerApp یک جایگزین ارائه می دهد. اگر یک کد App Check تولید شده توسط سرویس گیرنده در طول اولیه سازی FirebaseServerApp ارائه شود، در هنگام فراخوانی خدمات Firebase توسط SDK های محصول 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)، از یک سرویس‌کار استفاده کنید. این رویکرد شامل رهگیری درخواست‌های واکشی است که SSR را راه‌اندازی می‌کنند و توکن‌ها را به سربرگ‌های درخواست اضافه می‌کنند.

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