【问题标题】:How to limit a firebase database 'write' instruction to only allow a specific userID?如何将 firebase 数据库“写入”指令限制为仅允许特定的用户 ID?
【发布时间】:2021-07-04 01:00:14
【问题描述】:

我正在编写一个 firebase 数据库应用程序,它允许以每秒一个像素的速率通过 firebase 发送网络摄像头图像。然后在另一个网站上读取数据库,该网站将像素重新组合成图像。

数据库只是一个 x,y 位置和 r,g,b 值。

var db;
var dbname = 'webcam';
var data = {
  x : 0,
  y : 0,
  r : 0,
  g : 0,
  b : 0
};

所以每次只有一个像素存储在数据库中。要将数据发送到数据库,我使用这个 javascript 函数:

function updateDB(x,y,r,g,b){
  data.x = x;
  data.y = y;
  data.r = r;
  data.g = g;
  data.b = b;
  if(db != null){ db.ref(dbname).set(data); } 
}

数据库已经这样实例化了

function setupFirebase() {
  var firebaseConfig = {
    apiKey: "XXXXXXXXXXXXXXXXXX",
    authDomain: "XXXXXXXX.firebaseapp.com",
    projectId: "XXXXXXXXXX",
    databaseURL: "https://XXXXXXXXXXXX-default-rtdb.europe-west1.firebasedatabase.app/",
    storageBucket: "XXXXXXXXXXX.appspot.com",
    messagingSenderId: "XXXXXXXXXXXXXXXXX",
    appId: "XXXXXXXXXXXXXXXXXXXXXX"
  };
  // Initialize Firebase
  firebase.initializeApp(firebaseConfig);
  db = firebase.database();
}

数据库规则完全开放:

{
  "rules": {
    ".read": "true",  
    ".write": "true"
  }
}

这是有效的——我可以使用这个 javascipt 函数从数据库中读取数据。数据被放入 webcam[][] 数组并在浏览器窗口中绘制到屏幕上。

db.ref(dbname).on("value", function gotdata(newdata) {
  fbdata = newdata.val();
  if (fbdata != null) {
    //send data to the image grid
    var x = fbdata.x;
    var y = fbdata.y;
    var r = fbdata.r;
    var g = fbdata.g;
    var b = fbdata.b;
    //console.log("webcam data arrived = ", x, y, r, g, b);
    webcam[x][y] = r;
    webcam[x][y] = g;
    webcam[x][y] = b;
  }
});

这就是问题所在。我想添加身份验证,以便只有我可以从我的网络应用程序发送像素信息。我希望任何人都能够阅读图像,但只有我可以写图像。我在 Firebase 中使用电子邮件 + 密码身份验证生成了一个用户 ID,这给了我一个用户 ID,例如 =“12345678901234567890”。

在数据库规则中,我将规则设置为:

{
  "rules": {
    ".read": "true",  
    ".write": "auth.uid === '12345678901234567890'"
  }
}

它只是按预期在浏览器中生成错误消息。

Uncaught (in promise) Error: PERMISSION_DENIED: Permission denied
    at Repo.ts:751
    at Ft (util.ts:539)
    at Ki.callOnCompleteCallback (Repo.ts:741)
    at Repo.ts:463
    at PersistentConnection.ts:613
    at Mi.onDataMessage_ (PersistentConnection.ts:648)
    at xi.onDataMessage_ (Connection.ts:314)
    at xi.onPrimaryMessageReceived_ (Connection.ts:306)
    at Pi.onMessage (Connection.ts:203)
    at Pi.appendFrame_ (WebSocketConnection.ts:275)

问题是在将像素发送到数据库的 javascript 应用程序中,我应该在哪里使用此用户 ID?如何让数据库知道我有一个有效的用户 ID?我是在 firebaseConfig() 中执行一次,还是每次发送一条像素数据时都需要发送?

我在 Firebase 参考中找不到这个简单事务的明确示例。

谢谢

【问题讨论】:

    标签: javascript firebase-realtime-database firebase-security


    【解决方案1】:

    要为您的安全规则中的auth.uid 变量赋值,您需要使用Firebase Authentication 登录。由于您似乎并不真正关心凭据,因此您可以匿名身份验证,记录用户的 UID,然后将该值放入您的安全规则中。

    登录后,Firebase SDK 会在每次连接时自动发送用户的 ID 令牌,然后服务器将验证该 ID 令牌,并在 auth 中传递信息(包括 UID)安全规则的变量。

    【讨论】:

    • 谢谢。所以我已经完成了第一部分:将 userID 放入安全规则中。现在在一个基于 web 的 javascript 应用程序中,我想访问数据库。我执行通常的 firebaseConfig 并初始化应用程序,但我如何告诉 firebase 我正在使用我的用户 ID?我不需要登录,因为只有一个用户——我。我可以直接给它在控制台中生成的 userId。
    • 我想做一些类似的事情 - firebase.initializeApp(firebaseConfig, myUserID);
    • 您问题中的代码未显示您正在使用 Firebase 身份验证登录。只有在您使用 Firebase 身份验证登录用户后,安全规则中的 auth 变量才会获得一个值。请查看我在回答中链接的文档,了解如何使用 Firebase 身份验证登录。
    猜你喜欢
    • 1970-01-01
    • 2020-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-14
    • 2018-02-01
    • 2022-01-09
    • 1970-01-01
    相关资源
    最近更新 更多