156 votes

Permission refusée pour Firebase

Je suis relativement novice en matière de codage et j'ai des difficultés.

J'ai ce code pour envoyer les données à firebase

app.userid = app.user.uid

var userRef = app.dataInfo.child(app.users);

var useridRef = userRef.child(app.userid);

useridRef.set({
  locations: "",
  theme: "",
  colorScheme: "",
  food: ""
});

Cependant, je continue à obtenir l'erreur :

AVERTISSEMENT FIREBASE : set at /users/(GoogleID) failed : permission_denied 2016-05-23 22:52:42.707 firebase.js:227 Erreur non attrapée (dans la promesse) : PERMISSION_DENIED : Permission denied( )

Lorsque j'essaie de vérifier, il est question de règles pour Firebase, qui semblent être dans un langage que je n'ai pas encore appris (ou qui me dépasse). Quelqu'un peut-il m'expliquer la cause de ce problème ? Je pensais que c'était parce que je demandais à ce qu'il stocke l'email et le nom d'affichage de l'utilisateur et que vous n'étiez tout simplement pas autorisé à le faire, mais lorsque j'ai retiré ces éléments, j'ai toujours le même problème. Existe-t-il un moyen d'éviter cette erreur sans définir les règles, ou est-ce que les règles sont quelque chose que je peux apprendre à écrire en une journée, ou est-ce que je ne suis pas à la hauteur ?

Merci pour toute aide !

315voto

Frank van Puffelen Points 16029

Par défaut, la base de données d'un projet dans le dossier Console Firebase est uniquement lisible/inscriptible par les utilisateurs administratifs (par exemple, dans les fonctions du cloud ou les processus qui utilisent un SDK administrateur). Les utilisateurs des SDK côté client ordinaires ne peuvent pas accéder à la base de données, sauf si vous modifiez les règles de sécurité côté serveur.


Vous pouvez modifier les règles de manière à ce que la base de données ne puisse être lue/écrite que par des utilisateurs authentifiés :

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

Voir le Démarrage rapide pour les règles de sécurité de la base de données Firebase .

Mais comme vous ne signez pas l'utilisateur à partir de votre code, la base de données vous refuse l'accès aux données. Pour résoudre ce problème, vous devrez soit autoriser un accès non authentifié à votre base de données, soit identifier l'utilisateur avant d'accéder à la base de données.

Autoriser l'accès non authentifié à votre base de données

La solution la plus simple pour le moment (jusqu'à ce que le tutoriel soit mis à jour) est d'aller dans le panneau Base de données de la console de votre projet, de sélectionner l'onglet Règles et de remplacer le contenu par ces règles :

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

Cela permet à votre nouvelle base de données d'être lue et écrite par toute personne connaissant l'URL de la base de données. Veillez à sécuriser à nouveau votre base de données avant de passer en production, sinon quelqu'un risque d'en abuser.

Identifier l'utilisateur avant d'accéder à la base de données

Pour une solution (légèrement) plus longue, mais plus sûre, appelez l'un des services suivants signIn... méthodes de Authentification Firebase pour s'assurer que l'utilisateur est connecté avant d'accéder à la base de données. La façon la plus simple de procéder est la suivante utiliser l'authentification anonyme :

firebase.auth().signInAnonymously().catch(function(error) {
  // Handle Errors here.
  var errorCode = error.code;
  var errorMessage = error.message;
  // ...
});

Et ensuite, attachez vos écouteurs lorsque l'identification est détectée.

firebase.auth().onAuthStateChanged(function(user) {
  if (user) {
    // User is signed in.
    var isAnonymous = user.isAnonymous;
    var uid = user.uid;
    var userRef = app.dataInfo.child(app.users);

    var useridRef = userRef.child(app.userid);

    useridRef.set({
      locations: "",
      theme: "",
      colorScheme: "",
      food: ""
    });

  } else {
    // User is signed out.
    // ...
  }
  // ...
});

1 votes

Merci - j'ai utilisé le correctif pour la sécurité et cité votre réponse dans une réponse à une question similaire pour dépasser les problèmes de permission de Firebase dans cette Tutoriel Ember . Mais où ajouter le code d'authentification anonyme (sécurisé) ?

3 votes

OMG : une heure de perdue. J'avais ça là-dedans mais les valeurs étaient fausses... Je l'ai juste négligé. Je les ai changées en VRAI et bam, l'application fonctionne comme on pourrait le penser...

0 votes

OMG, moi aussi, je n'arrivais pas à comprendre pourquoi ils échouaient sur les permissions alors qu'ils étaient tous les deux déjà réglés sur false (jusqu'à ce que je lise votre commentaire). duh, erreur de noob., ils devraient tous les deux être true quand vous le rendez ouvert au public (reads). Merci d'avoir signalé votre propre erreur, vous m'avez aidé à la comprendre. Pour mémoire, j'ai changé ma règle en ceci : ".read" : true et ça a commencé à fonctionner.

92voto

J'étais confronté à un problème similaire et j'ai découvert que cette erreur était due à des règles incorrectes définies pour les opérations de lecture/écriture pour la base de données en temps réel. Par défaut, google firebase charge actuellement le cloud store et non la base de données en temps réel. Nous devons passer en temps réel et appliquer les règles correctes.

enter image description here

Comme nous pouvons le voir, il est indiqué que le cloud Firestore n'est pas une base de données en temps réel, une fois la base de données correcte activée, appliquez les règles ci-dessous :

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

45voto

lilhamad Points 169

Allez à l'option "Base de données" que vous avez mentionnée.

  1. Dans l'en-tête bleu, vous trouverez une liste déroulante indiquant Cloud Firestore Beta.
  2. Changez-le en "Base de données en temps réel"
  3. Allez dans Règles et mettez .write .read tous les deux à true.

Copié de ici .

10voto

Jaywant Narwade Points 51

Allez dans la base de données, à côté du titre il y a 2 options :

Cloud Firestore, base de données en temps réel

Sélectionnez la base de données en temps réel et allez dans les règles

Changez les règles en vrai.

4voto

Ondřej Bauer Points 81

OK, mais vous ne voulez pas ouvrir toute la base de données en temps réel ! Vous avez besoin de quelque chose comme ça.

{
  /* Visit https://firebase.google.com/docs/database/security to learn more about security rules. */
  "rules": {
    ".read": "auth.uid !=null",
    ".write": "auth.uid !=null"
  }
}

ou

{
  "rules": {
    "users": {
      "$uid": {
        ".write": "$uid === auth.uid"
      }
    }
  }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X