Firebase
スマホアプリやWebシステムなどで mBaaS として Firebase を利用している方は多いと思います。特に Firestore Database, Realtime Database, Storage などは非常に便利であるため、これらを目的に好んで Firebase を利用したりもするでしょう。
これらを利用するとき、開発のためにテストモードで開始する方が多いです。しかしテストモードはセキュリティが低く、場合によっては誰でも操作できてしまいます。開発中であったとしても Firebase Auth と連携し、最低限のセキュリティは保っておいた方がいいでしょう。
今回は、Firebase Auth の UID を利用した最低限のルールを紹介します。
Firestore Database
Firestore の場合、本番環境モードで開始すると、全ての階層において誰も読み書きできないルールになっています。本番環境モードで開始する
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /{document=**} { allow read, write: if false; } } }
テストモードで開始する
一方テストモードで開始すると、データベースを作ってから1ヶ月間は、全ての階層において誰でも読み書きできるルールになっています。この状態での利用は好ましくないですね。開発がズルズルと伸びると、この期間も同じくズルズルと伸ばしてしまいがちです。直ぐにでもルールを見直しましょう。rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /{document=**} { allow read, write: if request.time < timestamp.date(2021, 11, 25); } } }
Firebase Auth と連携
アクセスするユーザの Firebase Auth の UID は、 request.auth.uid で取得できます。以下の例では、 /users の配下に自身の UID の階層を持ち、そこにアクセスするときは読み書き可能なルールになっています。自分自身しか読み書きできないので、大きな問題になることはないでしょう。
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /users/{userId} { allow read, write: if request.auth != null && userId == request.auth.uid; } } }この例では、 read と write に対してルールを設定していますが、厳密には
- read … get, list
- write … create, update, delete
-
と細かく設定することができ、詳細については割愛しますが write にはそれぞれ個別にルールを割り振った方がいいでしょう。
Realtime Database
Realtime Database は、Firestore と設定が異なります。ロックモードで開始
Firestore でいうところの本番環境モードになります。 read, write 共に false としているので、誰も読み書きすることができません。{ "rules": { ".read": false, ".write": false } }
テストモードで開始する
一方テストモードでは、データベース作成から1ヶ月間は誰でも読み書きできるルールです。{ "rules": { ".read": "now < 1636124400000", // 2021-11-25 ".write": "now < 1636124400000", // 2021-11-25 } }
Firebase Auth と連携
アクセスするユーザの Firebase Auth の UID は、 auth.uid で取得できます。こちらも Firestore と同じように /users の配下に自身の UID の階層を持ち、そこにアクセスするときは読み書き可能なルールとして設定してみました。{ "rules": { "users": { "$uid": { ".read": "$uid === auth.uid", ".write": "$uid === auth.uid", } } } }
Storage
Storage にもルールが存在します。設定方法は、 Firestore と同じです。ただし、本番環境モードやテストモードなどは用意されておらず最初のルールが決まっています。その内容は Firebase Auth を利用していれば誰でも読み書きできるものですが、他のユーザのコンテンツを除き見れるのは気持ち悪いです。明確なルールを用意した方がいいでしょう。
最初(テストモードなし)
rules_version = '2'; service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write: if request.auth != null; } } }
Firebase Auth と連携
Firestore と同様にアクセスするユーザの Firebase Auth の UID は、 request.auth.uid で取得できます。 /users の配下に自身の UID の階層を持ち、その配下のファイルにアクセスするときは読み書き可能なルールになっています。rules_version = '2'; service firebase.storage { match /b/{bucket}/o { match /users/{uid}/{file_name} { allow read, write: if request.auth.uid == uid; } } }