この投稿には実際にいくつかの質問があります。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()"
}
}