注意:此问题已标记为 polymer
,因为Polymer库用于生成Javascript。
这个问题涉及两个不同但相关的问题,涉及Firebase安全性。在尝试使Firebase安全规则起作用时,问题1和问题2似乎表明了相反的现实和相反的结果。 (FWIW:Here is my prior unsuccessful attempt to write this question。)
Here is the live code in a JSBin
http://jsbin.com/hinehoyigo/edit?html,output
{ "rules": { ".read": true, ".write": true } }
{ "rules": { "users": { "$uid": { ".read": "auth != null && auth.uid === $uid", ".write": "auth != null && auth.uid === $uid" } } } }
{"key":"value"} to /users/ag69g401-f097-4171-bca4-927fd1a6e1f3/foo/bar
撰写auth={"provider":"anonymous","uid":"ag69g401-f097-4171-bca4-927fd1a6e1f3"}
/ /users /users/ag69g401-f097-4171-bca4-927fd1a6e1f3:.write: "auth != null && auth.uid === $uid" => true写是允许的。
答案 0 :(得分:2)
您正在使用Polymer firebase-auth
元素对Firebase进行身份验证。
<firebase-auth id="firebaseLogin"
user="{{user}}"
...
在幕后,它会调用Firebase.authAnonymously()
方法,该方法会对Firebase JavaScript SDK中的当前会话进行身份验证。
您正在使用以下方式写信给Firebase:
computeFbTargetJson: function(f) {
return f + '.json';
}
和
this.set('$.ajax.url' , this.fbTargetJson);
this.set('$.ajax.body' , JSON.stringify({
jquux: 'jbaz'
}));
this.$.ajax.generateRequest();
这是向Firebase发出AJAX请求,这意味着您正在使用Firebase's REST API。但由于这是一个常规的HTTP调用,它不会继续&#34;继承&#34;然后从Firebase JavaScript客户端进行身份验证。
要验证您的REST请求,您需要pass in an auth
parameter as documented in the Firebase documentation。您可以使用ref.getAuth().token
从Firebase参考中获取令牌。
Firebase数据库中的每个元素都可通过唯一的URL访问。您可以使用其中一个Firebase SDK访问它,也可以直接访问Firebase公开的REST API。
根据我从jsbin收集的内容,您使用以下方式写入Firebase:
computeFbTargetJson: function(f) {
return f + '.json';
}
和
this.set('$.ajax.url' , this.fbTargetJson);
this.set('$.ajax.body' , JSON.stringify({
jquux: 'jbaz'
}));
this.$.ajax.generateRequest();
这是向Firebase发出AJAX请求,这意味着您正在使用Firebase's REST API。该API文档的第一段解释了Firebase数据库URL如何映射到REST API:
我们可以将任何Firebase应用程序URL用作REST端点。我们需要做的就是将.json附加到URL的末尾,并从我们最喜欢的HTTPS客户端发送请求。
因此,为了使用REST API访问Firebase中的任何数据,您可以将.json
附加到该数据的网址。
当您使用Firebase Simulator时,操作类似于使用Firebase的JavaScript SDK。在这种情况下,您不应将.json
后缀放在URL的末尾。
因此,在https://mine.firebaseio.com/
处提供了Firebase数据库,假设您在/users/de01fc8104
处拥有用户个人资料。
https://mine.firebaseio.com/users/de01fc8104
https://mine.firebaseio.com/users/de01fc8104.json
您的两个问题都是由于您使用两种不同的方式访问Firebase:JavaScript SDK和REST API。虽然这两种方法可以一起使用,但您必须确保提供所需的信息。一般来说,如果您坚持使用一种从单个客户端访问Firebase的方式,您将获得更轻松的体验。
答案 1 :(得分:0)
@FrankvanPuffelen's answer转换为:
Use the <firebase-collection>
element's .add()
method在安全规则实施时从客户端向Firebase写入数据。从代码的角度来看,它更有效率,因为firebase-collection
会自动为您处理所有必需的身份验证令牌。