Tip #0 Don’t trust your client
- クライアントを信用しないでください
- Webでは簡単にapiKeyなどデータベースにアクセスする情報が取得できる
モバイルでも変わらない
Slide 10
Slide 10 text
Tip #1: Okay, you can trust auth
- 認証情報を信用してください
- クライアントからのリクエストを単純に信じてはいけない
- Firebase Authの仕組みを利用して認証する
- プロバイダー認証の場合、名前、メールアドレスなど取得できるが
信じるべきはアクセストークン
- アクセストークンを正しく検証した内容は信じることができる
- アクセストークンはJWTが使われている
https://jwt.io
Slide 11
Slide 11 text
Tips #2-5: Use Security Rules
- セキュリティルールを使いましょう
- セキュリティルールはデータベースとストレージのためのものです。
- アクセスコントロールを提供できる
- Attribute Based Access Control (ABAC)
- Role Based Access Control (RBAC)
Slide 12
Slide 12 text
Tip #2: Authorize your users
- ABACでのアクセスコントロール
- 例ではプロジェクトが公開されている非公開かで閲覧を制限したり
- メンバーかそうでないかで書き込み権限があったりなかったりといった内容
- RBACでのアクセスコントロール
- ユーザーのロールに応じてできる操作をコントロールする
- https://firebase.google.com/docs/firestore/solutions/role-based-access
- FirestoreとStorageのセキュリティルールでは関数を作って
ルールをまとめることができる
Slide 13
Slide 13 text
Tip #3: Validate your schema
- データのスキーマーの検証をしよう
- 必須のフィールドやオプショナルなフィールド
- データの型チェック
- データサイズなど
- セキュリティルールで検証できる
- https://github.com/FirebaseExtended/protobuf-rules-gen
- protocol bufferのスキーマーからセキュリティルールのスキーマーを生成するツール
Slide 14
Slide 14 text
Tip #4: Implement business logic checks
- ビジネスロジックの実装をチェックしよう
- 例では誰が編集できるかの検証について
- 動画でより詳しい解説がある
https://www.youtube.com/watch?v=oFlHzF5U-HA
Slide 15
Slide 15 text
Tip #5: But watch out for gotchas!
- だけど、ちょっとしたことに気をつけて!
- セキュリティルールはフィルターではない
- データではなくクエリーを検証する
- 複数の属性を持つコレクションがあったとき全てを取得しようとしても
非公開属性のドキュメントがあると全ての取得に失敗する
- 公開されたデータだけを取得されるように
クライアント側でクエリーを書く必要がある