我正在制作一个显示活动的应用。我创建了一个页面,其中显示了事件的摘要以及指向完整事件详细信息的链接。我在文档中读到可以通过将.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"
}
}
}
}
答案 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