Firebase Admin SDKを導入する際に色々な方法を試したので、それらを整理してみました。少しでも参考になれば幸いです。
Firebase Admin SDK について
Firebase Admin SDKとは
Firebase Admin SDKは、サーバーサイドでFirebaseの機能を利用するための開発ツールです。これにより、Firebaseのデータベース、認証、通知などのサービスをサーバーから直接操作できます。開発者は、ユーザー認証の管理、データベースの更新、バックエンドサービスのカスタマイズなどを行う際に、このSDKを使用してFirebaseのリソースを管理・操作することができます。Node.js、Java、Pythonなど、複数のサーバーサイド言語で利用可能です。
Firebase SDKとの違い
Firebase SDKとFirebase Admin SDKの主な違いは、使用目的とアクセスレベルにあります。Firebase SDKは主にクライアントサイド(例:Web、iOS、Androidアプリ)で使用され、Firebase Admin SDKはサーバーサイドで使用されます。
特徴 | Firebase SDK | Firebase Admin SDK |
---|---|---|
使用環境 | クライアントサイド(Web、iOS、Androidアプリ) | サーバーサイド(Node.js、Java、Pythonなど) |
使用目的 | ユーザー認証、データベースの読み書き、リアルタイム通信 | データベースの管理、ユーザー認証情報の管理、サーバーサイドロジック |
アクセスレベル | ユーザーベースのアクセス制御、セキュリティルールによる保護 | サーバー側からの全範囲操作、アクセス制限を超えて操作可能 |
機能 | データの同期、オフラインサポート、Firebaseプロダクト(例:Analytics、Performance)の統合 | データベースの全範囲操作、全ユーザー情報へのアクセス、プッシュ通知の送信 |
セキュリティ | クライアントサイドのセキュリティに重点 | サーバーサイドの完全なコントロールと管理 |
Admin SDKでできること
Firebase Admin SDKを使用すると、Firebaseプロジェクトの管理と操作が幅広く行えます。
- ユーザー管理: ユーザーアカウントの作成、更新、削除。
- データベース操作: FirestoreやRealtime Databaseのデータを直接読み書き。
- カスタム認証: 独自の認証システムを統合し、カスタムトークンを発行。
- プッシュ通知: Firebase Cloud Messagingを使ったメッセージの送信。
- セキュリティルールのバイパス: セキュリティルールを無視してデータベースにアクセス。
https://firebase.google.com/docs/admin/setup?hl=ja
開発環境
- Node.js:
v18.15.0
- npm:
v9.5.0
- TypeScript:
v5.1.6
- OS:
MacOS Ventura
事前準備
Admin SDKを導入する前に、サービスアカウントキーのファイルやNode.jsアプリケーションの実行環境を準備します。
秘密鍵のダウンロード
コンソール上で秘密鍵のダウンロード
- Firebaseコンソールにアクセスし、作成したプロジェクトに移動する
- 歯車マークから「プロジェクトの設定」をクリックし、「サービスアカウント」タブへ移動(画像参考)
- 「新しい秘密鍵の生成」ボタンをクリックする
- 表示内容を確認し、「キーを生成」ボタンをクリックする
- ダウンロードが終われば完了
実行環境の構築
今回は、Functionsの時のように初期化等は不要なので、適当なNode.js & TypeScriptの土台となるアプリケーションを構築します。以下の参考記事を載せておきます。
Firebase Admin SDKのパッケージをインストール
$ npm install firebase-admin --save
初期化方法①:デフォルトの環境変数にキーファイルのパスを設定
GOOGLE_APPLICATION_CREDENTIALS
にキーファイルのパスを登録すると、applicationDefault()
で呼び出せる。
ローカル開発環境やCI/CDパイプラインなど、Firebase Admin SDKを使用する環境がGoogle Cloud環境外である場合に適している。
export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/service-account-file.json"
admin.initializeApp({
credential: admin.credential.applicationDefault(),
});
初期化方法②:独自の環境変数にキーファイルのパスを設定
複数のFirebaseプロジェクトやサービスアカウントを使用する場合に使用する。
export MY_FIREBASE_CREDENTIALS="/home/user/Downloads/service-account-file.json"
const serviceAccountFilePath = process.env['MY_FIREBASE_SERVICE_ACCOUNT_FIEL_PATH']
admin.initializeApp({
credential: admin.credential.cert(serviceAccountFilePath),
});
初期化方法③:キーファイルの中身を環境変数に登録
アプリケーション内でファイル管理をしたくない場合は、ファイルの中身(JSONデータ)をそのまま環境変数に登録する。
セキュリティが非常に重要な環境で、キーファイルを直接デプロイ環境に配置したくない場合に適している。
そのため、SecretManagerに登録しておき、アプリケーションからSecretManagerにアクセスして、JSONデータを取得する方法がセキュリティリスクも低い。
export MY_FIREBASE_SERVICE_ACCOUNT_JSON_DATA='{"type":"service_account","project_id":"sample-project","private_key":"-----BEGIN PRIVATE KEY-----\\\\\\\\nxxxxx\\\\\\\\n-----END PRIVATE KEY-----\\\\\\\\n"}'
※ 改行コードはエスケープが必要
const serviceAccountJsonData = process.env['MY_FIREBASE_SERVICE_ACCOUNT_JSON_DATA']
const serviceAccountKey = JSON.parse(serviceAccountJsonData)
admin.initializeApp({
credential: admin.credential.cert(serviceAccountKey),
});
初期化方法④:特定項目のみ認証に使用
ファイルの中身(JSONデータ)に定義されている一部項目を使用して初期化する方法。
最小限の認証情報のみを提供したい場合や、特定のプロジェクトIDやクライアントメールなどを明示的に指定する必要がある場合に適している。
// 各値を環境変数に設定してもOK
// const projectId = process.env['MY_FIREBASE_PROJECT_ID']
// const clientEmail = process.env['MY_FIREBASE_CLIENT_EMAIL']
// const privateKey = process.env['MY_FIREBASE_PRIVATE_KEY']
admin.initializeApp({
credential: admin.credential.cert({
projectId: "sample-project",
clientEmail:
"firebase-authentication@sample-project.iam.gserviceaccount.com",
privateKey: "xxxxx".replace(
/\\\\\\\\n/g,
"\\\\n"
),
}),
});
初期化方法⑤:デフォルト認証情報を使用
Cloud Functions(for Firebase)、App EngineなどGCPのマネージドサービスで使用する場合は、認証情報を渡さずに初期化することが可能です。実装自体は下記のみです。
admin.initializeApp();
理由としては、Cloud Functionsなどのマネージドサービスにデフォルトで付与されているサービスアカウントの認証情報をAdminSDKが自動で取得するためです。
方法まとめ
実際のプロダクトで運用するとなると、③、④、⑤の方法に着地するかと思います。
なぜならキーファイルを管理する必要が出てくるため、より安全に管理するためにはそうせざる得ないからです。
もしGCPのマネージドサービスで使用するなら⑤が最強かと思います。
初期化方法 | 使用ケース | メリット | デメリット |
---|---|---|---|
① デフォルトの環境変数にキーファイルのパスを設定 | ローカル開発、CI/CDパイプラインなど、Google Cloud外の環境 | ・セットアップが簡単 ・様々な環境に柔軟 | ・キーファイルの管理が必要 ・セキュリティリスクがある |
② 独自の環境変数にキーファイルのパスを設定 | 複数のFirebaseプロジェクトやサービスアカウントを使用する場合 | ・複数のプロジェクトを管理しやすい | ・環境変数の管理が必要 ・セキュリティリスクがある |
③ キーファイルの中身を環境変数に登録 | セキュリティが重要な環境でキーファイルを直接配置したくない場合 また、別プロジェクトのリソースに対してアクセスする場合 | ・キーファイルを直接配置するリスクを回避 ・秘密情報の安全な管理 | ・環境変数のサイズ制限に注意 ・設定が複雑になることがある |
④ 特定項目のみ認証に使用 | 最小限の認証情報のみを提供したい場合、特定のプロジェクトIDやクライアントメールを明示的に指定する必要がある場合 また、別プロジェクトのリソースに対してアクセスする場合 | ・セキュリティを強化 ・特定のFirebaseプロジェクトへのアクセス制御 | ・認証情報の手動設定が必要 ・誤った設定によるリスク |
⑤ デフォルト認証情報を使用(GCP環境) | Google Cloud Functions、App EngineなどGCPのマネージドサービスでの使用 | ・自動認証で簡単なセットアップ ・セキュリティリスクが低い | ・GCP外では使用不可 ・特定のGCP環境に依存 |
Tips
他のプロジェクトから別プロジェクトの操作をする場合
他のFirebaseプロジェクトのリソースに対してアクセスする場合は、他プロジェクトのサービスアカウントのキーファイルを元にAdminSDKを初期化すればOK