web-dev-qa-db-ja.com

Firebase内の保護されたコンテンツの適切な承認ルール

Firebaseアプリの保護されたコンテンツの適切な承認ルールへのベストプラクティスアプローチはありますか

  • 特にfirepadを使用する
  • 保護されたコンテンツとは、ユーザーがドキュメントを作成し、それを特定の他のユーザーとのみ共有する場所を意味します)。
  • また、アクセスできるすべてのドキュメント(自分で作成したドキュメントと他のユーザーが共有しているドキュメント)についてFirebaseにクエリを実行できる必要があります

これまでの私の研究のいくつか:

方法1:シークレットURL

  • ドキュメントを表示/編集できるようにするには、URLを知っている必要があります

  • そのURLにアクセスできるログインユーザーは、URLを編集/変更できるため、実際の認証ではありません。

  • アクセスできるすべてのドキュメントにインデックスを付けることはできません

方法2:Firebase認証ルールを使用してユーザーをドキュメントに追加し、ユーザーがdocument.usersであるかどうかを確認してから読み取り/書き込みを行います。

取得元: Firebaseで保護されたコンテンツは可能ですか?

{

"documents": {

   "$documents_id": {

       // any friend can read my post

       ".read":  "auth.id === data.child('owner').val() || root.child('users/'+data.child.owner.val()+'/users/'+auth.id).exists()",

       // any friend can edit my post
       ".write": "auth.id === data.child('owner').val() || root.child('users/'+data.child.owner.val()+'/users/'+auth.id).exists()"

   },

   users:{

   // List of user.ids that have access to this document

   }

}

}

長所:

  • 適切な承認/認証。アクセスを許可された認証済みユーザーのみが表示/編集できます。

短所:

  • ユーザーが編集を許可されているすべてのドキュメント(私が所有している、または私と共有しているドキュメント)を照会することはできません(この仮定は正しいですか?)

方法3:Firebase認証ルール(方法2)に加えて、各ユーザーがアクセスできるdocument_idの配列を持つユーザーの冗長ストア。このユーザーストアは、ユーザーがアクセスできるすべてのドキュメントをクエリするためにのみ使用されます。すなわち:

{
"documents": {
   "$documents_id": {
       // any friend can read my post
       ".read":  "auth.id === data.child('owner').val() || root.child('users/'+data.child.owner.val()+'/users/'+auth.id).exists()",
       // any friend can edit my post
       ".write": "auth.id === data.child('owner').val() || root.child('users/'+data.child.owner.val()+'/users/'+auth.id).exists()"
   }
},
"users":{
    "$user":{
        ".read": "auth.id=$user.id",
        ".write": "auth.id=$user.id"
        "$documents":{
            // All the documents i have access to. This list gets ammended whenever I am granted/stripped access to a document.
        }
    }
}
}

長所:

  • 適切な認証/承認

短所:

  • データが重複しているため、2つのデータストア間の同期の問題に対処する必要があります。これは良い考えとは思えません。

方法4:グループ

グループごとの使用 ユーザーのグループにFirebaseの場所へのアクセスを許可する

  • データストア内のすべてのドキュメントにグループがあります

  • ユーザーがアクセスできるすべてのドキュメントについて、Firebaseに簡単にクエリを実行できません

これを行うためのより良い方法はありますか?

26
abaker

あなたはオプションを列挙するのに良い仕事をしました、そしてあなたは間違いなく正しい軌道に乗っています。ご存知のとおり、セキュリティルールに基づいてクエリを実行する方法はありません。これは意図的に行われたものです。これは(セキュリティルールによっては)非常に高額になる可能性があるためです(Firebaseはこの理由から、一般的に複雑なクエリを回避します)。

したがって、方法3はこれを行うための正確な正しい方法です。このような状況でデータを複製することは、実際には非常に一般的な方法です。これについて詳しく説明しているブログ投稿については、 データの非正規化は正常です を参照してください。

複製されたドキュメントリストを使用して方法1を実行することもできます。これは、URL(シークレットIDを含む)だけでドキュメントに誰かを「招待」できるようにする場合に特に便利です。または、2つを組み合わせて実行することもできます(一部のドキュメントは「公開されているが非公開」であり、一部は「招待された友達に非公開」などです)。

13