Pro Yearly is on sale from $80 to $50! »

ここまで出来るよ Firestore セキュリティルール

0a16f7b8629f2facca2a1e80a73c5423?s=47 ryo
October 10, 2019
2k

ここまで出来るよ Firestore セキュリティルール

もくテク #3

0a16f7b8629f2facca2a1e80a73c5423?s=128

ryo

October 10, 2019
Tweet

Transcript

  1. ここまで出来るよ Firestore セキュリティルール @Ryo Kawamata

  2. 0. 自己紹介

  3. @RyoKawamata 消防士歴 6年半 エンジニア歴 1年半 Ruby / Typescript Firebase /

    Vue.js
  4. 1. Firestoreって何?

  5. Firebaseが提供する スケーラブルなNoSQL のデータベース

  6. Firestoreの特徴

  7. ドキュメント指向のNoSQL

  8. Data Document Collection

  9. Collection Data Document

  10. リアルタイム同期

  11. websocket不要でデータの更新が リアルタイム同期される

  12. NoSQLなのに アトミックオペレーション が使える

  13. トランザクション 一括書き込み 一つ以上のドキュメントに対して対 して書き込みを行う一連のオペ レーション。読み込みでのロックを 行わないため、実行速度が早い。 一つ以上のドキュメントに対して読 み書きを行う一連のオペレーショ ン。読み込みのロックのため、整合 性は高いが、実行速度は遅い。

  14. フロントエンドの 開発スピードアップ

  15. 通常の Webアプリ Front end Back end DB ORM REST API

    Firestore利用 Front end Fire Store Client SDK
  16. 使いやすいSDK

  17. ドキュメントの追 加 ドキュメントの取 得 firestore().collection("users").add({ name: "太郎", sales: 10000 });

    firestore().collection("users") .where("sales", ">", 5000) .orderBy("sales", "desc");
  18. 高いSLOとスケーラビリティ

  19. Resional 99.99 % Multi-Resion 99.999 % SLO Designed to scale

    We've designed Cloud Firestore to handle the toughest database workloads from the world's biggest apps. 世界最大のアプリからの最も厳しいデータベース ワークロードを処理するように設計.
  20. 良心的な料金体系

  21. Sparkプラン (無料) Flameプラン ($25/月) Blazeプラン (従量課金) 保存データ 合計 1GiB 合計

    2.5GiB $0.18 / GiB 帯域幅 10GiB / 月 20GiB / 月 Google Cloud pricing ドキュメントの 書き込み 2万 / 日 10万 / 日 $0.18 / 10万 ドキュメントの 読み取り 5万 / 日 25万 / 日 $0.06 / 10万 ドキュメントの 削除 2万 / 日 10万 / 日 $0.02 / 10万 2019/10/8 時点
  22. もはや最高..!!!!!

  23. でも..

  24. clientから処理されるって、 セキュリティ大丈夫... スキーマレスって変なデータ入って バグになりやすそう.. Validationがフロントだけだと、 怖いような..

  25. 大丈夫!!!

  26. セキュリティルール がある!!

  27. 3. セキュリティルールとは?

  28. Firestoreが提供する サーバーサイドでアクセス制御、 データ検証が出来る機能

  29. service cloud.firestore { match /databases/{database}/documents { match /users/{userId} { allow

    read: if true; allow write: if false; } } } ex) usersコレクションを読み取り専用にするルール 対象のコレクション 条件 許可する操作
  30. 4. セキュリティルール で出来ること

  31. ユーザー認証

  32. Firebase Authentication 認証済みのユーザーで、かつ 自分のドキュメントしか閲覧できない RULE

  33. function isAuthUser(auth, userId) { return auth != null && auth.uid

    == userId } match /databases/{database}/documents { match /users/{userId} { allow read: if isAuthUser(request.auth, userId); } } request.auth で認証情報を取得
  34. スキーマ検証

  35. ドキュメントは以下スキーマを持つ RULE カラム名 型 name String sales Number

  36. function isValidSchema(data) { return data.size() == 2 && 'name' in

    data && data.name is string && 'sales' in data && data.sales is number } match /databases/{database}/documents { match /users/{userId} { allow create: if isValidSchema(request.resources.data); } } request.resources.data で送信データを取得
  37. バリデーション

  38. ドキュメントは以下条件を持つ RULE カラム名 条件 name 30文字以内 gender male, female, genderDivers

    のいずれかの値を持つ
  39. function isValidData(data) { return 'name' in data && 1 <=

    data.name.size() && data.name.size() <= 30 && 'gender' in data && data.gender.matches('male|female|genderDiverse') } match /databases/{database}/documents { match /users/{userId} { allow create: if isValidData(request.resources.data); } } 関数 で送信データを判定
  40. 関連でのバリデーション

  41. messagesはusersドキュメントの ageが18以上の場合に追加できる RULE

  42. function isValidData(data) { return get(/databases/$(database)/documents/users/$(data.userRef)) .data.age >= 18 } match

    /databases/{database}/documents { match /messages/{message} { allow create: if isValidData(request.resources.data); } } get() で別ドキュメントのデータを参照
  43. Firebase Authとの連携

  44. admin 権限を持つユーザーのみ 投稿を許可する RULE

  45. function isAdminUser(auth) { return auth.token.admin == true; } match /databases/{database}/documents

    { match /users/{userId} { allow create: if isAdminUser(request.auth); } } custom claimsでadminを判定
  46. パラメータの変化で判定

  47. statusは`order`から`shipment` の順で変化する RULE

  48. function isValidUpdate(oldData, newData) { return oldData.status.matches('order') && newData.status.matches('shipment') } match

    /databases/{database}/documents { match /users/{userId} { allow update: if isValidUpdate(resource.data, request.resources.data); } } resource.data で 変更前のデータを取得して判定
  49. 4. 注意すべきところ

  50. get関数は金額計算対象

  51. Admin SDKでは セキュリティルールは効かない

  52. 5. まとめ

  53. Firestoreは最高のデータベース。 ただそれを実現するためには、 セキュリティルールを しっかり書くことが大切 !! セキュリティルールを書いて より良いFirestore ライフを送ろう!!