Firebase Admin SDKをインストールする方法を紹介します。
環境
- Express, Node.js v20
- Render.com
【目次】
- Firebase Admin SDKとは
- インストール
- サービスアカウントJSONを取得する
- npm install
- Node.jsで初期化する
- FirestoreでドキュメントのCRUD操作をする
- ドキュメントの作成、更新の操作
- ドキュメントの取得の操作
Firebase Admin SDKとは
Firebase Admin SDKとは、Firebaseの主要な機能をサーバーサイドから利用するためのSDK(Software Development Kit)です。
これにより、バックエンドからFirebase Authentication, Firestore, Cloud Storageなどの機能を使うことが可能になります。
また、もう1つの特徴として、セキュリティルールを無視して(=完全な管理者権限で)Firestore操作することができます。どうしてもセキュリティルールの初期設計上操作できないものがある場合にはAdmin SDKを利用してバックエンドでDB操作を実行するといったこともできます。
インストール
サービスアカウントJSONを取得する
サービスアカウントの秘密鍵をダウンロードする必要があります。
- Firebaseコンソールにアクセスし、作成したプロジェクトに移動する
- 「プロジェクトの設定」をクリックし、「サービスアカウント」タブへ移動
- 「新しい秘密鍵の生成」ボタンをクリックする
- 表示内容を確認し、「キーを生成」ボタンをクリックする
- 自動でJSONファイル(秘密鍵)がダウンロードされる
npm install
npm i firebase-admin
Node.jsで初期化する
Node.jsで初期化する際、JSONファイルをそのまま読み込むのでも良いのですが、私の環境では面倒だったので、環境変数を使うように以下のように実装しました。
const serviceAccount = {
"type": "service_account",
"project_id": "your-project-id",
"private_key_id": process.env.THE_FIREBASE_PRIVATE_KEY_ID,
"private_key": process.env.THE_FIREBASE_PRIVATE_KEY.replace(/\\n/g, '\n'),
"client_email": process.env.THE_FIREBASE_CLIENT_EMAIL,
"client_id": process.env.THE_FIREBASE_CLIENT_ID,
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": process.env.THE_FIREBASE_CLIENT_X509_CERT_URL,
"universe_domain": "googleapis.com"
}
const { initializeApp, cert } = require('firebase-admin/app')
const firebaseApp = initializeApp({
credential: cert(serviceAccount),
databaseURL: process.env.THE_FIREBASE_DATABASE_URL
});
この実装方法の注意点:
- 環境変数の管理を厳重にすること(.env)
- “FIREBASE”は予約語だそうで、前にTHEと付与すること(もちろん何でもよいです)
- “private_key”は改行の文字の事情で、最後に`.replace(/\\n/g, '\n')`を付与すること
これで、FireabseプロジェクトをNode.jsで操作することができます。
ちなみに、AuthやFirestoreを操作するには、以下のようなコードを追加します。
const { getFirestore } = require('firebase-admin/firestore')
const { getAuth } = require('firebase-admin/auth');
const db = getFirestore(firebaseApp)
const auth = getAuth(firebaseApp);
変数の`firebaseApp`にはもう1つ前のコードのinitializeAppの返り値を代入しておく必要があります。
FirestoreでドキュメントのCRUD操作をする
CRUD操作のサンプルコードを紹介します。
どの例もコレクション`cities`に都市のドキュメントが複数保存されているような場合を想定しています。
ドキュメントの作成、更新の操作
参考ページ:https://firebase.google.com/docs/firestore/manage-data/add-data?hl=ja
ドキュメントを作成する
set()
を利用すれば新たにドキュメントを作成できます。この際、IDを自ら指定する必要があります。
const docId = "foooo";
const data = {
id: docId,// フィールドにドキュメントIDを入れておかないと非常に不便なため挿入
name: 'Taro Yamada',
country: 'Japan'
};
const res = await db.collection('users').doc(docId).set(data);
ドキュメントを作成する(IDは自動生成させる場合):
IDを自動生成させる場合には add()
を使います。
// IDを指定せずに、自動生成させて新たなドキュメントを作成する
const res = await db.collection('users').add({
name: 'Taro Yamada',
country: 'Japan'
});
console.log('Added document with ID: ', res.id);
ドキュメントを更新する
update()
を利用するとドキュメントを更新できます。
// usersコレクションのIDがfoooのドキュメント
const userRef = db.collection('users').doc('fooo');
// 新たにemailを付与して更新する
const res = await userRef.update({email: '[email protected]'});
ドキュメントの取得の操作
1つのドキュメントを取得する
get()
を利用してドキュメントを取得できます。
// usersから、uidがfooooのドキュメントを取得する
const userRef = db.collection('users').doc('foooo');
const doc = await userRef.get();
if (!doc.exists) {
console.log('ドキュメントが存在しません。');
} else {
// ドキュメントデータはdoc.data()で取得する
const user = doc.data();
console.log('usersドキュメントが見つかりました:', user);
}
docを取得した際、 doc.exists()
を使うとどのドキュメントが存在しているかどうかをbooleanでチェックできます。
複数のドキュメントを取得する
where()
で条件を指定して get()
を利用することで条件に一致する複数のドキュメントを取得できます。 where()
を使わない場合には全てのドキュメントを取得できます。
const usersRef = db.collection('users');
// 'is_verified'フィールドがtrueであるドキュメントを検索
const usersSnapshot= await usersRef.where('is_verified', '==', true).get();
if (usersSnapshot.empty) {
// 一致するドキュメントがない場合のログ
console.log('一致するドキュメントがありません。');
return;
}
// 一致するドキュメントがある場合、各ドキュメントのデータをverifiedUsersに格納する
const verifiedUsers = [];
usersSnapshot.forEach(doc => {
const id = doc.id;
const data = doc.data();
verifiedUsers.push(data);
});