web-dev-qa-db-fra.com

Permission de base de feu refusée

Je suis relativement nouveau en codage et j'ai des problèmes.

J'ai ce code pour envoyer des 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 à avoir l'erreur:

AVERTISSEMENT FIREBASE: échec défini sur/users/(GoogleID): permission_denied 2016-05-23 22: 52: 42.707 firebase.js: 227 Non capturé (promis) Erreur: PERMISSION_DENIED: autorisation refusée (…)

Lorsque j'essaie de regarder cela, il parle de règles pour Firebase, qui semble être dans un langage que je n'ai pas encore appris (ou que je ne fais que passer par-dessus ma tête). Quelqu'un peut-il expliquer ce qui cause le problème? Je pensais que c’était parce que je lui demandais de stocker les courriels et le nom d’affichage de l’utilisateur. Vous n’êtes tout simplement pas autorisé à le faire, mais lorsque j’ai retiré ces informations, j’avais toujours le même problème. Existe-t-il un moyen d’éviter cette erreur sans fixer de règles, ou bien est-ce que je peux apprendre moi-même à écrire des règles en une journée, ou suis-je tout simplement sorti de ma ligue?

Merci pour toute aide!

93
Robert Prine

Par défaut, la base de données d'un projet de la nouvelle console Firebase est uniquement lisible/accessible en écriture par les 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 .

Puisque vous ne connectez pas l'utilisateur à partir de votre code, la base de données vous interdit d'accéder aux données. Pour résoudre ce problème, vous devez autoriser l'accès non authentifié à votre base de données ou vous connecter à 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 didacticiel soit mis à jour) consiste à accéder au panneau Base de données de la console de votre projet, à sélectionner l'onglet Règles et à remplacer le contenu par ces règles:

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

Cela rend votre nouvelle base de données lisible et accessible en écriture à toute personne connaissant l'URL de la base de données. Assurez-vous de sécuriser à nouveau votre base de données avant de commencer la production, sinon quelqu'un risque de commencer à en abuser.

Connectez-vous à l'utilisateur avant d'accéder à la base de données

Pour une solution (légèrement) plus lente, mais plus sûre, appelez l'une des méthodes signIn... de Authentification Firebase pour vous assurer que l'utilisateur est connecté avant d'accéder à la base de données. Le moyen le plus simple de le faire est en utilisant l'authentification anonyme :

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

Et puis attachez vos auditeurs lorsque la connexion 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.
    // ...
  }
  // ...
});
214

Je faisais face à 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 de nos jours la base de données Cloud Store en temps réel. Nous devons passer en temps réel et appliquer les règles appropriées.

enter image description here

Comme nous pouvons le voir, il est indiqué que la base de données Cloud Firestore n'est pas une base de données en temps réel. Une fois que vous avez basculé sur la base de données correcte, appliquez les règles ci-dessous:

{
   "rules": {
       ".read": true,
       ".write": true
     }
 }
WORKING!!
Go to the "Database" option you mentioned.

    1. There on the Blue Header you'll find a dropdown which says Cloud Firestore Beta
    2. Change it to "Realtime database"
    3. Go to Rules and set .write .read both to true

Let me know how it goes.
copied from
https://github.com/firebase/quickstart-js/issues/239
30
lilhamad

Aller à 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 aux règles

changer les règles en true.

Cela a résolu mon problème.

9
Jaywant Narwade
  1. Ouvrez la base de feu, sélectionnez la base de données sur le côté gauche.
  2. Maintenant sur le côté droit, sélectionnez [Base de données en temps réel] dans la liste déroulante et modifiez les règles en: {"rules": {".read": true, ".write": true}}

ça marche..!!

2

Une autre solution consiste à créer ou à connecter automatiquement l'utilisateur si vous disposez déjà des informations d'identification. Voici comment je le fais avec Plain JS.

function loginToFirebase(callback)
{
    let email = '[email protected]';
    let password = 'xxxxxxxxxxxxxx';
    let config =
    {
        apiKey: "xxx",
        authDomain: "xxxxx.firebaseapp.com",
        projectId: "xxx-xxx",
        databaseURL: "https://xxx-xxx.firebaseio.com",
        storageBucket: "gs://xx-xx.appspot.com",
    };

    if (!firebase.apps.length)
    {
        firebase.initializeApp(config);
    }

    let database = firebase.database();
    let storage = firebase.storage();

    loginFirebaseUser(email, password, callback);
}

function loginFirebaseUser(email, password, callback)
{
    console.log('Logging in Firebase User');

    firebase.auth().signInWithEmailAndPassword(email, password)
        .then(function ()
        {
            if (callback)
            {
                callback();
            }
        })
        .catch(function(login_error)
        {
            let loginErrorCode = login_error.code;
            let loginErrorMessage = login_error.message;

            console.log(loginErrorCode);
            console.log(loginErrorMessage);

            if (loginErrorCode === 'auth/user-not-found')
            {
                createFirebaseUser(email, password, callback)
            }
        });
}

function createFirebaseUser(email, password, callback)
{
    console.log('Creating Firebase User');

    firebase.auth().createUserWithEmailAndPassword(email, password)
        .then(function ()
        {
            if (callback)
            {
                callback();
            }
        })
        .catch(function(create_error)
        {
            let createErrorCode = create_error.code;
            let createErrorMessage = create_error.message;

            console.log(createErrorCode);
            console.log(createErrorMessage);
        });
}
1
Parampal Pooni