我正在运行一个云函数来保存这样的图像:
//Pseudocode
const admin = await import("firebase-admin");
const bucket = admin.storage().bucket();
const file = bucket.file('myName');
const stream = file.createWriteStream({ resumable: false });
...
图片上传后,我得到了这样的publicUrl
file.publicUrl()
并将其存储在对象中。
然后该对象被存储到 firestore。
当我现在从对象复制这个 url 时(url 结构如下所示)
https://storage.googleapis.com/new-project.appspot.com/ZWHpYGSQWYXLlUcAwkRFQLC0u7s1/f2a48bdc-7eb3-4174-9f6e-3fd963003bd7/177373254.png
并将其粘贴到浏览器字段中时出现错误:
<Error>
<Code>AccessDenied</Code>
<Message>Access denied.</Message>
<Details>Anonymous caller does not have storage.objects.get access to the Google Cloud Storage
object.</Details>
</Error>
即使有测试规则:
service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
allow read: if true;
allow write: if false;
}
}
}
我在 stackoverflow 上阅读了一些问题,这似乎是因为我使用的是 google 云存储桶而不是 firebase 存储桶(我认为它们是相同的)
但我对在这种情况下如何编写规则感到非常困惑,这样只有经过身份验证的 Firebase 用户才能读取文件。
非常感谢任何帮助。
最佳答案
Firebase 和 Cloud Storage 共享存储桶,但访问存储桶的方式却截然不同。
当您通过 Firebase SDK 或通过 Firebase SDK 生成的下载网址访问存储桶时,您的访问将通过 Firebase 层进行。该层强制执行安全规则(针对 SDK),并授予对下载 URL 的临时只读访问权限。
当您通过 Cloud SDK 或 Cloud SDK 生成的签名网址访问存储桶时,您的访问不会经过任何 Firebase 层,因此 Firebase 安全规则不会影响此访问。
您拥有的公共(public) URL 只是识别 Cloud Storage 存储分区中文件的一种方式。它没有任何隐含的访问权限。您需要确保存储桶的 IAM 属性允许您希望用户拥有该文件的访问权限。
关于firebase - 如何根据用户auth uid授予对Google云存储桶的访问权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71026323/