firebaseのAPIキーが隠せずデプロイに困った( ;∀;)と思ったら、隠せないようです。
どれだけ、隠すためにいろいろやったか・・・bavelとか、webpackとか・・・疲れた・・・
FirebaseのAPIキーを隠す完璧な方法はありませんが、悪用されにくくするためにいくつかの手段があります。以下の方法を検討してみてください。
- 環境変数を利用する:
APIキーをコード内に直接書かず、環境変数や設定ファイルに保存し、それを参照するようにします。これにより、キーが公開リポジトリに誤ってアップロードされるリスクを軽減できます。ただし、これだけではクライアントサイドからキーを完全に隠すことはできません。
- CORS (Cross-Origin Resource Sharing) 設定を使用する:
Firebaseコンソールから、APIキーの使用を特定のドメインに制限するCORS設定を行うことができます。これにより、許可されていないドメインからの不正なリクエストを防ぐことができます。
- Firebaseのセキュリティルールを強化する:
データベースとストレージのアクセスに対してFirebaseのセキュリティルールを適用し、認証済みユーザーのみが適切な権限でアクセスできるように設定します。これにより、悪意のあるユーザーがAPIキーを利用してデータにアクセスしようとしても、ルールによってアクセスが制限されます。
- Cloud Functionsを使用する:
サーバー側でFirebaseとやりとりする処理を行うことで、APIキーがクライアントサイドに漏れることを防ぎます。これにより、クライアントから直接Firebaseにアクセスすることなく、Cloud Functions経由で必要なデータを取得できます。
- 定期的なAPIキーの更新:
APIキーが漏れた場合のリスクを低減するために、定期的にAPIキーを更新することを検討してください。これにより、古いAPIキーが悪用されるリスクを軽減できます。
- 使用状況の監視とアラート設定:
Firebaseの使用状況を定期的に監視し、予期しないアクセスがある場合は速やかに対処できるようにしてください。また、Firebaseコンソールでアラートを設定して、不正アクセスがあった際に通知を受け取ることができます。
Firebase Cloud Functionsを使用して、クライアントサイドからAPIキーが漏れることを防ぐための手順は以下の通りです。
- Firebaseプロジェクトをセットアップする:
まず、Firebaseプロジェクトを作成し、適切な設定を行ってください。Firebaseコンソールからプロジェクトを作成したり、既存のプロジェクトにCloud Functionsを追加したりできます。
- Firebase CLIをインストールする:
ローカルマシンにFirebase CLIをインストールして、Firebaseプロジェクトを管理できるようにします。npmを使用してインストールすることができます。
npm install -g firebase-tools
- Firebaseプロジェクトを初期化する:
コマンドラインで、プロジェクトディレクトリに移動し、firebase init
コマンドを実行してFirebaseプロジェクトを初期化します。プロンプトに従って、Firebaseプロジェクトを選択し、Cloud Functionsを有効にします。
firebase init
- Cloud Functionsを作成する:
functions/index.js
ファイルに、Firebaseとやりとりする処理を含むCloud Functionsを作成します。例えば、以下のようなCloud Functionを作成できます。
javascriptCopy code
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
exports.getData = functions.https.onCall(async (data, context) => {
// 認証されたユーザーかどうかをチェック
if (!context.auth) {
throw new functions.https.HttpsError('failed-precondition', 'The function must be called by an authenticated user.');
}
const snapshot = await admin.database().ref('/path/to/data').once('value');
return snapshot.val();
});
- Cloud Functionsをデプロイする:
作成したCloud FunctionsをFirebaseにデプロイします。デプロイには、コマンドラインから以下のコマンドを実行します。
firebase deploy --only functions
- クライアントサイドでCloud Functionsを呼び出す:
クライアントサイドのコードで、作成したCloud Functionsを呼び出すことができます。以下は、JavaScriptを使用した例です。
const getData = firebase.functions().httpsCallable('getData');
getData()
.then((result) => {
console.log('Data:', result.data);
})
.catch((error) => {
console.error('Error:', error.message);
});
これで、クライアントサイドから直接Firebaseにアクセスせず、Cloud Functionsを経由してデータを取得できるようになります。APIキーはサーバーサイドに保持されるため、クライアントサイドから見えなくなります。