首页 > 解决方案 > 为什么经过身份验证的实时数据库写入会阻止在可公开写入的 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 写入任何其他数据库,但事实并非如此。

您可以从控制台执行这些功能。

标签: javascriptfirebasefirebase-realtime-databasefirebase-authenticationfirebase-security

解决方案


推荐阅读