Firebaseアプリのデータベースを管理するには?

記事
IT・テクノロジー

Firebaseアプリのデータベースを管理するには?

Firebase のデータベース機能(Cloud Firestore)を利用して作成したアプリの多くは、アプリで利用しているデータベースを管理する必要がある場合が多くなります。作成したアプリの一部として管理する方法もありますが、専用の管理アプリを作成するとセキュリティ上より安全に管理を行う事ができます。

この記事では、Firebase のデータベースを管理する専用アプリを Firebase admin SDK を利用して行う方法を紹介します。

Firebase データベースのセキュリティールールで管理者を設定できる

一番手軽な方法は、作成するアプリの一部として、「管理者モード」を実装してしまう方法です。これは、管理者の Firebase のユーザー ID を特定して、そのユーザーに管理者の権限を設定する方法です。

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth.uid == "uid_for_admin";
    }
  }
}
のようなセキュリティルールを設定すれば、特定のユーザー ID で Firebase のユーザー認証(ログイン)したユーザーは Firebase のデータベース(Cloud Firestore)の全てのコレクション/ドキュメントに対して、読み込みと書き込みができる権限を設定できます。

あとは、提供するアプリの一部として管理機能を実装すれば、インターネットを介して Firebase のデータベースの管理を行う事ができます。

セキュリティルールで管理者を設定する問題点は?

機能的には、セキュリティルールで管理者を設定して管理を行う事自体には問題はありません。セキュリティ上気をつけないといけないことは、ユーザー名とパスワードの管理です。仮に、ユーザー名とパスワードを何らかの手段で特定できた場合は、誰でも Firebase のデータベースに制限なしでアクセスできる事になるからです。

推測や特定の難しいパスワードを設定して、定期的にパスワードを変更したりするなど対策を十分に取れば通常は十分ですが、最近は二段階認証なども一般的になっているように、ユーザー名とパスワードだけでは十分でないという味方もあります。

管理用の PC で管理用のアプリを利用して管理する

そこで、もう少し安全な方法として、管理用の PC で管理用のアプリを利用して管理する方法があります。この方法の場合、管理用のアプリをインターネット上に公開しなければ、セキュリティは、ユーザー名とパスワードで管理者の認証を行うよりはセキュリティは大幅に向上します。

この方法の場合は、インターネットで公開しているアプリから管理を行う機能は使えないので、通常は簡単に Firebase に不正な管理アクセスをすることは難しくなります。

Firebase admin SDK は、Node.js、Java、Python、Go、C#のプログラミング言語をサポートしていますが、この記事では「Nodejs」を利用した例を紹介します。

Node.js で Firebase admin SDK が便利な理由

Node.js を使って、Firebase admin SDK を利用する場合、プログラミングが通常の Web アプリを開発する場合と同じように、Javascript で記述することができます。 もちろん、他の言語にも詳しい方の場合、使いやすい言語を選択できます。

この連載で何回か書いているように、プログラミングを効率的に学習するには、学習の範囲を必要以上に広げないことが、短期間でプログラミングをマスターする秘訣です。そのため、ここでは Node.js を取り上げています。

Firebase admin SDK の使い方

まずは、Firebase admin SDK のパッケージをインストールします。

プロジェクトのフォルダを作成して、そのフォルダに移動します。

$ mkdir firebase-admin-app
$ cd firebase-admin-app
$ npm init -y
$ npm install firebase-admin
で Firebase admin SDK がインストールできます。

Firebase admin SDK の秘密鍵(Private key)を取得

Firebase コンソールから管理を行いたい Firebase のプロジェクトの設定画面(Project settings)に行きます。 メニューから「サービスアカウント(Service accounts)」を選んで、秘密鍵(Private key)を作ります。

「新しい秘密鍵の生成(Generate new private key)」をクリックすると秘密鍵のファイルがダウンロードされるので、このファイルを管理アプリのプロジェクトフォルダにコピーして「serviceAccountKey.json」という名前に変更します。名前は何でも良いのですが、Firebase のドキュメントの名前に従っています。

これで Firebase admin SDK を利用する準備は完了です。

Firebase データーベースの管理アプリを作る

Firebase の管理アプリは、基本的な記述は通常の Firebase のデータベース(Cloud Firestore)のアクセスとほぼ同じ書き方で記述できます。違うのは、初期化の方法です。通常のクライアントアクセス(Web ブラウザからのアクセス)の場合、CDN(Contents Delivery Network)のリンクを HTML に入れたり、npm で firebase のモジュールをインストールして利用しますが、Firebase admin SDK の場合は少しやり方が違います。

const admin = require("firebase-admin");
const serviceAccount = require("./serviceAccountKey.json");

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https//sample-xxxxx.firebaseio.com",
});

admin
  .firestore()
  .collection("collection_name")
  .get()
  .then((querySnapshot) => {
    querySnapshot.forEach((doc) => {
      const data = doc.data();
      console.log(data);
    });
  });
初期化は先程取得した、Firebase admin SDK の秘密鍵(Private key)を使います。また、Firebase Cloud Firestore のデータベースの URL が必要です。これは、通常 Firebase のデータベースにクライアント(Web ブラウザ)からアクセスする場合に使用している URL と同じものです。Firebase コンソールを見れば取得できます。

上のソースコードの例では、「admin」という名前で初期化を行っているので、「admin」という名前を使えば Firebase のリソースにアクセスできます。通常は、クライアント(Web ブラウザ)からのアクセスの場合、「firebase」を使う場合が多いので、「firebase」の代わりに「admin」を使う感じです。

例では、Firebase Cloud Firestore のデータベースからあるコレクションのデータを取得する例を書いてありますが、他のアクセスも通常のクライアント(Web ブラウザ)からのアクセスと容量は同じです。

アプリの実行の仕方は?

基本的に Node.js のアプリなので、以下のようなコマンドを実行します。 以下の例は、「admin.js」というファイルのコードを実行する場合です。

$ node admin.js
Node.js のアプリは基本的にコマンドラインのアプリになりますが、GUI を使いたい場合は、「express」などのフレームワークを使って、管理用の PC でローカルのサーバーを動かして Web ブラウザ上に UI を作れば、より使いやすいアプリにする事ができます。

Next.js などを使うのも一つの方法です。

まとめ
Firebase のデータベースを利用したアプリの場合、データベースの管理を行う必要がある場合が多くなります。アプリの一部として管理機能を実装するのは一つの方法ですが、より高いセキュリティが必要な場合は、専用の管理 PC 上で管理アプリを動かして管理する方がより安全です。

専用アプリの実装には、Firebase admin SDK を使うと、セキュリティールールで管理者の権限を設定する必要もありません。Node.js を利用すれば、通常のクライアント(Web ブラウザ)からのアクセスの記述とほぼ同じでかけるので、別に管理アプリを作ってもあまり大きな負担にはなりません。

Express や Next.js を使って、アプリを作れば本格的な管理アプリを Web ブラウザを利用した UI の実現も可能です。


サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す