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

Firebase数据库规则-仅允许未经身份验证的用户访问特定于读取的路径,firebase,firebase-realtime-database,rules,Firebase,Firebase Realtime Database,Rules,假设我的Firebase数据库规则如下所示: "rules": { ".read": "auth != null", ".write": "auth != null" } "rules": { ".write": "auth != null", "Users": { ".read": true } } 在我的应用程序中,我需要检查用户名是否已被使用,因此我需要在验证用户之前进行检查。我知道我可以这样做: "rules": { ".read": "auth != null", ".wr

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

"rules": {
".read": "auth != null",
".write": "auth != null"
  }
"rules": {
".write": "auth != null",
"Users": {
  ".read": true
}
}
在我的应用程序中,我需要检查用户名是否已被使用,因此我需要在验证用户之前进行检查。我知道我可以这样做:

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

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

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

另一种选择是,您可以先创建一个用户,然后让他们在经过身份验证后选择用户名,但随后您必须确定如何处理经过身份验证但在选择用户名之前退出应用程序的用户

更好的选择是使用带有HTTP触发器的Firebase云函数,并将所需用户名作为请求的一部分传递。请求将包括所需用户名的查询,响应将返回用户名是否可用。它可能看起来像这样:

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');
        }
    })   
}
如果您不熟悉Firebase的云功能,请查看以下资源:


所谓每隔一条路径,您是指/Users/user1/name等用户内部的每隔一条路径吗?或者,您是指任何其他不包含用户的路径吗?为什么要这样做?没有理由检查是否使用了用户名-Firebase身份验证为您处理登录,不允许重复。听起来很棒!那我就去读云的功能了,非常感谢!