【问题标题】:Send data to Firebase anonymously匿名向 Firebase 发送数据
【发布时间】:2018-11-19 15:06:34
【问题描述】:

我希望匿名用户能够将数据发送到 Firebase,但不能删除或覆盖它。

这是我最近一直在使用的:

我的数据库规则:

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

我的javascript sn-p:

firebase.initializeApp({
    apiKey: "asdasd",
    databaseURL: "asdasd.firebaseio.com/"
});

var id = Math.random().toString(36).substr(2, 9);
var userData = 'hello';
var sendData = firebase.database().ref("data/" + id + "/").update({userData});

sendData.then(function() { console.log("data sent!") })

明显的问题是我在脚本中暴露了我的 apiKey,任何人都可以覆盖或删除数据。有什么切实可行的解决办法吗?

【问题讨论】:

  • 您无法更改 firebase 中的现有数据,您可以将新的匿名数据添加到 firebase。

标签: javascript firebase firebase-realtime-database firebase-security


【解决方案1】:

要只允许用户写入新数据而不更改现有数据,您可以在规则中执行此操作:

{
  "rules": {
    ".read": false,
    ".write": "!data.exists()"
  }
}

另见Firebase documentation on existing vs new data

我建议使用 Firebase 的内置 push() 方法来生成密钥,因为这会在不牺牲密钥不可猜测性的情况下为您的随机化器增加一些可预测性:

firebase.database().ref("data")
  .push({userData})
  .then(function() { console.log("data sent!") });

【讨论】:

  • 我尝试更新规则,但是当我尝试发布它时出现此错误:错误保存规则 - 第 4 行:!仅对布尔值进行操作。
  • 糟糕,我忘记了括号。在答案中添加它们。
【解决方案2】:

嘿,我认为你应该这样做

reference= FirebaseDatabase.getInstance().getReference("announcement");
                AbsAnnouncementmodel absAnnouncementmodel=new AbsAnnouncementmodel(receiver,announcement);
                reference.push().setValue(absAnnouncementmodel);

此处参考与 DatabaseRefence 相关的参考

【讨论】:

  • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性的 cmets 挤满你的代码,这会降低代码和解释的可读性!
猜你喜欢
  • 2018-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-29
  • 1970-01-01
相关资源
最近更新 更多