אם כבר עבדתם עם Firebase JS SDK או עם ערכות SDK אחרות של לקוחות Firebase, סביר להניח שאתם מכירים את הממשק FirebaseApp
ואת האופן שבו משתמשים בו כדי להגדיר מכונות של אפליקציות. כדי להקל על פעולות דומות בצד השרת, Firebase מספקת את FirebaseServerApp
.
FirebaseServerApp
הוא וריאנט של FirebaseApp
לשימוש בסביבות של עיבוד בצד השרת (SSR). הוא כולל כלים להמשך סשנים ב-Firebase שמתפרסים על פני הגבול בין רינדור בצד הלקוח (CSR) לבין רינדור בצד השרת. הכלים והאסטרטגיות האלה יכולים לעזור לשפר אפליקציות אינטרנט דינמיות שנוצרו באמצעות Firebase ופורסמו בסביבות של Google, כמו Firebase App Hosting.
השתמש בFirebaseServerApp
כדי:
- להריץ קוד בצד השרת בהקשר של המשתמש, בניגוד ל-SDK של Firebase Admin שיש לו הרשאות ניהול מלאות.
- הפעלת השימוש ב-App Check בסביבות 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
מופעלת באמצעות אסימון Auth ID, היא מאפשרת לבצע קישור בין סשנים של משתמשים מאומתים בין סביבות הרינדור בצד הלקוח (CSR) לבין סביבות הרינדור בצד השרת (SSR). מכונות של Firebase Auth SDK שמאותחלות באמצעות אובייקט FirebaseServerApp
שמכיל אסימון מזהה אימות ינסו להיכנס באמצעות המשתמש בזמן האתחול, בלי שהאפליקציה תצטרך להפעיל שיטות כניסה.
הצגת אסימון 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 שערכות ה-SDK של Firebase משתמשות בו כדי לבצע קריאה פנימית ל-getToken
. לאחר מכן, הטוקן שנוצר נכלל בבקשות לכל שירותי Firebase, ומאפשר לקצה העורפי לאמת את האפליקציה.
עם זאת, מכיוון ש-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 (עיבוד בצד השרת), צריך להשתמש ב-service worker. הגישה הזו כוללת תיעוד של בקשות אחזור שמפעילות SSR והוספת האסימונים לכותרות הבקשה.
במאמר ניהול סשנים באמצעות שירותי עבודה מופיעה הטמעה לדוגמה של שירות עבודה של אימות Firebase. כדאי לעיין גם בקטע שינויים בצד השרת כדי לראות קוד שמראה איך לנתח את האסימונים האלה מהכותרות לשימוש בהפעלה של FirebaseServerApp
.