2017-09-16 4 views
2

Firebaseエコシステムの追加のユーザデータフィールドに関する記事を読んだら、私は/users/の下でユーザ名をノードキーとして使用して、ユーザ名を保存して検証するという最良の方法に近づいた。データベースフィールドが有効な場合にのみFirebaseでユーザを作成する方法は?

私は、クライアント側とデータベースルール内でユーザ名を検証しています: ": "$user.matches(/^[0-9A-Z]{3,18}$/i)&& newData.hasChildren(['uid']) && !data.parent().hasChild($user)",

ユーザーまでに署名するとき、私は問題に直面しています。私のサインアップの方法で、私はここにコードの一部だ、createUserWithEmailAndPassword方法の成功を約束する決意でデータベースにユーザー名を保存します。

... 
.createUserWithEmailAndPassword(payload.email, payload.password) 
.then((user) => { 
    // saving additional user information 
    firebase 
    .database() 
    .ref(`users/${payload.username}`) 
    .set({ 
     uid: user.uid, 
    }) 
    .then(() => { 
... 

クライアント側の検証良いですが、明らかに十分ではありません。私のアプリケーションはうまくいきますが、ユーザー名のクライアント側の検証を無効にして無効なユーザー名を送信しようとすると、ユーザー名なしでユーザーが作成されます。

私が見る唯一の解決策は、作成が成功した場合は最初にユーザ名ノードを作成することです - 登録するとエラーがスローされない場合はユーザにサインインしてください - プログラムの実行を続行してください。ユーザー名。しかし、それは私にとって非常に汚い解決策のようです。

どうすればこの問題をうまく解決できますか? ありがとう!

答えて

1

解決策は私にとっても非常に汚いと控えめなようです。私がすることを提案したいのは、ユーザー名を検証するためのルールメソッドには行かないことです。あなたが指摘したように、あなたは検証が失敗する時を知る方法がありません。

代わりに、クラウド関数の実装でデータベーストリガー関数を記述することをお勧めします。この関数は、「ユーザー名」ノードが移入されたときに起動する必要があります。この中で、ユーザ名を検証して、設定した基準を満たしていることを確認できます。検証が成功した場合、クライアントアプリケーションはそれをユーザに示し、さらに進めることができます。

検証に失敗した場合は、ユーザーに別のユーザー名の入力を要求することができます。検証プロセスが行われている間は、クライアントにプログレスバーなどを表示することもできます。

しかし、これはこれが解決できる方法の1つで、必ずしも最善の方法ではないと付け加えたいと思います。私はより良い方法を考えることができませんが、何か他のものが現れたら、私は全く別の方法を模索しています!

+0

ありがとうございました!しかし、検証してユーザネーム・ノードを作成した最初のステップの後、将来、このノードに 'uid'を追加するために、クライアントのどこかに格納する必要があります。このステップでは、ユーザー名が無効なものに変更される可能性があります。私たちは、ユーザが作成したノードに 'uid 'を書き込むことを他のノードに制限する方法はありません。 (私がすべてのことを正しく理解していれば)。ユーザー名を入力して実際の登録に進まなかった場合も対処する必要があります。もちろん、すべてのユーザ名ノードを 'uid'時間なしで削除することはできますが、それでもなお汚れているようです。 ありがとう! –

+0

しかし、ユーザー作成プロセス全体をクラウド機能に置いたらどうでしょうか? –

+0

私は混乱を理解していると思います。 'uid'はユーザ属性で、' createUserWithEmailandPassword'の時に作成されます。したがって、この 'uid'は' username'ではなく、あなたのユーザの一意の識別情報として機能するはずです。 –

0

フィールドをデータベースに保存する必要があること、および他の '未知のフィールド'がないことを確認したい場合は、.validateルールを使用できます。 は、あなたのdatabase.rules.jsonにこれを追加(または直接コンソールでのデータベースのルールで):

"users": { 
    "$uid": { 
    "email": { ".validate": true }, 
    "displayName": { ".validate": true }, 
    "$other": { ".validate": false }, 

    ".read": "$uid === auth.uid", 
    ".write": "$uid === auth.uid" 
    } 
} 

また、リアルタイムデータベース内のユーザーを格納するための推奨方法に気づく、UIDがKEYとしてそれをです使用して。 ユーザーのパスは次のようになります。

/users/9gZepE9jODX1KZGZ2EEyoX1NyOX4 
関連する問題