Firebase / Firestore : comment corriger l'erreur PERMISSION_DENIED: Missing or insufficient permissions ?
Afin de faciliter le travail des développeurs mobiles, Google a créé Firebase. Avec cette plateforme, un développeur mobile dispose d'une plateforme lui fournissant une architecture serveur accessible depuis n'importe où dans le monde. Son pendant stockage, Firestore, permet d’utiliser une base de données NoSQL, elle aussi accessible depuis le monde entier. Grâce à ces 2 plateformes, le développeur d'applications n'a pas à se soucier de la partie "architecture", qui est un domaine d'habitude géré par des techniciens en réseaux. Ces plateformes sont manipulables aisément depuis Android Studio. Le message d'erreur "PERMISSION_DENIED: Missing or insufficient permissions" provient d'un problème de droits dans l'accès aux données.
Lorsque vous développez avec Firebase, Android Studio fournit des outils intégrés pour configurer et gérer vos bases. Les règles d'accès sont disponibles depuis le menu "Bases de données" puis "Règles". Par défaut, la règle est configurée pour interdire l'accès à tout le monde, ce qui provoque le message d'erreur.
service cloud.firestore { match /databases/{database}/documents { match /{document=**} { allow read, write: if false; } } }
C'est en changeant le contenu de cette méthode que vous conditionnez l'accès aux ressources stockées dans la base de données. Vous devez créer vos propres ressources et modifier la méthode pour n'autoriser l'accès à la base de données qu'aux propriétaires des ressources.
service cloud.firestore { match /databases/{database}/documents { match /objets/{objet} { function isSignedIn() { return request.auth.uid != null; } allow read, write: if isSignedIn() && request.auth.uid == resource.data.uid } } } //Cette requête ne va pas fonctionner car on ne peut pas avoir toutes les données Firestore.instance .collection('objets') .snapshots() //Cette requête va fonctionner car on ajoute une condition pour récupérer uniquement celle de l'utilisateur Firestore.instance .collection('objets') .where('uid', isEqualTo: user.uid) .snapshots()
Vous devez donc adapter le code au fonctionnement de votre application. Si par exemple les ressources peuvent être vues par tout le monde à condition que l'utilisateur soit connecté, alors vous n'avez pas de condition à écrire sur l'identifiant.
service cloud.firestore { match /databases/{database}/documents { match /stories/{story} { function isSignedIn() { return request.auth.uid != null; } allow read, write: if isSignedIn() && request.auth.uid == resource.data.uid } } }
Si vous ne savez pas encore comment développer cette méthode et que vous êtes dans la phase de développement, vous pouvez simplement remplacer "false" par "true". Cela autorisera l'accès à toutes les ressources pour tout le monde. Cette méthode ne doit être utilisée que durant la phase de développement, car elle laisse d'énormes failles de sécurité dans votre application.
service cloud.firestore { match /databases/{database}/documents { match /{document=**} { allow read, write: if true; } } }