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();
}
}
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()'. –
J'ai ajouté la méthode onComplete. J'espère que ça aide! – Hnig