FirestoreにドキュメントIDとは別に、もう一つユーザが作成するdisplayIDを保存したいと思っています。
このIDは作成後の編集は出来ないようにする予定ですが、後々、編集機能をつけたくなる可能性もあるものです。
Twitterの@IDのようなもので、小文字と大文字は見分けません。
ドキュメント例
/users/{uid}
{
"displayId":"CatIsVeryCute",
"description":"Cat lover.",
"createTime":ServerTimestamp
}
現状、ドキュメントに
"lowerCaseDisplayId":"catisverycute",
のように、小文字のフィールドを追加し、クライアント側で
swift
1 let lowerCaseDisplayId = "CatIsVeryCute".lowercased() 2 let docRef = db.collection("users").whereField("lowerCaseDisplayId", isEqualTo: lowerCaseDisplayId) 3 docRef.getDocuments { (snapshot, error) in 4 if let error = error { 5 // エラー処理 6 return 7 } 8 if snapshot?.documents != [] { 9 // 既存のIDだから、他のIDを作成してください! 10 return 11 }else{ 12 // 使えるIDです! 13 return 14 } 15 }
と確認処理をさせて、サーバ側では、セキュリティルールで確認しようとしたのですが、セキュリティルールで確認する方法が見つかりませんでした。
そこで、今後の策としては
0. lowerCaseDisplayIdをドキュメントIDにして、セキュリティルールのexists()で確認
一意性は保証される。しかし、あとで変える機能が欲しくなった場合には苦労する。また、ユーザ作成なので、ホットスポットの要因になる可能性がある?
\n
0. Callable Functionsで確認・作成する
マルチスレッド処理なので、精密には一意性を保証できないが、クライアントだけの確認より、悪意を持って確認処理をしないで作成することができない分、マシなはず。。。
\n
0. クライアントだけの確認で妥協する
普通に使っている分には、ほぼ大丈夫な気がするが、悪意を持って同じIDを作成することは可能。クライアント側で、createTimeが古いユーザを表示するようにすれば、問題にならないかも?
の3つを考えています。
どれがいいか悩んでおり、アドバイスをいただければ幸いだと思っております。
また、セキュリティルールだけで一意性を保証できる方法をご存知の方は、ご教授いただけると大変ありがたいです。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/14 11:17
2019/07/14 17:15