1

Je dispose d'une base firebase et il fonctionnait très bien jusqu'à ce que les règles ont été fixées à ceci:Permission refusée sur l'authentification anonyme pour Firebase Database

"rules": { 
     ".read": true, 
     ".write": false 
    } 

Mais maintenant je dois lancer mon application, donc je ne veux pas ma base de données être ouvert à tous. et voilà pourquoi je l'ai changé les règles de base de données:

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

Je mis en place l'authentification anonymouse de mon application Androd mais l'autorisation refusée erreur continue d'afficher. L'authentification Anonymouse fonctionne bien à partir du simulateur.

Voilà comment j'implémenté:

public void fireBaseAuthenticate(final Context context) { 
    mAuth = FirebaseAuth.getInstance(); 
    mAuth.signInAnonymously() 
     .addOnCompleteListener(new OnCompleteListener<AuthResult>() { 
       @Override 
       public void onComplete(@NonNull Task<AuthResult> task) { 
        if (task.isSuccessful()) { 
         // debugger comes here, so Authentication is successful 
        } else { 
         // If sign in fails, display a message to the user. 

        } 

       } 
    }); 

} 

public void load(final Context context) { 

    fireBaseAuthenticate(context); 
    database = FirebaseDatabase.getInstance(); 
    databaseReference = database.getReference(); 
    databaseReference.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      for (DataSnapshot categorySnaps : dataSnapshot.getChildren()) { 
       RetailChain retailChain = new RetailChain(); 
       retailChain.setName(categorySnaps.getKey()); 
       for (DataSnapshot subMenuSnaps : categorySnaps.getChildren()) { 
        for (DataSnapshot itemSnaps : subMenuSnaps.getChildren()) { 
         for (DataSnapshot productSnaps : itemSnaps.getChildren()) { 
          Product product = productSnaps.getValue(Product.class); 
          productList.add(product); 
         } 
        } 
       } 
       retailChain.setProducts(productList); 
       retailChainList.add(retailChain); 
      }  
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      Log.w("database error: ", "onCancelled", databaseError.toException()); 
     } 
    }); 

} 

Après avoir ajouté écouteur pour singleValueEvent, OnCancelled est appelé. Alors, pourquoi la permission est refusée? EDIT: Erreur journal.

com.google.firebase.database.DatabaseException: Firebase Database error: 
    Permission denied 
    at com.google.firebase.database.DatabaseError.toException(Unknown Source) 
    at home.gio.calorieplanner.main.Main$3.onCancelled(Main.java:205) 
    at com.google.firebase.database.Query$1.onCancelled(Unknown Source) 
    at com.google.android.gms.internal.zzbpx.zza(Unknown Source) 
    at com.google.android.gms.internal.zzbqv.zzZT(Unknown Source) 
    at com.google.android.gms.internal.zzbra$1.run(Unknown Source) 
    at android.os.Handler.handleCallback(Handler.java:739) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:148) 
    at android.app.ActivityThread.main(ActivityThread.java:5417) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
+0

Veuillez inclure le code d'erreur dans le message afin que les gens puissent vous aider. Que voulez-vous dire par «permission refusée erreur continue à montrer»? – UmarZaii

+0

@ giusha9 s'il vous plaît vérifier ma réponse merci – faruk

Répondre

1

Lorsque vous définissez la règle "auth != null" cela signifie que l'utilisateur ne peut pas accéder à la base de données avant fini signe dans

et processus de connexion est un asynchronous, cela signifie que l'auditeur complet ne sera pas appelé tout de suite.

Pour résoudre votre problème, il suffit de déplacer le code qui lit la base de données à l'intérieur de l'écouteur complet.

public void load(final Context context) { 

    fireBaseAuthenticate(context); 

} 

public void fireBaseAuthenticate(final Context context) { 
    mAuth = FirebaseAuth.getInstance(); 
    mAuth.signInAnonymously() 
    .addOnCompleteListener(new OnCompleteListener<AuthResult>() { 
      @Override 
      public void onComplete(@NonNull Task<AuthResult> task) { 
       if (task.isSuccessful()) { 
        // load the data 
        loadFromDB(); 
       } else { 
        // If sign in fails, display a message to the user. 

       } 

      } 
    }); 

} 


private void loadFromDB(){ 
    database = FirebaseDatabase.getInstance(); 
    databaseReference = database.getReference(); 
    databaseReference.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
     for (DataSnapshot categorySnaps : dataSnapshot.getChildren()) { 
      RetailChain retailChain = new RetailChain(); 
      retailChain.setName(categorySnaps.getKey()); 
      for (DataSnapshot subMenuSnaps : categorySnaps.getChildren()) { 
       for (DataSnapshot itemSnaps : subMenuSnaps.getChildren()) { 
        for (DataSnapshot productSnaps : itemSnaps.getChildren()) { 
         Product product = productSnaps.getValue(Product.class); 
         productList.add(product); 
        } 
       } 
      } 
      retailChain.setProducts(productList); 
      retailChainList.add(retailChain); 
     }  
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
     Log.w("database error: ", "onCancelled", databaseError.toException()); 
     } 
    }); 

} 
+0

Cela a fonctionné parfaitement, merci! – giusha9