your tag studio manager google from for developers container con autenticacion apps android firebase firebase-security firebase-authentication

tag - login con firebase android



Firebase android: haga que el nombre de usuario sea Ășnico (3)

Parse se cerrará a fin de año, así que decidí comenzar a usar Firebase. Necesito implementar un proceso de registro con 3 campos: correo electrónico, nombre de usuario, contraseña (el correo electrónico y el nombre de usuario deben ser únicos para mi aplicación).

Como Firebase no proporciona una manera fácil de administrar el nombre de usuario como Parse, decidí usar solo el registro de correo electrónico / contraseña y guardar algunos datos adicionales como el nombre de usuario. Aquí está la estructura de datos de mis usuarios:

app : { users: { "some-user-uid": { email: "[email protected]" username: "myname" } } }

Pero, lo que quiero hacer es hacer que el nombre de usuario sea único y verificarlo antes de crear una cuenta. Estas son mis reglas:

{ "rules": { ".read": true, ".write": true, "users": { "$uid": { ".write": "auth !== null && auth.uid === $uid", ".read": "auth !== null && auth.provider === ''password''", "username": {".validate": "!root.child(''users'').child(newData.child(''username'').val()).exists()"} } } } }

Muchas gracias por su ayuda


Guarde los nombres de usuario sugeridos por Frank, pero cuando guarde los nombres de usuario, use la función runTransaction en Firebase para asegurarse de que no se tome el nombre de usuario. Firebase garantiza que esta función es una operación atómica, por lo que puede estar seguro de que no habrá colisión.

firebaseRef.child("usernames").child(username).runTransaction(new Transaction.Handler() { @Override public Transaction.Result doTransaction(MutableData mutableData) { if (mutableData.getValue() == null) { mutableData.setValue(authData.getUid()); return Transaction.success(mutableData); } return Transaction.abort(); } @Override public void onComplete(FirebaseError firebaseError, boolean commited, DataSnapshot dataSnapshot) { if (commited) { // username saved } else { // username exists } } });


Parte de la respuesta es almacenar un índice de nombres de usuario, que verifique en sus reglas de seguridad:

app : { users: { "some-user-uid": { email: "[email protected]" username: "myname" } }, usernames: { "myname": "some-user-uid" } }

Entonces, el nodo de usernames asigna un nombre de usuario a un uid. Básicamente se lee como "nombre de usuario ''myname'' es propiedad de ''some-user-uid''".

Con esta estructura de datos, sus reglas de seguridad pueden verificar si ya hay una entrada para un nombre de usuario dado:

"users": { "$uid": { ".write": "auth !== null && auth.uid === $uid", ".read": "auth !== null && auth.provider === ''password''", "username": { ".validate": " !root.child(''usernames'').child(newData.val()).exists() || root.child(''usernames'').child(newData.val()).val() == $uid" } } }

Esto valida que el nombre de usuario no sea reclamado por nadie todavía O sea reclamado por el usuario actual.


Todavía no sé mucho sobre la seguridad de Firebase, pero es posible que haya resuelto el problema utilizando Java. Lo he publicado a continuación.

mi estructura de datos es

myapp { users: { <unique generated-id> { username: "example.username" } } } public boolean isUsernameExists(final String enteredUsername) { final Boolean[] isExist = {false}; FBref.child("users").addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { for (DataSnapshot userSnapshot : dataSnapshot.getChildren()) { String existingUsername = (String) userSnapshot.child("userName").getValue(); if (existingUsername.equals(enteredUsername)) { isExist[0] = true; } } } @Override public void onCancelled(FirebaseError firebaseError) { //some error thrown here } }); return isExist[0]; }