2017-01-30 6 views
0

Ionic 2 + angularFire2を使用してモバイルアプリケーションを作成しようとしています。メッセージの受信者に読み取りアクセスを許可するFirebaseルール

私のデータベースは基本的にユーザーとメッセージで構成されます。ユーザーは電子メールとパスワードで認証されます。

ユーザーがでメッセージを交換します:受信者のメールが有効である場合は/検索

  1. のみ受信者によって
  2. メッセージが読み取り可能な受信者にメッセージを送信する
  3. 登録

サンプルデータ:

"messages" : { 
    // message key 
    "-KbUpdXdFT6ggEqCXDd5" : { 
     "data" : "Lorem Ipsum", 
     "recipient" : "[email protected]", 
     "sender" : "[email protected]" 
    }, 
    "-KbUr1_8AakzKjdwfmny" : { 
     "data" : "Some message", 
     "recipient" : "[email protected]", 
     "sender" : "[email protected]" 
    }, 
} 
"users": { 
    // users key 
    "OpYYjG3iJsprgPNmhrNZ: { 
     "email": "[email protected]" 
    }, 
    "bwEd48upa0e7h5ghKEpo":{ 
     "email": "[email protected]" 
    } 
} 

サンプルルール:設定したルールで

"rules": { 
    "messages":{ 
     // everyone is allowed to write new messages 
     ".write": "auth != null",    
     "$message": { 
      // read only if you are an authenticated user and your email is the same as the recipient 
      ".read": "auth != null && data.child('recipient').val() == auth.token.email" 
    }, 
    "users":{ 
     ".read": "auth != null"   
    } 
} 

、ユーザーJohn Doeが受信したメッセージのリストを取得するには、このクエリを呼び出します。

messages = this.af.database.list('messages',{ 
     query:{ 
      orderByChild: 'recipient', 
      equalTo: "[email protected]" 
     } 
    }); 

問題: I 「クライアントには必要なデータにアクセスする権限がありません」というメッセージが表示され続けます。エラー。イムはそれを推測

はに何か持っている:私は他のさまざまなルールを試してみました

".read": "auth != null && data.child('recipient').val() == auth.token.email" 

を、ない成功を収めました。メッセージがユーザーの下にあるよりネストされたデザインを考えても、それはアンチパターンと見なされたようです。

ヘルプ、アドバイス、チュートリアルは歓迎されます。ありがとうございました!

+0

あなたのメールアドレスはあなたのauthペイロードに保存されていますか? これは、ユーザーテーブルに格納するのとは異なります。それが認証ペイロードにない場合は、それが問題になる可能性があります。トークンに含まれるものは、使用している認証方法によって異なります。 – arneson

+0

ちょっとarneson、返事をいただきありがとうございます。 トークンにパスワードメソッドの電子メール変数があるかどうかは完全にはわかりません。 ドキュメントには、特定のアカウントのメールアドレスが含まれている必要があります[リンク](https://firebase.google.com/docs/reference/security/database/#authtoken) –

+0

どの認証方法を使用していますか? – arneson

答えて

0

あなたの問題は非常に広く議論の対象に関連している:

Firebaseルールはフィルターではありません。

主なことは、ルールを使用して希望の方法でフィルタリングすることはできません。ノードの1つの子にアクセスでき、その兄弟ではなく親ノードを読み取ろうとするとエラーが発生します。

参照:ジョン・ドウは、あなたの受信者である

"messages" : { 
    // Each recipient has his own child node 
    "user-id-of-john-doe" : { 
     "KbUpdXdFT6ggEqCXDd5" : { 
      "data" : "Lorem Ipsum", 
      "recipient" : "[email protected]", 
      "sender" : "[email protected]" 
     }, 
     "-KbUr1_8AakzKjdwfmny" : { 
      "data" : "Some message", 
      "recipient" : "[email protected]", 
      "sender" : "[email protected]" 
     }, 
    } 
} 

Documentation

ソリューション 一つの解決策は、このような何かを見て、あなたの構造を変更することです。

このアプローチを使用すると、各ユーザーは自分自身のメッセージサブノードを持ちます。このノードには、他のユーザーがそのユーザーにメッセージを追加するための読み取りアクセス権を与えることができます。特定のユーザーが受信したメッセージを確認したい場合は、単にノードを確認するだけです。

messages/userId-or-email-or-whatever-unique-identifier-you-use/ 
+0

私は解決策はメッセージを別の構造の下に置くことでしょうか?認証されたユーザーに対して書き込みアクセス権を持ち、所有者であるユーザーに対してのみ読み取り権限を持つユーザー - >キーのように? –

+0

はい、正確です。詳細は私の小さな編集を見てください。 – arneson

+0

firebaseが "。"のようなパスの特定の文字を許可しない可能性があると思われます。だから私は、新しい構造体のパスとしてユーザuidに切り替えるべきだと推測しています。 –

関連する問題