首页 > 解决方案 > Firebase Firestore / Realtime DB:只允许写入特定的管理员用户

问题描述

我已经设置了一个带有表单字段的基本客户端应用程序来输入一些数据。我在前端只使用来自 CDN 的 vanilla js 和 firebase SDK,没有任何类型的后端。我设法使用电子邮件/密码创建登录/注册,我可以将数据发送到 RealtimeDB 并取回数据。

现在,我想配置规则以仅使用我之前使用电子邮件注册的特定管理员用户(我)启用对数据库的写入访问权限。有没有办法只为我的电子邮件配置规则?或者也许是一些tokenID?当我登录时,我会得到一个 idToken(其中包含我的邮件,我猜我是唯一标识我的)。我可以以某种方式在后端数据库规则配置中检查我的邮件或该 tokenID 吗?我该怎么做?

这是我的注册/登录代码:

$("#register").submit(function(event) {
    event.preventDefault();
    let inputs = $("#register :input.form-control");
    console.log(inputs);
    var values = {};
    inputs.each(function() {
            values[this.name] = $(this).val();
    });

    axios.post(
        "https://identitytoolkit.googleapis.com/v1/accounts:signUp?key=XXXX",values)
    .then(res => console.log("auth result:",res))
    .catch(err => console.log(err));
})

$("#login").submit(function(event) {
event.preventDefault();
let inputs = $("#login :input.form-control");
console.log(inputs);
var values = {};
inputs.each(function() {
        values[this.name] = $(this).val();
});
console.log("values:", values);
axios.post(
    "https://identitytoolkit.googleapis.com/v1/accounts:signInWithPassword?key=XXXX",values)
.then(res => console.log("auth result:", res))
.catch(err => console.log(err));

})

获取:(相同的设置)但没有 idToken atm:

axios.get("https://XXX.firebaseio.com/XXX.json")
.then(result => console.log(result))
.catch(err => console.log(err));

顺便说一句,使用 tokenID 发出请求的正确 url 是什么?

标签: javascriptfirebasefirebase-authenticationfirebase-security

解决方案


编辑:我尝试发布我自己的解决方案,因为我使用来自谷歌的特定 REST 路由来启用登录和注册,我只能使用我已经注册的管理员专用电子邮件登录。然后,我取回一个可以在客户端解码的 idToken,因此我取回了一个 user.uid,我可以在前端硬编码该 uid(始终检查该 uid,然后才启用客户端公式编辑例如),我可以用它来传递 uid 和数据。然后,在 firebase 后端,我可以检查该 uid 是否与请求 uid 匹配(但我不确定它是如何发送的,也许是随请求自动发送的?)。

其次,我必须使用可能更简单的 auth SDK,但是我必须在前端显示我的 firebase 配置,但如果我限制只写给我,也许只对注册用户准备好,这可能没关系?但是该配置可用于创建任意新集合,对吗?有没有人知道解决方案?


推荐阅读