了解 Firebase 存储令牌

Understanding Firebase Storage tokens

我正在尝试了解令牌在 Firebase 存储中的工作原理。

每当我的网络应用程序将图像上传到 FS 时,它都会向其 public url 添加一个令牌。问题是每当您将相同的图像文件上传到网络应用程序的另一部分时,似乎您没有得到另一个文件,而是已经上传的文件 url 的不同标记,因此呈现 403之前注册的图片显示错误。

有办法解决吗?

示例:

storageRef.put(picture.jpg);
uploadTask.snapshot.downloadURL 
// returns something like https://firebasestorage.googleapis.com/v0/b/<your-app>/o/picture.jpg?alt=media&token=09cb2927-4706-4e36-95ae-2515c68b0d6e

然后 url 显示在 img src 中的某处。

<img src="https://firebasestorage.googleapis.com/v0/b/<your-app>/o/picture.jpg?alt=media&token=09cb2927-4706-4e36-95ae-2515c68b0d6e">

如果用户重复此过程并在应用的另一部分上传相同的 picture.jpg,则文件不会在 Firebase 存储中获得全新的副本,而是会被 URL 结尾覆盖使用新令牌;说 12345.

所以:

 <img src="https://...picture.jpg?alt=media&token=12345"> // New upload renders fine
 <img src="https://...picture.jpg?alt=media&token=09cb2927-4706..."> // But old upload breaks because of wrong url

令牌对于特定版本的上传是唯一的。如果您用新内容覆盖该文件,则会生成一个新的令牌,其中包含一个新的无法猜测的 url.

换句话说,令牌对于特定的 blob 是唯一的——它们不是每个存储位置唯一的。我们这样做是为了加强安全措施,以确保开发人员和最终用户不会意外泄露他们不希望泄露的数据。

但是,您可以使用我们的 js SDK 将存储位置 ("gs://mybucket/myfile.png") 转换为下载 url。这样,您可以根据需要传递 gs uri 并将其转换为完整的 URL 一旦您想将其放入图像中。

参见:https://firebase.google.com/docs/reference/js/firebase.storage.Reference.html#getDownloadURL

对于 public 文件上传:如果您在 firebase 函数 中上传文件,您需要在引用对象上调用 makePublic() 以便无需有效令牌即可访问。