我们如何为 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 Dynamic Link Analytics Rest API (NodeJS) 获取正确的访问令牌