如何根据用户 auth uid 授予对 google 云存储桶的访问权限
How to grant access to google cloud storage buckets based on users auth uid
我是运行一个云函数,保存图片是这样的:
//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;
}
}
}
我在 Whosebug 上阅读了一些问题,这似乎是因为我使用的是 google 云存储桶而不是 firebase 存储桶(我认为它们是相同的)
但我很困惑在这种情况下如何编写规则,以便只有经过身份验证的 firebase 用户才能读取文件。
非常感谢任何帮助。
存储桶在 Firebase 和 Cloud Storage 之间共享,但您访问存储桶的方式却大不相同。
当您通过 Firebase SDK 或通过 Firebase SDK 生成的下载 URL 访问存储桶时,您的访问会通过 Firebase 层。该层执行安全规则(针对 SDK),并授予临时 read-only 访问下载 URL.
当您通过 Cloud SDK 访问存储桶或由 Cloud SDK 生成的签名 URL 时,您的访问不会通过任何 Firebase 层,因此 Firebase 安全规则对此访问没有影响.
您拥有的 public URL 只是一种识别 Cloud Storage 存储桶中文件的方法。它没有任何隐含的访问权限。您需要确保存储桶的 IAM 属性允许您希望用户对文件进行访问。
我是运行一个云函数,保存图片是这样的:
//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;
}
}
}
我在 Whosebug 上阅读了一些问题,这似乎是因为我使用的是 google 云存储桶而不是 firebase 存储桶(我认为它们是相同的)
但我很困惑在这种情况下如何编写规则,以便只有经过身份验证的 firebase 用户才能读取文件。
非常感谢任何帮助。
存储桶在 Firebase 和 Cloud Storage 之间共享,但您访问存储桶的方式却大不相同。
当您通过 Firebase SDK 或通过 Firebase SDK 生成的下载 URL 访问存储桶时,您的访问会通过 Firebase 层。该层执行安全规则(针对 SDK),并授予临时 read-only 访问下载 URL.
当您通过 Cloud SDK 访问存储桶或由 Cloud SDK 生成的签名 URL 时,您的访问不会通过任何 Firebase 层,因此 Firebase 安全规则对此访问没有影响.
您拥有的 public URL 只是一种识别 Cloud Storage 存储桶中文件的方法。它没有任何隐含的访问权限。您需要确保存储桶的 IAM 属性允许您希望用户对文件进行访问。