web-dev-qa-db-fra.com

Firebase autorisation refusée

Je suis un débutant en base de feu.

Comment passer à travers cette règle ci-dessous?

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

J'ai essayé de changer la règle en bas,

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

mais il y a une erreur de

mismatched input '{' expecting {'function', 'service', 'syntax'}

Ci-dessous, la structure de la base de données. 

 db structure

Actuellement, voici mon code (qui renvoie sans cesse l'autorisation refusée):

    // [START initialize_database_ref]
    mDatabase = FirebaseDatabase.getInstance().reference
    // [END initialize_database_ref]

    val result = HashMap<String, Any> ()
    result.put("timestamp", getCurrentTime())
    result.put("user_id", USER_ID)
    result.put("x_position", -1)
    result.put("y_position", -1)

    mDatabase!!.ref.child("raw data").child("Z9QD79lDzP7MpD6feWeJ").setValue(result).addOnFailureListener(object : OnFailureListener {
        override fun onFailure(@NonNull e: Exception) {
            Log.d("firebase", e.localizedMessage)
        }
    })

Toute aide serait appréciée! Merci :)

5
user3415167

J'ai pu résoudre le problème en passant de Cloud Firestore à Realtime Database, puis en modifiant la règle. (Après avoir changé cela, il n'y avait plus d'erreur à afficher!)  enter image description here

18
user3415167

Pour les autres personnes aux prises avec ce problème, la solution appropriée consiste à modifier le paramètre false 

service cloud.firestore { 
    match /databases/{database}/documents {
        match /{document=**} { 
            allow read, write: if false; 
        } 
    }
}

À true pendant les tests. N'oubliez pas d'ajouter une sécurité supplémentaire lors de la mise en production de votre projet!

2
Epicality

Parce que votre méthode interroge Firebase et non pas Cloud Firestore , Vous devez donc utiliser cette méthode:

FirebaseFirestore db = FirebaseFirestore.getInstance();
    db.collection("YourCollectionName").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
            if (task.isSuccessful()) {
                for (QueryDocumentSnapshot document : task.getResult()) {
                    Log.d(TAG, document.getId() + " => " + document.getData());
                }
            } else {
                Log.w(TAG, "Error getting documents.", task.getException());
            }
        }
    });

n'oubliez pas ceci:

implementation 'com.google.firebase:firebase-firestore:17.0.1'
1
Evan Ngo

Vous devriez vérifier dans votre Angular NgModule et ses composants si vous utilisez "Base de données temps réel" ou "Fire Firestore". Voir les différences utilisant "angularfire2":

BASE DE DONNÉES EN TEMPS RÉEL

@NgModule({
...
imports: [
    AngularFireDatabaseModule,
    ...
],
providers: [
AngularFireDatabase,
...
]
})


@Component({...})
export class FirestoreComponent{
   constructor(private realtimeDb:AngularFireDatabase, ...) {
       this.locations = realtimeDb.list('locations').valueChanges();
     }
...
}

FIRESTORE CLOUD

@NgModule({
    ...
    imports: [
       AngularFirestoreModule,
       ...
    ]
})

@Component({...})
export class FirestoreComponent{
   constructor(private firestore:AngularFirestore, ...) {
       this.locations = firestore.collection('locations').valueChanges();
     }
...
}
0
Matjaz Hirsman