0

Je rencontre un problème avec les règles de la base de données Firebase Realtime. J'inscris un nouvel utilisateur avec mAuth.createUserWithEmailAndPassword(email, password). Dans le onCompleteMethod, je veux ajouter mon propre objet utilisateur dans la base de données en temps réel. Je fais ceci, parce que chaque utilisateur a des informations supplémentaires à l'email/mot de passe.Les règles de la base de données Firebase Realtime interdisent l'écriture de l'utilisateur authentifié

Après je vérifie

FirebaseUser fireUser = FirebaseAuth.getInstance().getCurrentUser(); 
if(fireUser == null) { 
    //do something 
} else { 
    createNewUser(fireUser); 
} 

la méthode

private void createNewUser(FirebaseUser fireUser) { 
     // Build the user-object. 
     User user = new User(); 
     user.setUserId(fireUser.getUid()); 
     user.setUsername(name); 
     user.setSex(sex); 
     user.setEmail(email); 
     user.setAge(time); 
     user.setImageUri(""); 

     // Create database connection and reference. 
     DatabaseReference mDatabaseRef = FirebaseDatabase.getInstance().getReference(); 
     mDatabaseRef.child("users").child(fireUser.getUid()).setValue(user); 
    } 

est appelé. Mais pour une raison quelconque ce DatabaseError est jeté:

W/RepoOperation: setValue at /users/9i6loj4BlCWkgkXOULWxbCSlvnx1 failed: DatabaseError: Permission denied 

Selon ma compréhension si le FirebaseUser n'est pas nul - il est connecté et donc mes règles déclaré dans Firebase

{ 
    "rules": { 
    ".read": "auth != null", 
    ".write": "auth != null" 
    } 
} 

permettra à l'utilisateur écrire la base de données. Cependant, ce code fonctionne seulement quand je change mes règles à ".read": "true" et ".write": "true".

Donc ma question est: Qu'est-ce que je fais mal ici? Je veux seulement que les utilisateurs authentifiés lisent/écrivent.

Merci pour toute aide!

EDIT

@Override 
public void onComplete(@NonNull Task<AuthResult> task) { 
    if (!task.isSuccessful()) { 
     loadingPanel.setVisibility(View.GONE); 
    } else { 
     loadingPanel.setVisibility(View.GONE); 
     FirebaseUser fireUser = FirebaseAuth.getInstance().getCurrentUser(); 
     if(fireUser == null) { 
      Toast.makeText(getApplicationContext(), "User is null", Toast.LENGTH_SHORT).show(); 
     } 

     // Send verification mail 
     sendVerificationEmail(fireUser); 

     // Create a new User! 
     createNewUser(fireUser); 

     //start intent and sign out. 
     Intent intent = new Intent(getApplicationContext(), LoginActivity.class); 
     FirebaseAuth.getInstance().signOut(); 
     startActivity(intent); 
     finish(); 

    } 
} 
+0

Pouvez-vous mettre à jour votre message pour inclure le corps de votre méthode 'onComplete()'? Cela rendra plus clair le chemin d'exécution 'createNewUser()'. –

+0

J'ai ajouté la méthode onComplete. J'espère que ça aide! – Hnig

Répondre

1

écrit la base de données ne terminent pas de manière synchrone. Vous signez avant l'opération de base de données a le temps de compléter:

 //start intent and sign out. 
    Intent intent = new Intent(getApplicationContext(), LoginActivity.class); 
    FirebaseAuth.getInstance().signOut(); // <== Can't do this here! 
    startActivity(intent); 
    finish(); 

En createNewUser(), vous pouvez ajouter un CompletionListener avec une instruction journal à l'appel pour voir setValue() lorsque l'écriture est terminée. Vous pouvez également ajouter un AuthStateListener avec une instruction log pour détecter la fin de la connexion ou de la déconnexion. Ces journaux doivent confirmer que la déconnexion est en cours avant l'écriture de la base de données.