Firebase 数据库规则 - 允许未经身份验证的用户访问仅读取特定路径

Firebase Database rules - Give unauthenticated user access to ONLY read specific path

假设我的 Firebase 数据库规则如下所示:

"rules": {
".read": "auth != null",
".write": "auth != null"
  }

在我的应用程序中,我需要检查用户名是否已被占用,因此我需要在对用户进行身份验证之前这样做。我知道我可以做这样的事情:

"rules": {
".write": "auth != null",
"Users": {
  ".read": true
}
}

但是,如果我了解这些规则是如何正确工作的,这将使只有 "Users" 路径可读,默认情况下所有其他路径都将设置为 ".read": false。因此,我的问题是如何使经过身份验证的用户可读每条路径,并使未经身份验证的用户只能从路径 "Users" 读取数据,而不能读取其他任何内容。

当然,您可以使未经身份验证的用户可以读取数据库中的一个路径,但我不推荐这样做。允许任何人读取您所有用户的用户名并不理想。

另一种选择是您可以先创建一个用户,然后让他们在通过身份验证后选择用户名,但是您必须弄清楚您希望如何处理通过身份验证但在选择之前退出应用程序的用户一个用户名。

更好的选择是将 Cloud Functions for Firebase 与 HTTP 触发器一起使用,并将所需的用户名作为请求的一部分传递。该请求将包括对所需用户名的查询,并且响应将 return 用户名是否可用。它可能看起来像这样:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

exports.uniqueUsername = functions.https.onRequest((req, res) => {
    const username = req.query.username
    admin.database().ref('users').orderByChild('username').equalTo(username)once('value').then(snap => {
        // if the child exists, then the username is taken
        if (snap.exists()) {
            res.send('username not available');
        } else {
            res.send('username available');
        }
    })   
}

如果您不熟悉 Cloud Functions for Firebase,请查看这些资源:

Getting Started with Cloud Functions for Firebase - YouTube

Cloud Functions for Firebase Documentation

Cloud Functions Samples

Timing Cloud Functions for Firebase using an HTTP Trigger and Cron - YouTube