javascript - 为什么经过身份验证的实时数据库写入会阻止在可公开写入的 Firebase 数据库中进行未经身份验证的写入?
问题描述
我的实时数据库规则是
{
".read": "auth.uid == 'mySpecificUID'",
".write": "auth.uid == 'mySpecificUID'",
"somedata": {
".read": false,
".write": true
}
}
所以它只允许对我的帐户进行完整的读写。编辑:
我制作了两个网络应用程序,应用程序 1 在写入数据之前需要身份验证,而应用程序 2 不需要身份验证。
应用程序 1
<head>
<title>Test App 1</title>
</head>
<body>
<!-- The core Firebase JS SDK is always required and must be listed first -->
<script src="https://www.gstatic.com/firebasejs/8.6.2/firebase-app.js"></script>
<script src="https://www.gstatic.com/firebasejs/8.6.2/firebase-auth.js"></script>
<script src="https://www.gstatic.com/firebasejs/8.6.2/firebase-database.js"></script>
<!-- TODO: Add SDKs for Firebase products that you want to use
https://firebase.google.com/docs/web/setup#available-libraries -->
<script src="https://www.gstatic.com/firebasejs/8.6.2/firebase-analytics.js"></script>
<!-- fb init code -->
<script>
let firebaseConfig = {
// config values from CDN code
};
firebase.initializeApp(firebaseConfig);
firebase.analytics();
let database = firebase.database();
console.log("Log: firebase initialised");
</script>
<!-- auth + write code -->
<script>
function auth(email, password) {
firebase.auth().signInWithEmailAndPassword(email, password).then((userCredential) => {
let user = userCredential.user;
console.log ("Log: uid = " + user.uid);
// writing to db
let input = prompt("Enter string");
if (input == "" || input == null) {
console.error("Error: write(): Empty string entered");
return;
}
console.log ("Entered: " + input);
try {
database.ref("/somedata/").set({
"data": {
"value1": input
}
})
.catch (error => {
console.error("Error: write(): " + error);
});
console.log ("Log: write(): write success");
}
catch (error) {
console.error("Error: write(): " + error);
}
})
.catch((error) => {
console.error("Error: auth(): " + error.message);
});
}
</script>
</body>
应用 2
<head>
<title>Test App 2</title>
</head>
<body>
<!-- The core Firebase JS SDK is always required and must be listed first -->
<script src="https://www.gstatic.com/firebasejs/8.6.2/firebase-app.js"></script>
<script src="https://www.gstatic.com/firebasejs/8.6.2/firebase-auth.js"></script>
<script src="https://www.gstatic.com/firebasejs/8.6.2/firebase-database.js"></script>
<!-- TODO: Add SDKs for Firebase products that you want to use
https://firebase.google.com/docs/web/setup#available-libraries -->
<script src="https://www.gstatic.com/firebasejs/8.6.2/firebase-analytics.js"></script>
<!-- fb init code -->
<script>
let firebaseConfig = {
// config values from CDN code
};
firebase.initializeApp(firebaseConfig);
firebase.analytics();
let database = firebase.database();
console.log("Log: firebase initialised");
</script>
<!-- write code -->
<script>
function write() {
let input = prompt("Enter string");
if (input == "" || input == null) {
console.error("Error: write(): Empty string entered");
return;
}
console.log ("Entered: " + input);
try {
database.ref("/somedata/").set({
"data": {
"value2": input
}
})
.catch (error => {
console.error("Error: write(): " + error);
});
console.log ("Log: write(): write success");
}
catch (error) {
console.error("Error: write(): " + error);
}
}
</script>
</body>
首先我执行应用程序 1,验证自己,并写入一些数据。有用。
但是如果我使用应用程序 2,则不会写入数据并且不会弹出错误消息。
不应拒绝权限,因为规则允许任何人向其中写入数据somedata
(并且它不会拒绝权限,正如我之前提到的,不会弹出错误消息)。
我检查了数据是否从应用程序 2 写入任何其他数据库,但事实并非如此。
您可以从控制台执行这些功能。
解决方案
推荐阅读
- javascript - 使用javascript在字符串中查找顺序
- typescript - 如何告诉 Typescript 我已经对变量进行了空检查?
- asp.net-mvc - Razor 页面,检测 textview 中的文本变化
- .net - 管理服务未出现在 ISS 控制台上
- arm-template - ARM模板中Array类型的参数
- windows - Windows 上的 sudo
- serverless-framework - 在 serverless(aws)中,如何从 serverless.yml 文件中获取变量引用?
- c# - 从名为“money”的脚本中调用名为“apple”的游戏对象数组脚本
- ruby-on-rails - 防止同一表的多个连接中的重复值
- encryption - iOS Swift - Virgil Security 用户已注册 - 未找到私钥