1

電子メール/パスワードベースの認証が有効になっているFirebaseデータベースの場合、FirebaseでバックアップされたiOSアプリケーションにサインインするユーザーに読み書きアクセスを許可する方法。 Firebase iOS sdkはauth apiを公開して/ signin/signoutユーザーを公開していますが、ユーザーに読み取りアクセス権または書き込みアクセス権を与えることができるfirebase SDK内のAPIは見つかりませんでした。私は、2人のユーザーuser1、user2を作成し、APIを使用しているとします。 user1への読み取りアクセスとuser2への読み取り/書き込みアクセスを許可するにはどうすればよいですか。必要なアクセスはデータベース全体にあります。 セキュリティルール(Googleセキュリティベースのコンソールの[データベース]タブの[ルール]セクションのJSONを介して提供されている)を介してのみ可能ですか?はいの場合、さまざまなユーザーに対してこのような種類の読み取り/書き込みアクセスを作成する方法はありますか? Firebase iOS SDk経由で使用できる場合は、どのapiを使用するのですか?Firebase:異なるユーザーへの読み取り/書き込みアクセスを提供するには?

おかげ

+0

Firebaseデータベースのセキュリティモデルについては、こちらのドキュメント(https://firebase.google.com/docs/database/security/)で説明しています。これはFirebaseサーバで実行されるため、iOSクライアントに固有のものではありません。ドキュメンテーションを勉強し、ユースケースに適したものにして、ルールの実装に問題がある場合はここに戻ってみることをお勧めします。 –

答えて

3

私はで開始することを理解することは非常に困難でしたが、ルールは非常に柔軟で、あなたに他のデータベースの内容に基づいてデータへの基本アクセスをしましょう。基本的には、ノードへのアクセスを許可し、その許可はすべての子にも適用され、ツリーの深いノードからは削除できません。これらのデータベースルールはコンソールに適用できますが、データベース全体のルールを設定する場合にも同様にAPIを使用する必要があります。それらは単一のドキュメントでなければならないので、ユーザーをハードコーディングする必要はありませんが、隠れたアクセスできないノードに配置するとルールにアクセスできます。

たとえば、人が他の人と友だちになるように要求し、他の人が両方の人を受け入れて友だちリストに追加できるようにしたいとしましょう。最初のステップは、friendRequests/$targetUid/$requestorUidに値を書き込んで

uid 
    "friends" 
    friendUid1 
    friendUid2 
    friendUid3 
    "private" 
    ... some private data your friends can read 
"friendRequests" 
    targetUid 
    requestorUid -> can be written to only by requestorUid 

:あなたは、これに似たスキーマを持つことができます。このノードに書き込むことができるのは、requestorUidとして認証された人だけです。 targetUidはtargetUidノードへの読み取りアクセスを許可されるため、子であるため読み込めますが、書き込みはできません。

friendRequests/targetUid/requestorUidの存在に基づいて、$requestor/friends/$targetUidへの書き込みアクセスを$ targetUidに許可することができます。これにより、フレンドリクエストを受け取った人は、リクエスタが自分のフレンドリストに自分のUIDを書き込むことができます。次に、リクエスターのuidを自分のフレンドリストに書き込みます。ログインしているユーザーのuidがフレンドリストにある場合、ユーザーはプライベートデータにアクセスできます。 auth.uidが一致しますので

{ 
    "rules": { 
    "$uid": { 
     ".read": "auth.uid === $uid", 
     ".write": "auth.uid === $uid", 
     "friends": { 
     "$friendId": { 
      ".write": "root.child('friendRequests').child($friendId).child($uid) && auth.uid === $friendId" 
     } 
     }, 
     "private": { 
     ".read": "data.parent().child('friends').child(auth.uid).exists()" 
     } 
    }, 
    "friendRequests": { 
     "$targetUid": { 
     ".read": "auth.uid === $targetUid", 
     "$requestorUid": { 
      ".write": "auth.uid === $requestorUid" 
     } 
     } 
    } 
    } 
} 

のは、いくつかの「本物」のIDを使用し、100 uidは彼らは200の要求であることを自分自身のID 100を記述したuid 200と友達になりたいとしましょう、これは許可され

ref = db.getReference("friendRequests/200/100"); 
ref.setValue(true); 

することで200ログインしたユーザIDが、彼らはfriendRequests/200ですべての友達リクエストを読むことができます:$ requestorUidとは、最後の書き込みルールに一致します。彼らは、ユーザー100が友人であることを要求したことを知っているので、最初にusers/200/friendsに100を追加します。これは、auth.uidが200になり、users/200ノード全体とそのすべての子ノードに対して完全な読み取り/書き込みアクセス権を持つために許可されます。

"root.child('friendRequests').child($friendId).child($uid) && auth.uid === $friendId" 

auth.uid 200になり、チェックがfriendRequests/200/100が存在し、そのノードがユーザーによってのみ書き込み可能であるため、100は200と友達になることを求められていることがわかります。このルールがあるため

次は、彼らはまた、users/100/friends/200に書き込むことができます100。

関連する問題