我们如何为 Firebase 存储编写依赖于 Firebase 实时数据库中的值的安全规则? [复制]

Posted

技术标签:

【中文标题】我们如何为 Firebase 存储编写依赖于 Firebase 实时数据库中的值的安全规则? [复制]【英文标题】:How can we write a security rule for Firebase Storage that is dependent on a value in the Firebase Realtime Database? [duplicate] 【发布时间】:2021-09-20 23:24:12 【问题描述】:

我希望仅当 Firebase 实时数据库中某个节点的值为 true 时才允许对 Firebase 存储中的文件的读取权限。有可能这样做吗?如果是,那么如何?

【问题讨论】:

google.com/… 【参考方案1】:

目前这是不可能的。您必须使用Cloud functions 或您自己的服务器使用Admin SDK 来执行此操作。

Admin SDK 基本上可以完全访问您的 Firebase 项目的资源,因此您可以检查您在 Admin SDK 中寻找的值是否存在。如果是,则继续获取签名的 URL(或您要从存储中查找的数据),否则返回错误。

一个简单的云函数是这样的:

exports.getStorageData = functions.https.onCall((data, context) => 
  const uid = context.auth;
  const fileName = data;

  if (!uid) return error: "User not authorized!"

  // Read for data in realtime database
  const dbRef = admin.database().ref("/path/to/data");

  if ((await dbRef.once("value")).val()) 
    return error: "Required Value is not true"
  

  //Get signed URL or any data from storage
  const storageRef = admin.storage().bucket()
  //.....
  return data: "..."
);

您需要使用诸如服务器或函数之类的安全环境,因为只有客户端验证是不安全的。但是您数据库中的true 值是否类似于角色或任何东西?您可以尝试在Custom Claims 中添加这些内容。我不完全确定您的用例,但如果它允许访问特定文件夹或其他内容,那么您可以添加声明the_folder_id: true。如果用户可以访问大量文件夹,这不是最佳解决方案。在这种情况下,您可以按照documentation 中的说明分配组。但是满足您的需求,那么您可以尝试以下安全规则。

// Allow reads if the group ID in your token matches the file metadata's `owner` property
// Allow writes if the group ID is in the user's custom token
match /files/groupId/fileName 
  allow read: if resource.metadata.owner == request.auth.token.groupId;
  allow write: if request.auth.token.groupId == groupId;

【讨论】:

以上是关于我们如何为 Firebase 存储编写依赖于 Firebase 实时数据库中的值的安全规则? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何为每个用户提供 Firebase 存储中的特定文件夹

如何为 Firebase Dynamic Link Analytics Rest API (NodeJS) 获取正确的访问令牌

如何为 Alpine 编译 python?

Firebase 存储规则,Libre Office contentTypes

如何为“类似boost”的多组件库编写cmake模块?

如何为 Firebase (Kotlin) 创建自定义身份验证