SSR (Sunucu Tarafında Oluşturma) ile dinamik web uygulamalarında Firebase'i kullanma

Firebase JS SDK'sı veya diğer Firebase istemci SDK'larıyla çalıştıysanız FirebaseApp arayüzünü ve bu arayüzü kullanarak uygulama örneklerini nasıl yapılandıracağınızı biliyorsunuzdur. Firebase, sunucu tarafında benzer işlemlerin kolaylaştırılması için FirebaseServerApp sağlar.

FirebaseServerApp, sunucu tarafında oluşturma (SSR) ortamlarında kullanılmak üzere FirebaseApp öğesinin bir varyantıdır. İstemci taraflı oluşturma (CSR) ve sunucu tarafı oluşturma arasındaki ayrımı kapsayan Firebase oturumlarına devam etme araçları içerir. Bu araçlar ve stratejiler, Firebase ile oluşturulan ve Firebase App Hosting gibi Google ortamlarında dağıtılan dinamik web uygulamalarını geliştirmeye yardımcı olabilir.

FirebaseServerApp ile yapabilecekleriniz:

  • Tam yönetim haklarına sahip olan Firebase Admin SDK'nın aksine, user bağlamında sunucu tarafı kodu yürütün.
  • SSR ortamlarında Uygulama Kontrolü'nün kullanımını etkinleştirin.
  • İstemcide oluşturulan bir Firebase Auth oturumuna devam etme

FirebaseServerApp yaşam döngüsü

Sunucu tarafı oluşturma (SSR) çerçeveleri ve bulut çalışanları gibi tarayıcı dışı diğer çalışma zamanları, kaynakları birden fazla yürütme arasında yeniden kullanarak başlatma süresini optimize eder. FirebaseServerApp, referans sayısı mekanizması kullanarak bu ortamları destekleyecek şekilde tasarlanmıştır. Bir uygulama, önceki initializeServerApp ile aynı parametrelerle initializeServerApp çağırırsa zaten başlatılmış olan aynı FirebaseServerApp örneğini alır. Bu, gereksiz başlatma yükünü ve bellek ayırmalarını azaltır. deleteApp, bir FirebaseServerApp örneğinde çağrıldığında referans sayısı azalır ve referans sayısı sıfıra ulaştıktan sonra örnek serbest bırakılır.

FirebaseServerApp örneklerini temizleme

Özellikle birçok eşzamansız işlemi paralel olarak çalıştırıyorsanız bir FirebaseServerApp örneğinde deleteApp işlevini ne zaman çağırmanız gerektiğini bilmek zor olabilir. FirebaseServerAppSettings öğesinin releaseOnDeref alanı bu işlemi basitleştirir. İsteğin kapsamının yaşam süresine sahip bir nesneye (örneğin, SSR isteğinin başlıklar nesnesi) releaseOnDeref referansı atarsanız çerçeve başlık nesnesini geri aldığında FirebaseServerApp referans sayısını azaltır. Bu işlem, FirebaseServerApp örneğinizi otomatik olarak temizler.

releaseOnDeref kullanımına ilişkin bir örneği aşağıda bulabilirsiniz:

/// 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);
  ...
}

İstemcide oluşturulan kimliği doğrulanmış oturumlara devam etme

FirebaseServerApp örneği, kimlik doğrulama kimliği jetonuyla başlatıldığında kimliği doğrulanmış kullanıcı oturumlarının istemci tarafı oluşturma (CSR) ve sunucu tarafı oluşturma (SSR) ortamları arasında köprülenmesini sağlar. Bir kimlik doğrulama kimliği jetonu içeren FirebaseServerApp nesnesiyle başlatılan Firebase Auth SDK örnekleri, uygulamanın herhangi bir oturum açma yöntemini çağırmasına gerek kalmadan başlatma sırasında kullanıcının oturumunu açmaya çalışır.

Kimlik doğrulama kimliği jetonu sağlandığında uygulamalar, istemcide Auth'un oturum açma yöntemlerinden herhangi birini kullanabilir. Bu sayede, kullanıcı etkileşimi gerektiren oturum açma yöntemleri için bile oturumun sunucu tarafında devam etmesi sağlanır. Ayrıca, kimliği doğrulanmış Firestore sorguları gibi yoğun işlemlerin sunucuya yüklenmesini sağlayarak uygulamanızın oluşturma performansını artırır.

/// 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 ortamlarında App Check'i kullanma

Uygulama Kontrolü zorunluluğu, Firebase SDK'larının getToken işlevini dahili olarak çağırmak için kullandığı bir Uygulama Kontrolü SDK örneğine dayanır. Ardından, ortaya çıkan jeton tüm Firebase hizmetlerine yönelik isteklere dahil edilir ve arka ucun uygulamayı doğrulamasına olanak tanır.

Ancak App Check SDK'nın uygulama doğrulaması için belirli sezgisel yöntemlere erişmek üzere tarayıcıya ihtiyacı olduğundan sunucu ortamlarında başlatılamaz.

FirebaseServerApp alternatif bir çözüm sunar. FirebaseServerApp başlatma sırasında istemci tarafından oluşturulan bir Uygulama Kontrolü jetonu sağlanırsa Firebase hizmetleri çağrılırken Firebase ürünü SDK'ları tarafından kullanılır. Bu durumda, Uygulama Kontrolü SDK örneğine gerek kalmaz.

/// 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.

İstemci jetonlarını sunucu taraflı oluşturma aşamasına iletme

Kimliği doğrulanmış Auth ID jetonlarını (ve App Check jetonlarını) istemciden sunucu tarafı oluşturma (SSR) aşamasına iletmek için bir hizmet çalışanı kullanın. Bu yaklaşımda, SSR'yi tetikleyen getirme istekleri yakalanır ve jetonlar istek başlıklarına eklenir.

Firebase Auth hizmet çalışanı için referans uygulama olarak Hizmet çalışanlarıyla oturum yönetimi başlıklı makaleye bakın. Ayrıca, FirebaseServerApp başlatma işleminde kullanılmak üzere bu jetonların başlıklardan nasıl ayrıştırılacağını gösteren kod için Sunucu tarafı değişiklikleri bölümüne bakın.