1

私のデータベースの構造は次のとおりです。iOS - Firebaseセキュリティルールまたはルールシミュレータで書き込み拒否エラーが発生しましたか?

root 
    | 
    @-users 
    | | 
    | @-uid 
    |  | 
    |  @-registration 
    |  |  | 
    |  |  |-completed: true 
    |  | 
    |  @-sneakersPath//registered users post/write sneaker for sale to this path 
    |   | 
    |   | 
    |   @-autoID//i.e. xyz123 
    |    |-sneakercondition: "used" 
    |    |-sneakername: "nike" 
    | 
    | 
    @searchSnkPath//registered and anonymous users can search/read the sneakers for sale here 
     | 
     @-autoID//xyz123 
      |-sneakercondition: "used" 
      |-sneakername: "nike" 

私が唯一使用できるユーザーでログインしてiOSアプリを開発していると私は私のバックエンドとしてFirebaseを使用しています。 Firebaseのサインイン方法の2つ、電子メール/パスワードと匿名を使用しています。私は電子メール/パスワードフィールドと匿名ユーザーとして入力するボタンを持つログインシーンを持っています。

  1. ユーザーがEmail/Passwordメソッドを使用してアカウントを作成します。

    が2つのシナリオがあります。彼らは電子メールとパスワードのフィールドに記入する必要があります。彼らは、このユーザーが永続的なUIDを取得し、registration pathが作成されます。その登録パスで、私はcompleted:trueのキーと値のペアを追加します。その時点から、ユーザーのログインボタンを押してアプリに入ります(彼らは永続的なUIDでログインしています)。このユーザーは(write)スニーカーをsneakersPathに販売しています。また、彼らや他のユーザーが販売用に投稿したスニーカーについては、(read)を検索することもできます。

  2. 匿名ユーザーは、匿名ボタンであるAnonymousメソッドを使用してアカウントを作成せずにアプリを使用します。彼らは匿名のエントリボタンを押して、彼らはアプリを入力することができます。そのボタンを押すと、一時的なuidを得ることができます(一時的なuidでログインしています)。このユーザーは匿名であるため、このユーザーが行うことができるのは検索(read)です。第1シナリオの他のユーザーが販売のために投稿したものです。匿名でログインしてログアウトすると、別の一時的なUIDを取得します。私は、ユーザーが登録ユーザーとして、または、彼らは匿名ユーザであればログインしているかどうかを確認するためにclient side上でチェックを実行し、両方の状況で

。これらのチェックに基づいて、匿名ユーザーがスニーカーを匿名で投稿するのを防ぐことができます。すべてが正しく機能しています。

私はiOS側のチェックを実行しますが、匿名ユーザーが何も投稿できないことを確認するためにFirebase Rulesにいくつかの追加の強制を加えたいと思います。また、kvp completed:trueのチェックを実行します。

{ 
    "rules": { 
    "users": { 
     "$uid": { 
      ".read": "$uid === auth.uid && auth != null" 
      ".write": "$uid === auth.uid && auth != null && root.child('users').child($uid).child('registration').child('completed').val() === true" 
    } 
    } 
} 
} 

私はFirebaseルールシミュレータに行き、私が手に書き込もうとすると::

今の私のセキュリティルールがある
root.child('users').child($uid).child('registration').child('completed').val() === true" 

下の絵で

enter image description here

enter image description here

私が認証を「オン」に右に切り替えていると私が得た唯一の選択肢は匿名、グーグル、フェイスブック、ツイッター、およびカスタムました。私は電子メール/パスワードを使用しているので、リストには表示されません。カスタムを選択しました。私はそれが何のためにわからないので、管理者ボックスをチェックしていない。私は、JSONセキュリティルールで何か間違ったことや

enter image description here

アムは、私が間違ってルールシミュレータを使用していますか?

答えて

0

にこの

root.child('users').child($uid).child('registration').child('completed').val() === true 

を変更するかもしれませんシミュレータ。ここ

root 
    | 
    @-users 
    | | 
    | @-uid//this is another user's uid 
    | | | 
    | | @-registration 
    | | |  | 
    | | |  |-completed: true 
    | | | 
    | | @-sneakersPath 
    | |  | 
    | |  | 
    | |  @-autoID 
    | |   |-sneakercondition: "used" 
    | |   |-sneakername: "nike" 
    | | 
    | | 
    | @59c96197-7cf9-44d3-bfbc-8d4f3324461//this is the foo uid the simulator provided. It must be added in the db so it can read it 
    | | | 
    | | @-registration 
    | | |  | 
    | | |  |-completed: true 
    | | | 
    | | @-sneakersPath 
    | |  | 
    | |  | 
    | |  @-autoID//abc789 
    | |   |-sneakercondition: "new" 
    | |   |-sneakername: "reebok" 
    | 
    @searchSnkPath 
     | 
     @-autoID//xyz123 
     | |-sneakercondition: "used" 
     | |-sneakername: "nike" 
     | 
     | 
     | 
     @-autoID//abc789 
      |-sneakercondition: "new" 
      |-sneakername: "reebok" 

はFOOパス/シミュレータを提供することをUIDデータである:

enter image description here

注FOOのUIDがトークンペイロードの内部でもある:

enter image description here

あなたのデータベース内にある実際のデータを使用してシミュレータでテストする場合は、シミュレータが提供するfooパス/ uidを削除し、あなたのデータベースにあるどのpath/uidに置き換えても、Simulated Write Deniedレスポンスが得られます。

トークンペイロード内には、データベースからあなたの実際のデータで使用する"provider" : "anonymous"を保つが、あなたの助けのための

0

あなたのUIDと「登録/完了」の値が正しいことを確認する必要があります。したがって、 '登録/完了'が 'true'に設定されている実際のユーザーのUIDを指定する必要があります。正しいタイプ(ブール値)を使用していることを確認してください。チェックを '==='の代わりに '=='に変更したいことがあります。

あなたは問題がFirebaseデータベース内の私はFirebaseは内部で私を与えていたとまったく同じfooのUIDデータを追加しなければならなかったということでした。この

root.child('users').child($uid).child('registration/completed').val() == true 
+0

感謝を使用していずれか1でのfooのuidを置き換えることを確認することができます。セキュリティルールでは、===うまくいきます。私はちょうど ".read"でテストしました: "$ uid === auth.uid && auth!= null"それはそうではありませんでした。あなたはこの短いビデオを見ることができます:https://www.youtube.com/watch?v=qLrDWBKTUZo。私も提案したような実際のUIDを使ってみましたが、書き込みは拒否されました。とにかくありがとう –

+0

あなたは私が正しいと私を理解していない。これら2つの演算子の間に違いがあります。もしあなたの値が '' true''ではなく '' true''であれば、**は問題になります。シミュレータが実際のデータベースにアクセスすることに注意したいと思います。 – creativecreatorormaybenot

+0

これはその理由ではありません。私が提案したビデオ:youtube.com/watch?v=qLrDWBKTUZoを見て、すぐに2:56に進みます。ブール値をチェックするために===を使用する他の例も見てきました –

関連する問題