如何根据用户 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 属性允许您希望用户对文件进行访问。