Firebaseのセキュリティルールからのデータベースアクセス

記事
IT・テクノロジー

Firebaseのセキュリティルールからのデータベースアクセス

Firebase のデータベースのセキュリティルールを設定する際に、Firebase のデータベースのデータを利用することが可能です。前回の記事では、グループ毎の Firebase のデータベースのアクセスをシンプルにするために、カスタムでユーザー情報のコレクションを作成して利用する方法を紹介しました。

実は、Firebase のデータベースのセキュリティルールの中からデータベースのアクセスをする場合には幾つか注意があります。この記事では、Firebase のセキュリティルールからデータベースを利用する場合に気をつけることをまとめて見ました。

Firebase のセキュリティルールからのデータベースアクセス

Firebase のセキュリティールールの中で Firebase のデータベースにアクセスできる機能はとても便利です。この場合、見落としやすいのは、セキュリティルールのために作成したデータベースへのアクセスです。

例えば、前回紹介した、グループアクセス管理のためのユーザーコレクションを考えてみます。

aaa zzz@xx.com aaa 1 ZZZ YYYY 
bbb xxx@xx.com bbb 1 XXX WWWW 
ccc vvv@yz.net ccc 2 VVV UUUU 

例なのでシンプルに3人のユーザ「ZZZ」「XXX」「VVV」を考えます。 コレクションには各ユーザーに対応したドキュメントを保存します。

{
  "docId": "ドキュメントID",
  "email": "E-Mailアドレス",
  "uid": "ユーザーID",
  "gid": "グループID",
  "name": "名前"
}
このコレクションの、「gid」を Firebase のデータベースアクセスのためのセキュリティルールから「uid(ユーザー ID)」から取得して、グループの特定を行うというのが前回の記事で紹介したルールの事例です。

セキュリティルールを設計する上で必要なデータのコレクションやドキュメントを作成すれば、それをセキュリティルールの実装に利用できるのはルールの柔軟性を考えるととても便利な機能です。

Firebase のコレクション/ドキュメントには全てルールが必要!

実は、Firebase のセキュリティルールで利用するコレクションやドキュメントを含めて全ての Firebase のコレクション/ドキュメントにはルールが必要です。これが、この記事のポイントです!

従って、上の例に挙げたユーザー情報のコレクション/ドキュメントにアクセスするためのルールが必要になります。

例えば、ユーザーの情報は個人情報が含まれるので全ての利用者にアクセスを許可するには問題があります。さらに言えば情報の書き換えを管理者と本人以外のユーザが行えるのも問題です。

管理者に関しては、別途ルールを作ったり、専用の管理用のアプリを作ることを前提にこの記事を書いていますので、一般の利用者のアクセス権限をどうするかにポイントを絞ります。

ユーザー情報の場合は基本的に、「本人」のドキュメントのみのアクセスを許可するという事にするのが一般的です。

match /users/{user_id) {
    allow read: if $(user_id) == request.auth.uid;
}
というようなルールが必要です。 「users」がコレクション名で、{user_id}がドキュメント ID を示す変数になります。 ドキュメントの ID を、Firebase の uid と一致するように設定しておいて、この値が Firebase の uid と一致した時のみ読み込みを許可するというルールです。

これで、本人以外の利用者が他の利用者のデータにアクセスしようとしても、ユーザー認証(ログイン)を経ないでアクセスするのは基本的に禁止になるためにアクセスは、エラーになります。

Firebase Cloud Firestore のドキュメント ID

さて、このようなルールを書く場合、Firebase Cloud Firestore のドキュメント ID を意図的に設定する必要があります。 Firebase Cloud Firebase のドキュメント ID は Firebase 側が自動で割り当てる場合と、プログラムで指定する2つの方法があります。

単純に Firebase のデータベース(Clud Firestore)を利用する場合には、Firebase に自動で割り当ててもらった方が便利な場合が多いです。しかし、Firebase Cloud Firestore のコレクションやドキュメントをセキュリティルールから利用する場合は、セキュリティルールのコードが書きやすくなるように、上手く指定する方が便利です。

利用する目的によって、この Firebase Cloud Firestore のドキュメント ID の割り当てを上手く使い分ける必要があります。

自動で Firebase のドキュメント ID を割り当てる場合
自動で、Firebase Cloud Firestore のドキュメント ID を割り当てたい場合は「add」を使います。

firebase.firestore().collection("collection_name").add(data)
でドキュメントを追加すると、Firebase が自動的にドキュメント ID をわりふります。

任意の Firebase のドキュメント ID を割り当てたい場合
任意で Firebase Cloud Firestore のドキュメント ID を指定して割り当てる場合は、「set」を使います。ドキュメント ID をユーザー ID(uid)と同じにしたい場合は以下のようなコードになります。

const uid: firebase.User = firebase.auth().currentUser;
firebase.firestore().collection("collection_name").doc(uid).set(data);
のように Firebase から uid を取得してドキュメントの ID として指定します。

まとめ
Firebase Cloud Firestore のデータベースのデータをセキュリティルールから利用できるのはとても便利です。しかし、データの利用がプログラムかセキュリティールールかによらず、全ての Firebase Cloud FIrestore のコレクション/ドキュメントにルールを設定する必要があることを常に意識する必要があります。

特にプログラムで利用しない、コレクションやドキュメントのルールは見落としやすいので注意が必要です。より、安全な Web サービスを実現するためにとても重要な項目です。

今回は主に読み込みのルールが中心でしたが、次回は、「書き込み」の権限について紹介します。
サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す ココナラコンテンツマーケット ノウハウ記事・テンプレート・デザイン素材はこちら