Firebase数据库规则 - 授予未经身份验证的用户访问权限只读取特定路径

时间:2017-07-05 14:02:55

标签: firebase firebase-realtime-database rules

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

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

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

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

但是,如果我已经理解了规则如何正常工作,那么只会使“用户”路径可读,默认情况下,每个其他路径都将设置为".read": false。因此,我的问题是如何使经过身份验证的用户可以读取每个路径,并使未经身份验证的用户只能从“用户”路径中读取数据,而不是其他任何内容。

1 个答案:

答案 0 :(得分:1)

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

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

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

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