Reactjs Firebase:如何要求auth列出所有节点,同时允许对单个节点进行匿名读/写?

Reactjs Firebase:如何要求auth列出所有节点,同时允许对单个节点进行匿名读/写?,reactjs,firebase-security,Reactjs,Firebase Security,我正在写一个邀请应用程序,并希望通过电子邮件向个人发送唯一的URL,例如 http://www.example.com/invitation.html?inviteID=-Jkbw6ycU7ZUOipmqlb5 HTML应用程序包含连接到特定Firebase的JavaScript,通过URL中的inviteID查找节点。例如: https://my-firebase-123@firebaseio.com/-Jkbw6ycU7ZUOipmqlb5 每个顶级节点大致如下所示 -Jkbw6ycU7

我正在写一个邀请应用程序,并希望通过电子邮件向个人发送唯一的URL,例如

http://www.example.com/invitation.html?inviteID=-Jkbw6ycU7ZUOipmqlb5
HTML应用程序包含连接到特定Firebase的JavaScript,通过URL中的inviteID查找节点。例如:

https://my-firebase-123@firebaseio.com/-Jkbw6ycU7ZUOipmqlb5
每个顶级节点大致如下所示

-Jkbw6ycU7ZUOipmqlb5: {
  email: 'joe@gmail.com',
  people: [
    {name: 'Joe', accept: true},
    {name: 'Jane', accept: false}
  ],
  comments: 'Jane can't make it, but I'm looking forward to it!'
}
这已经非常有效了!但我很难理解如何正确保护数据。我需要收件人继续能够在无需身份验证的情况下访问这些URL-任何提供节点ID的人都可以读写该节点及其子节点-但是我需要要求身份验证查看Firebase的顶层,以便受邀者无法查看(或修改!)在不知道其他受邀ID的情况下,任何其他人的响应。我该怎么做

{
  "rules": {
    ".read": ??
    ".write": ??
  }
}
我希望
.read
.write
都需要这样的规则:

componentWillMount: function() {
  var dbAddress = 'my-firebase-123@firebaseio.com/';
  this.firebaseRef = new Firebase(dbAddress + this.props.inviteId);

  this.firebaseRef.on("value", function(dataSnapshot) {
    this.setState(dataSnapshot.val());
  }.bind(this));
},

onSend: function() {
  this.firebaseRef.set(this.state);
},
您请求的是特定的子节点,而不是顶级节点;否则,您必须是授权用户(
auth!=null
)才能查看顶级节点

该应用程序是用ReactJS编写的,与Firebase的通信大致如下:

componentWillMount: function() {
  var dbAddress = 'my-firebase-123@firebaseio.com/';
  this.firebaseRef = new Firebase(dbAddress + this.props.inviteId);

  this.firebaseRef.on("value", function(dataSnapshot) {
    this.setState(dataSnapshot.val());
  }.bind(this));
},

onSend: function() {
  this.firebaseRef.set(this.state);
},

我一直在阅读各种firebase文档,试图找到类似的解决方案

假设您的firebase json结构如下所示:

{ Invitations: {
    -Jkbw6ycU7ZUOipmqlb5: {
        email: 'joe@gmail.com',
        people: [
            {name: 'Joe', accept: true},
            {name: 'Jane', accept: false}
        ],
        comments: 'Jane can't make it, but I'm looking forward to it!'
    }
    -Jkbw6ycU7ZUOipmqlb6: {
       ... another invitation ...
    }
    -Jkbw6ycU7ZUOipmqlb7: {
       ... another invitation ...
    }
}
我提供了以下安全配置,似乎可以满足您的要求:

{
    "rules": {
        ".read": false,
        ".write": false,
            "invitations": {
            "$inviteid": {
                ".read": true,
                ".write": true
            }
        }
    }
}
实际上,可能会推断出顶层读/写错误,因为如果我将配置设置为以下方式,它的工作方式似乎是相同的:

{
    "rules": {
            "invitations": {
            "$inviteid": {
                ".read": true,
                ".write": true
            }
        }
    }
}
现在,我似乎无法浏览邀请,因为如果我尝试在以下时间点挂载,则我的权限被拒绝(假设您的firebase地址为:

其中,安装在以下标高时,我可以进入:

this.firebaseRef = new Firebase('https://my-firebase-123@firebaseio.com/invitations/-Jkbw6ycU7ZUOipmqlb5');
不确定我所做的是否从安全角度实现了您的需求(即,它是否真的安全?)


非常感谢firebase专家社区对此方法的任何反馈。

感谢您查看此Craig。在您的示例中看到“邀请”一词是我理解这一点所需的线索。我看到rules对象的键精确映射到应用程序的路径,以及任何以“$”开头的键声明一个路径变量,该变量可以匹配任何单词,包括本例中的invite ID。我所要添加的是需要身份验证才能查看顶层,我认为这与声明
”一样简单。请阅读规则对象根目录下的“
。我将看看是否可以在我的应用程序中使用它。