Firestoreのセキュリティルールのコーディング規約
Firebaseの代表される素晴らしいNoSQLのデータベースである「Cloud Firestore」にはセキュリティルールというものを設定して不正なアクセスを遮断することができます。
Firestoreを使う上で必須になる技術でこれをやらないとデータが壊される危険性があるので必ずやりましょう。
基本的な使い方は下記の記事が参考になると思います。自分もこの記事をみて勉強しました。
また、セキュリティルールはローカルでテストができます。前まで実際にデプロイしてからアプリからアクセスして確認するみたいなことしてたのが、ローカルだけでテストできますので、こちらも合わせて実装するといいでしょう。
さくっと試したい方は下記のサンプルをとりあえず動かしてみることをおすすめします。
自分はサンプルから package.jsonをコピーしてきてnpm installしました。多分開発環境構築として邪道だと思いますw
コーディング規約
そして、セキュリティルールを書いていく上でコーディング規約を2個決めました。まとめると下記のツイートです。
一つ一つ詳しく説明していきます。
1、ワイルドカードは使わない
具体的に言うと下記のような書き方です。
service cloud.firestore {
match /databases/{database}/documents {
match /group/{document=**} {
allow read;
}
match /user/{document=**} {
allow read;
}
}
}
このような書き方だとgroup下のcollectionがあったときにどんなセキュリティルールが設定されているのかちゃんと見えません。
なので、ワイルドカードはやめて中までちゃんとネストしてセキュリティルールを設定いくほうが安全だと言えます。(下のコードはそのままコピペしても動きません)
service cloud.firestore {
match /databases/{database}/documents {
match /user/{userId} {
allow read: if isAuthenticate();
allow create, update: if isAuthenticate() && isUserAuthenticate(userId);
match /group/{groupId} {
allow read: if isAuthenticate();
match /message/{messageId} {
allow read, create: if isAuthenticate() && isUserAuthenticate(userId);
}
}
}
}
}
2、writeは使わない
基本的にwriteは使わないようにしましょう。理由はwriteには下記の3つが含まれるからです。
・create
・update
・delete
ここで一番問題になるのは updateとdelete です。
悪意のある攻撃にたいして、簡単にデータが更新されたり、削除されたりする可能性があります。
ですので、この3つは明示的に分けて書きましょう。
下記の例では読み取りと作成は認証情報があった時にできて、更新と削除はユーザー本人の投稿だけ削除できるように設定しています。
service cloud.firestore {
match /databases/{database}/documents {
function isAuthenticate() {
return request.auth != null;
}
function isUserAuthenticate(userId) {
return request.auth.uid == userId;
}
match /user/{userId} {
allow read: if isAuthenticate();
allow create: if isAuthenticate();
allow update, delete: if isUserAuthenticate();
}
}
}
まとめ
・セキュリティルールは必ず設定しよう
・*は使わないほうがいい
・writeは使わないほうがいい
でした。Firebaseはほんと最強サービスなので使いこなしていきましょう!!
投げ銭はいりません。それより無料でできる拡散をしてください!! 感想をツイートしていただけることが一番嬉しいです!!