【发布时间】:2023-03-21 22:18:01
【问题描述】:
是否可以在不使用getDownloadURL 或@firebase/storage 库的情况下私下在我的Web 应用程序中显示图像(<img/>)?
例如我尝试了以下规则:
rules_version = '2';
service firebase.storage {
match /b/{bucket}/o {
match /{userId}/images/{allPaths=**} {
allow write: if request.auth.uid == userId;
allow read: if request.auth.uid == userId;
}
}
}
我的 html 页面包含如下图像:
<img src="https://firebasestorage.googleapis.com/v0/b/{projectId}.appspot.com/o/{userId}/images/yolo.jpg?alt=media/>
此页面仅显示给经过身份验证的用户,但即使在成功登录后,当我尝试呈现上面显示的图像时,我仍然会收到 403。
我的猜测是 img https 请求不包含任何有关授权的信息,这就是它失败的原因。
因此我的问题是,有没有办法在不使用 Firebase 库下载图像/文件的情况下获取私有存储文件?
【问题讨论】:
-
您的 Web 应用程序是否在云中运行?如果没有,为什么不能只使用服务器本地磁盘中的图像并编写一些身份验证逻辑来提供图像?
-
感谢您的回复。应用程序在客户端运行,并且“我必须”将其从图像标签链接起来,因为 html 内容是由用户编辑的某个扩展名。
-
整个应用程序都在运行客户端,包括服务器/后端?我认为这些图像也是动态上传的,或者这些只是您想要显示但仅限于某些经过身份验证的用户的静态图像?您可以尝试在 AJAX/fetch 中请求图像数据,并将
<img>标记的源设置为您从获取图像时生成的 Base64 编码二进制数据 URI,这样您就可以完全控制发送来检索它的标头/cookie。 -
再次感谢。不幸的是,我不能真正通过 Ajax 进行查询,它必须是某种给定的静态图像标签(当然复杂性不同,但这是我可以缩小要求的方式)。
-
我认为没有任何易于访问的 URL 可以有效地“编码”其中可以在安全规则中检查的身份验证权限。我相信您可以想象这样的安全问题,即在它们打算使用的时间和空间之外共享这些 URL 的可能性。
标签: javascript firebase firebase-authentication firebase-storage firebase-security