Autorisation Firebase refusée

123

Je suis relativement nouveau dans le 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, j'obtiens toujours l'erreur:

FIREBASE WARNING: set at / users / (GoogleID) failed: permission_denied 2016-05-23 22: 52: 42.707 firebase.js: 227 Uncaught (in promise) Erreur: PERMISSION_DENIED: Permission refusée (…)

Quand j'essaye de chercher ceci, il parle des règles pour Firebase, qui semble être dans une langue que je n'ai pas encore apprise (ou ça me dépasse). Quelqu'un peut-il expliquer ce qui cause le problème? Je pensais que c'était parce que je demandais qu'il stocke les e-mails et le nom d'affichage de l'utilisateur et que vous n'étiez tout simplement pas autorisé à le faire, mais lorsque je les ai retirés, j'ai toujours eu le même problème. Y a-t-il un moyen d'éviter cette erreur sans fixer les règles, ou les règles sont-elles quelque chose que je peux m'apprendre à écrire en un jour, ou suis-je juste en dehors de ma ligue?

Merci pour toute aide!

Robert Prine
la source

Réponses:

250

Par défaut, la base de données d'un projet dans la console Firebase n'est lisible / inscriptible que par les utilisateurs administratifs (par exemple dans Cloud Functions ou les processus qui utilisent un SDK Admin). Les utilisateurs des SDK côté client standard 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 afin que la base de données ne soit lisible / inscriptible que par les utilisateurs authentifiés:

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

Consultez le guide de démarrage rapide pour les règles de sécurité de la base de données Firebase .

Mais comme vous ne connectez 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 l'accès non authentifié à votre base de données, soit vous connecter à l'utilisateur avant d'accéder à la base de données.

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

La solution de contournement 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 pour 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 inscriptible par quiconque connaît l'URL de la base de données. Assurez-vous de sécuriser à nouveau votre base de données avant de passer en 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 longue, mais plus sécurisée, appelez l'une des signIn...méthodes d' 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 d' utiliser l'authentification anonyme :

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

Et puis attachez vos écouteurs 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.
    // ...
  }
  // ...
});
Frank van Puffelen
la source
1
Merci - a utilisé le correctif non sécurisé et cité votre réponse dans une réponse à une question similaire pour progresser au-delà des problèmes d'autorisation Firebase dans ce didacticiel Ember . Mais où ajoutons-nous le code d'authentification anonyme (sécurisé)?
Dave Everitt
2
OMG il va une heure. J'avais ça dedans mais les valeurs étaient FAUX ... Je l'ai juste oublié. Changé leur en TRUE et bam, l'application fonctionne comme vous le pensez ...
Andy
OMG, moi aussi, je n'ai pas pu comprendre pourquoi ils échouaient sur les autorisations alors qu'ils étaient tous les deux déjà définis sur false (jusqu'à ce que je lis votre commentaire). duh, noob erreur., ils devraient tous les deux être vrais lorsque vous le rendez ouvert au public (lit). Merci d'avoir signalé votre propre erreur, vous m'avez aidé à comprendre. Pour mémoire, j'ai changé ma règle en ceci: ".read": true et puis ça a commencé à fonctionner.
Contractorswolf
@Andy Merci mec, pareil pour moi et voir ton commentaire vient de résoudre mon problème;)
Mahmudul Hasan Sohag
86

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 de nos jours le cloud store et non la base de données en temps réel. Nous devons passer au temps réel et appliquer les bonnes règles.

entrez la description de l'image ici

Comme nous pouvons le voir, il est dit que cloud Firestore n'est pas une base de données en temps réel, une fois basculé vers la base de données correcte, appliquez les règles suivantes:

{
   "rules": {
       ".read": true,
       ".write": true
     }
 }
juste-être-bizarre
la source
3
Merde UI! J'ai passé toute la journée à comprendre pourquoi j'ai des règles différentes ... Ah ... C'était pour "cloud firestore" ... Merci!
Alexey Volodko
43

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

  1. Là, sur l'en-tête bleu, vous trouverez une liste déroulante qui indique Cloud Firestore Beta
  2. Changez-le en "Base de données en temps réel"
  3. Accédez à Règles et définissez .write .read both sur true

Copié à partir d' ici .

Ahmed Adewale
la source
11

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 Base de données en temps réel et accédez aux règles

changer les règles en vrai.

Cela a résolu mon problème.

Jaywant Narwade
la source
4
  1. Ouvrez Firebase, 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 changez les règles en: {"rules": {".read": true, ".write": true}}

Ça marche..!!

Anindya Sankar Dasgupta
la source
5
Cela a déjà été dit dans l'autre réponse. Aussi, lorsque vous suggérez cela, assurez-vous d'ajouter un avertissement car ce n'est pas enregistré!
André Kool
4

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"
      }
    }
  }
}
Ondřej Bauer
la source
1

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 en utilisant 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);
        });
}
Parampal Pooni
la source
C'est vraiment mauvais pour la sécurité.
ASH le