在Firebase Storage中如何不使用令牌访问URL

22

我有一个Firebase存储下载链接,例如:

https://firebasestorage.googleapis.com/v0/b/siren-5eee7.appspot.com/o/profile%2FC6jNlR0F4cZBPv7wF0REWUNVor33?alt=media&token=63a9130e-2ba6-4f38-ac3f-2231c54a1043

如何不带令牌参数访问此URL?

例如,如果我没有令牌访问上述链接,则会显示403错误,表示权限被拒绝。

我的Firebase存储安全规则如下:

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if request.auth != null;
    }
  }
}

这个文件位于/etc目录下。我该怎么做?

4个回答

31

试着改变规则:

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read;
      allow write: if request.auth != null;
    }
  }
}

11
规则已更改,但媒体代币仍然出现。有任何想法原因是什么? - blessing dickson
3
这不够好。改变那个规则也不会有任何影响。 - KennyAli

16
据我所了解,您想要将整个 bucket 公开。使用 Firebase 访问规则可能不是最好的选择,您可能希望通过 Google Cloud 存储层使 bucket 读取访问可用。
其中一个最简单的方法是使用Google Cloud Console Storage
选择 bucket,单击 bucket 进行配置并打开权限选项卡。 由于这是 Firebase 管理的 bucket,它会有谷歌称之为细粒度访问控制。不用担心,添加公共访问非常简单。 单击 "Add members" 按钮,然后在侧边栏中将 allUsers 添加为新成员,并将其赋予 Storage > Storage Object Viewer 的角色。您可以在Storage Docs中查看更多详细信息。
这将使该 bucket 可以通过<bucketname>.storage.googleapis.com公开查看。 如果您在 Firebase 中创建了与您拥有并验证过的域名匹配的额外 bucket 并在Google Search Console中进行了验证,您可以创建一个以自定义域名命名的 bucket,并使用指向c.storage.googleapis.com的自定义域名的 CNAME 让它公开访问。 (这仅适用于 HTTP,而不是 HTTPS)。您可以在Storage Endpoints Docs中查看更多详细信息,谷歌云的文档解释得比我好。希望这有所帮助!

1
太棒了!这是关于这个问题最简单、最好(也可能是唯一)的在线答案。 - KennyAli
为什么这不是正确的答案?这个方法是有效的。进入存储桶,打开它,选择权限选项卡,查找授权访问。从下拉菜单中选择allUsers,并将角色选择为Cloud Storage > Storage Object Viewer。然后会出现有关使存储桶公开的警告。 - Trilochan Satapathy
我认为它是 "allUsers",复数形式? - B''H Bi'ezras -- Boruch Hashem
是的,应该是allUsers。我正在编辑答案。 - therealbene

9

如果您需要规则仅允许无令牌访问图片,则需要执行以下操作:

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read: if request.auth!=null || resource.contentType.matches('image/.*');
      allow write: if request.auth!=null;
    }
  }
}


4
如果您需要访问某个没有令牌参数的 URL(图像),请使用以下规则:
rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {
    match /images/users/default.png {
      allow read;
    }
    match /{allPaths=**} {
      allow read, write: if request.auth != null;
    }
  }
}

如果您需要在不使用令牌参数的情况下访问特定文件夹,请使用以下规则:
rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {
    match /images/{wildcardpath=**} {
      allow read;
    }
    match /{allPaths=**} {
      allow read, write: if request.auth != null;
    }
  }
}

注意:将url或文件夹更改为您自己的


这里有一个有用的指南:https://www.techotopia.com/index.php/A_Guide_to_Firebase_Cloud_Storage_Security_Rules - David Jesus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接