0

J'utilise l'authentification anonyme avec mon application dans laquelle, lorsque l'utilisateur ouvre l'application, il s'authentifie et la session ne se termine pas une fois l'application fermée.Règles Firebase pour l'authentification anonyme

Je n'arrive pas à trouver comment coder les règles d'écriture en lecture. Ce que je voudrais, c'est que l'utilisateur puisse lire et écrire ses propres entrées sans voir d'autres utilisateurs.

J'ai réussi à authentifier l'utilisateur comme indiqué dans les journaux de la console ci-dessous.

Firebase Structure:

"rounds" : { 
    "-KBNYNvCAb-Wywq6yowW" : { 
     "Arrow1" : "1", 
     "Arrow2" : "1", 
     "Arrow3" : "2", 
     "Arrow4" : "2", 
     "Arrow5" : "1", 
     "Arrow6" : "1", 
     "Bow" : "Hoyt", 
     "Date" : 1456405827389, 
     "Distance" : "10m", 
     "RoundName" : "Dcedc", 
     "Season" : "Indoor", 
     "TotalScore" : 8, 
     "UID" : "9ddc8eb2-6f1a-4c26-bac3-b5b473104bb6" 

le code actuel dans l'écriture de lecture est:

{ 
    "rules": { 
    "rounds": { 
     "$rounds":{ 
     ".read": "auth.uid === data.child('UID').val()", 
      ".write": "auth.uid === data.child('UID').val()" 
     } 
     } 
    } 
} 

Cela ne fonctionne que dans le simulateur quand j'ajoute le nom de table généré de façon aléatoire dans l'URL, par exemple

rounds/-KBNYNvCAb-Wywq6yowW 

Le contrôleur pour obtenir l'UID est dans mon contrôleur ici:

 app.controller('scoreCtrl', function($scope, roundInfo, equipmentStore){ 
     ref.onAuth(function(authData) { 
      if (authData) { 
     $scope.rounds = roundInfo; 
     $scope.bow = roundInfo; 
     $scope.round = roundInfo; 
     $scope.date = new Date(); 
     $scope.addItem = function() { 
     $scope.round.$add({ 
      "RoundName": roundInfo.name, 
      "Distance": roundInfo.distance, 
      "Season": roundInfo.season, 
      "Date": this.date? this.date.getTime() : null, 
      "Bow": $scope.bow.title.title, 
      "Arrow1": roundInfo.arrow1, 
      "Arrow2": roundInfo.arrow2, 
      "Arrow3": roundInfo.arrow3, 
      "Arrow4": roundInfo.arrow4, 
      "Arrow5": roundInfo.arrow5, 
      "Arrow6": roundInfo.arrow6, 
      "TotalScore" : +roundInfo.arrow1 + +roundInfo.arrow2 + +roundInfo.arrow3 + +roundInfo.arrow4 + +roundInfo.arrow5 + +roundInfo.arrow6, 
      "UID": authData.uid 
        }); 
       }; 
      } 
     }); 
    }); 

usine ronde:

app.factory('roundInfo', function($rootScope, $firebaseArray) { 
    var roundRef = new Firebase("https://firebaseLink.firebaseio.com/rounds"); 
     roundInfo = {}; 
     roundInfo.name = ''; 
     roundInfo.bow = ''; 
     roundInfo.date = ''; 
     roundInfo.distance = ''; 
     roundInfo.season = ''; 
     roundInfo.arrow1 = ''; 

      return $firebaseArray(roundRef); 

});

Les contrôleurs d'authentification firebase:

 var ref = new Firebase("https://firebaseLink.firebaseio.com"); 
ref.authAnonymously(function(error, authData) { 
    if (error) { 
    console.log("Login Failed!", error); 
    } else { 
    console.log("Authenticated successfully with payload:", authData); 
    } 
    if (authData) { 
    console.log("user logged in") 
    } else { 
    console.log("user logged out:") 
    }  
}); 



    var ref = new Firebase("https://firebaseLink.firebaseio.com"); 
ref.onAuth(function(authData) { 
    if (authData) { 
    console.log("Authenticated with uid:", authData.uid); 
    } else { 
    console.log("Client unauthenticated.") 
    } 
}); 

Les journaux console confirment que l'utilisateur a été authentifié:

0  450893 log  Client unauthenticated. 
1  451712 log  Authenticated with uid:, 9ee68f25-d6ba-4902-9d83-329d0acf996e 
2  451713 log  Authenticated successfully with payload:, [object Object 
+0

également affiché: https://groups.google.com/forum/#!topic/firebase-talk/9VRyKIepMPs et https://www.reddit.com/r/Firebase/comments/47qhu1/question_firebase_rules_help/ –

+0

Vos mises à jour sont claires: vous essayez d'interroger 'rounds', mais personne n'a de droits de lecture sur' rounds'. Ma réponse explique pourquoi, mais c'est un doublon de ceux auxquels je suis lié. Par exemple: http://stackoverflow.com/questions/31249956/firebase-rules-cannot-access-to-each-node –

Répondre

1

Votre question manque des informations cruciales (par exemple quelle opération échoue), mais je vais prendre une supposition éclairée ici.

Vous essayez très probablement de lire à partir de rounds et de ne récupérer que les enfants auxquels l'utilisateur a accès. Quelque chose comme:

ref.child('rounds').on('child_added', function(snapshot) { 
    ... 
}) 

Ce n'est pas ainsi que les règles de sécurité Firebase fonctionnent.

Pour pouvoir lire ou interroger un emplacement, vous devez avoir l'autorisation de lecture à cet emplacement.

Le piège pour lequel vous êtes tombé est couvert sous la section rules are not filters dans la documentation Firebase. Donc, dans vos règles, puisque l'utilisateur n'a pas l'autorisation de lecture sur rounds, l'opération de lecture échouera.Ceci est l'une des raisons pour lesquelles il est souvent préférable de stocker les éléments sous l'utilisateur qui les possède:

user_rounds 
    "9ddc8eb2-6f1a-4c26-bac3-b5b473104bb6" 
    "-KBNYNvCAb-Wywq6yowW": true 
    ... 

Quelques questions portant sur le même problème:

0

Essayez d'ajouter des règles de lecture/écriture aux parents "rondes"

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