Firebase数据库权限被拒绝错误

时间:2017-07-20 21:15:15

标签: javascript firebase firebase-realtime-database

我正在制作一个显示活动的应用。我创建了一个页面,其中显示了事件的摘要以及指向完整事件详细信息的链接。我在文档中读到可以通过将.json添加到URL(https://firebase.google.com/docs/reference/rest/database/)来检索数据库对象。我的应用程序使用JavaScript构建指向每个对象的链接,但是当单击链接时,即使我以用户身份登录应用程序,也会收到权限被拒绝错误。有谁知道如何解决这个问题? 我在Codepen上有一个应用程序演示:https://codepen.io/heresnova/pen/VWoxXr。请注意,您必须在登录应用程序后刷新页面才能查看内容。

基本上我要做的就是创建一个"阅读更多"链接到完整数据库对象的展开视图。有谁知道如何使用Firebase执行此操作?

以下是相关的JavaScript代码:

var events = firebase.database().ref("events");

    // displays event listings 
    events.on('value', function(snapshot) {
        snapshot.forEach(function(childSnapshot) {
        var eventkey = childSnapshot.key;
        var eventdata = childSnapshot.val();
        var browseId = eventkey.toString(); 
        var showcards = document.getElementById('showcards');

        // listing data to be displayed
        var browseTitle = childSnapshot.val().title;
        var browseDate = childSnapshot.val().starttime;
        var browseCity = childSnapshot.val().city;
        var browseCost = childSnapshot.val().price;
        var dbUrl = "https://authtest-54513.firebaseio.com/events/";
        var addJson = ".json";
        var evUrl = dbUrl+eventkey+addJson;
          // event card
        var card = document.createElement('div');
        card.setAttribute('class', 'card'); // assign class card to div for css styling
        showcards.appendChild(card);


          // display all listings on page
        var cardtitle = document.createElement('p'); 
          cardtitle.setAttribute('id', 'evdata'); 
        cardtitle.innerHTML = browseTitle + " " + " " + browseCity + " " + "£" + browseCost;
        card.appendChild(cardtitle);  

          var showUrl = document.createElement('a');
          showUrl.setAttribute('href', evUrl);
         // showUrl.innerHTML = "more...";
          showUrl.innerHTML = evUrl;
          card.appendChild(showUrl);

        console.log(eventdata);
  });  // end foreach childSnapshot function
}); // end events.on function

我的安全规则:

{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null",
      "user-events": {
        ".indexOn": ["uid"],
        "$uid": {
          ".read": "auth != null && auth.uid == $uid",
          ".write": "auth != null && auth.uid == $uid"
        }
    }
  }
}

1 个答案:

答案 0 :(得分:1)

当您通过firebase SDK发出请求时,它通过向每个请求传递一个令牌(一条包含有关您的会话信息的信息)来保持身份验证状态。当您切换authenticated时,您可以在模拟器中看到此示例。

当您尝试打开https://authtest-54513.firebaseio.com/events/-KnP3MkFt5559uP1w5fh.json这样的直接链接时,您正在发出GET请求但是您没有传递任何令牌来验证您的身份,因此如果您的安全规则阻止用户采取任何操作,这将无效未经过身份验证的人(auth != null)。

无论如何,我认为这是一件非常奇怪的事情,https://authtest-54513.firebaseio.com/events/-KnP3MkFt5559uP1w5fh.json处的json包含与变量eventdata中相同的数据。 您可以使用JSON.stringify(eventdata)来获取单击链接所使用的相同字符串,或者将eventdata作为javascript对象进行迭代,并创建一个漂亮的html模板。

开发一款您通常不需要使用REST API的应用,但如果您想使用它们,您可能需要查看auth section