Après avoir créé un utilisateur à l'aide de la fonction firebaseAuth createUserWithEmailAndPassword (email, password), j'essaie de sauvegarder des informations supplémentaires sur les utilisateurs enregistrés dans une collection appelée "utilisateurs". Pour cela j'utilise DocumentReference:

  mAuth.createUserWithEmailAndPassword(email, password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
        @Override
        public void onComplete(@NonNull Task<AuthResult> task) {
            if(task.isSuccessful()){
                FirebaseUser fuser = FirebaseAuth.getInstance().getCurrentUser();
                String idUser = fuser.getUid();
                DocumentReference documentReference = fStore.collection("users").document(fuser.getUid());
                Map<String, Object> user = new HashMap<>();
                Log.d("data", "username: "+username + " telef: "+telefono);
                user.put("username", username);
                user.put("telefono", telefono);
                         documentReference.set(user).addOnSuccessListener(new OnSuccessListener<Void>() {
                            @Override
                            public void onSuccess(Void aVoid) {
                                Log.d(TAG, "User profile created");
                            }

                        }).addOnFailureListener(new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception e) {
                                Log.d(TAG, "can´t create profile: "+e.toString());
                            }
                        });
                //sign out the user.. dont work.. any ideas?
                FirebaseAuth.getInstance().signOut();
                mProgressBar.dismiss();
                //send the user to log in
                Intent intent = new Intent(RegisterActivity.this, loginActivity.class);
                //intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(intent);
                RegisterActivity.this.finish();

                Toast.makeText(getApplicationContext(), "Registered ok!", Toast.LENGTH_LONG).show();
            }else{
                Toast.makeText(getApplicationContext(), "can´t register", Toast.LENGTH_LONG).show();
            }
        }
    });

En plus d'avoir instancié :

        mAuth = FirebaseAuth.getInstance();
        fStore = FirebaseFirestore.getInstance();

J'ai également été obligé d'ajouter ce qui suit :

private void initFirebase() {
        FirebaseApp.initializeApp(this);
        firebaseDatabase = FirebaseDatabase.getInstance();
        firebaseDatabase.setPersistenceEnabled(true);
        databaseReference = firebaseDatabase.getReference();
    }

Même pas avec ce dernier ça marche. Seul l'utilisateur avec email et mot de passe est enregistré. La chose étrange est qu'il n'y a pas d'erreur, il semble que l'événement onSuccess ou onFailure ne se produise pas. Les règles de base de données dans la console firebase sont :

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth.uid != null;
    }
  }
}

Fondamentalement, cette règle indique que l'utilisateur doit être authentifié pour pouvoir lire/écrire dans la base de données. Mes dépendances sont :

implementation 'com.google.firebase:firebase-auth:19.3.0'
    implementation 'com.google.firebase:firebase-firestore:21.4.2'
    implementation 'com.google.firebase:firebase-storage:19.1.1'
    implementation 'com.google.firebase:firebase-database:18.0.1'

Je devrais utiliser firebase-firestore et firebase-auth mais j'ai ajouté firebase-database et firebase-storage afin de résoudre le problème mais rien ne se passe.

Merci d'avance.

0
Freddy Daniel 19 oct. 2020 à 19:03

1 réponse

Meilleure réponse

Votre code déconnecte l'utilisateur avant l'écriture de la base de données, de sorte que l'écriture échouera à toutes les règles de base de données qui nécessitent que l'utilisateur soit connecté.

documentReference.set(user) est asynchrone et revient immédiatement, avant que tout travail n'ait été effectué. La base de données sera écrite quelque temps plus tard. Pendant ce temps, votre code exécute immédiatement une déconnexion avec FirebaseAuth.getInstance().signOut(), ce qui supprime le jeton d'authentification de l'utilisateur, ce qui rend la requête sans aucune information d'identification.

Si vous avez besoin que l'utilisateur soit déconnecté après avoir écrit la base de données, vous devez le faire à l'intérieur du code de rappel de la base de données. Bien qu'il soit tout à fait clair pour moi pourquoi vous voudriez que cela se produise. Vous devriez probablement supprimer complètement la déconnexion.

1
Doug Stevenson 19 oct. 2020 à 16:12