レッドインパルスのたかけんです。
REDIMPULZ Advent Calendar 2020 の4日目のエントリーです。
Firebase Admin SDKをNext.jsで使う
注意 : firebase Admin SDKの認証情報は環境変数で扱い、サーバーサイドで利用する想定です。
認証情報の扱いに注意して、フロントエンドで実行されるコードからは参照しないようにしてください。
Firebase Admin SDKのセットアップ
Next.jsだと、firebaseの初期化が再実行されるとエラーになるので、工夫が必要です。
回避策として、以下のようにしています。
lib/firebaseAdmin.ts
import admin from 'firebase-admin';
const initializeApp = () => {
admin.initializeApp({
credential: admin.credential.cert({
projectId: process.env.FIREBASE_ADMIN_PROJECT_ID,
privateKey: process.env.FIREBASE_ADMIN_PRIVATE_KEY,
clientEmail: process.env.FIREBASE_ADMIN_CLIENT_EMAIL,
}),
storageBucket: process.env.FIREBASE_ADMIN_STORAGE_BUCKET,
});
};
admin.apps.length ? admin.app() : initializeApp();
export const firestore = admin.firestore();
Next.jsでFirebase Admin SDKを複数プロジェクトに対して使う
Firebase Admin SDKは、複数プロジェクトに対して使うことが可能です。
参考にNext.jsで使う場合は、以下のようにすることで、できました。
lib/firebaseAdmin.ts
import admin from 'firebase-admin';
const initializeApp = () => {
admin.initializeApp({
credential: admin.credential.cert({
projectId: process.env.FIREBASE_ADMIN_PROJECT_ID,
privateKey: process.env.FIREBASE_ADMIN_PRIVATE_KEY,
clientEmail: process.env.FIREBASE_ADMIN_CLIENT_EMAIL,
}),
storageBucket: process.env.FIREBASE_ADMIN_STORAGE_BUCKET,
});
admin.initializeApp(
{
credential: admin.credential.cert({
projectId: process.env.FIREBASE_OTHER_ADMIN_PROJECT_ID,
privateKey: process.env.FIREBASE_OTHER_ADMIN_PRIVATE_KEY,
clientEmail: process.env.FIREBASE_OTHER_ADMIN_CLIENT_EMAIL,
}),
storageBucket: process.env.FIREBASE_OTHER_ADMIN_STORAGE_BUCKET,
},
'other'
);
};
admin.apps.length ? admin.app() : initializeApp();
export const firestore = admin.firestore();
export const otherFirestore = admin.app('other').firestore();