שימוש ב-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) וזמני ריצה אחרים שאינם דפדפנים, כמו cloud workers, מבצעים אופטימיזציה של זמן האתחול על ידי שימוש חוזר במשאבים בכמה הפעלות. ‫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 מאפשרת לאפליקציות להשתמש בכל שיטות הכניסה של 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, וכך הקצה העורפי יכול לאמת את האפליקציה.

עם זאת, ערכת ה-SDK של App Check צריכה דפדפן כדי לגשת להיוריסטיקות ספציפיות לאימות אפליקציות, ולכן אי אפשר לאתחל אותה בסביבות שרת.

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.

העברת טוקנים של לקוחות לשלב העיבוד בצד השרת

כדי להעביר אסימונים מאומתים של מזהה אימות (ואסימונים של App Check) מהלקוח לשלב של עיבוד בצד השרת (SSR), צריך להשתמש ב-service worker. הגישה הזו כוללת יירוט של בקשות אחזור שמפעילות SSR והוספה של הטוקנים לכותרות הבקשה.

במאמר ניהול סשנים באמצעות Service Workers מופיעה הטמעה לדוגמה של Service Worker של Firebase Auth. במאמר בנושא שינויים בצד השרת מופיע קוד שמדגים איך לנתח את הטוקנים האלה מהכותרות לשימוש בFirebaseServerApp אתחול.