1

次の要件があります。

  1. ユーザーは、電子メールと複数の Oauth プロバイダーを介してログインします。のような関数を使用しますUser.findByEmail('1@1.com')。そのため、認証される前にユーザーのリストを表示する権限が必要です。
  2. ユーザーの電子メール アドレス、地理位置情報、年齢は、他のユーザーから秘密にしておく必要があります。

私の最初の計画は次のとおりです。

users:{
  $user-id:{

//  public
    ".read" : true,
    name,
    created_at,

    private: {
        ".read" : "auth.email === data.child('email').val()",
        age,
        email,
        geolocation,
    }
    $piority = email
  }
}

それから、いいえ、そのようには機能しないことに気付きました。それで、誰かがそれを正しく行う方法を教えてください。前もって感謝します。

PS Firebase には、フィルター/シリアル化メソッドが本当に必要です。

4

1 に答える 1

4

この投稿には実際にいくつかの質問があります。1 つ目は、プライベート データの格納方法です。できる簡単な変更の 1 つは、公開/秘密鍵とユーザー キーを逆にすることです。これらは、同じユーザー レコードにネストする必要はありません。

/users/$user_id/...public data...
/private/$user_id/...private data...

これにより、データの保護がかなり簡単になります。

別の質問は、重複した電子メールの検出に関するものです。ここで単純なログインを使用していると仮定すると、これはまったく意味がありません。アカウントを作成しようとするだけで、メールアドレスが存在するかどうかを確認できます。メールが登録済みの場合はエラーとなります。

それでも解決しない場合は、ユーザーの電子メールのリストを提供せずに、手動でこれを確認できます。これは通常、インデックスを使用して行われます。新しいアカウントが作成されたら、次のように記述します。

/email_index/$escaped_email/$userid ($userid is the value)

電子メールが利用可能かどうかを確認したい場合は、次のように読み取ります。

var ref = new Firebase(URL);
function checkEmail(emailAddress, callback) {
   ref.child('email_index/'+escapeEmail(emailAddress)).once('value', function(snap) {
       callback(snap.val() !== null);
   });
}

function escapeEmail(emailAddress) {
   return (email || '').replace('.', ',');
}

checkEmail(EMAIL_ADDRESS, function(exists) {
   console.log(EMAIL_ADDRESS + (exists? 'does' : 'does not') + ' exist!');
 });

誰かがメールを一覧表示できないようにするには、セキュリティ ルールで次のようなことを行います (驚くほど柔軟で、非常に洗練されており、エンタープライズ アプリでも同様です)。

"email_index": {
   // no .read rule here means that the data cannot be listed; I have to know the email address to check it
   "$email_address": {
       ".read": true,
       // it can only be claimed once and the value must be my user id
       ".write": "auth.uid === newData.val() && !data.exists()"
   }
}
于 2014-09-15T17:38:22.453 に答える