web-dev-qa-db-fra.com

Comment établir un lien entre les utilisateurs authentifiés et la base de données dans Firebase?

J'ai l'authentification Firebase dans mon Android. Ma question est de savoir comment établir un lien entre des utilisateurs authentifiés (qui apparaissent dans Firebase::Auth onglet dans la console Firebase) et la base de données (Firebase::Database tab).

J'ai besoin de lier les données de la base de données avec l'utilisateur concerné dans Auth par le User UID qui apparaît dans Auth, et éventuellement envoyer des requêtes sur un UID spécifique pour obtenir les informations pertinentes dans Database.

Y a-t-il quelque chose d'automatique/intégré qui fait cela ou dois-je créer une nouvelle entrée pour un utilisateur dans Database chaque fois que j'authentifie un utilisateur et puis crée un champ ID pour lui avec la valeur UID qui apparaît dans Auth?

Dans les Documents de gestion des utilisateurs , il explique uniquement l'ajout d'utilisateurs à l'onglet Auth et la réinitialisation de leurs mots de passe.

13
Alaa M.

Après l'authentification, créez un enfant avec l'UID donné par Firebase et définissez sa valeur sur votre classe d'utilisateurs:

//get firebase user
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

//get reference
DatabaseReference ref = FirebaseDatabase.getInstance().getReference(USERS_TABLE);

//build child
ref.child(user.getUid()).setValue(user_class);

USERS_TABLE est un enfant direct de root.

Ensuite, lorsque vous souhaitez récupérer les données, obtenez une référence à l'utilisateur par son UID, écoutez addListenerForSingleValueEvent() (invoqué une seule fois) et parcourez le résultat avec réflexion:

//get firebase user
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

//get reference
DatabaseReference ref = FirebaseDatabase.getInstance().getReference(USERS_TABLE).child(user.getUid());
//IMPORTANT: .getReference(user.getUid()) will not work although user.getUid() is unique. You need a full path!

//grab info
ref.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        final Profile tempProfile = new Profile(); //this is my user_class Class
        final Field[] fields = tempProfile.getClass().getDeclaredFields();
        for(Field field : fields){
            Log.i(TAG, field.getName() + ": " + dataSnapshot.child(field.getName()).getValue());
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
    }
});

modifier:

Ou sans réflexion:

@Override
public void onDataChange(DataSnapshot dataSnapshot) {
    final Profile p = dataSnapshot.getValue(Profile.class);
}
12
Alaa M.