我正在创建约会React网络应用,用户可以将自己的照片上传到用户个人资料中。我想使用Firebase存储。我想保护图像,以便只有经过身份验证的用户从我的Web应用程序访问时才能查看它们 - 现在我得到这样的图像:
let storageRef = firebase.storage().ref(`images/${userid}/${userImageName}`);
// Get the download URL
storageRef.getDownloadURL().then(function(url) {
// Insert url into an <img> tag to "download"
})
这很棒 - 但是一旦我将URL放在图片标记的src属性中,任何查看源代码的人都可以复制URL并通过电子邮件,短信等发送它,使其成为"public"
。我尝试使用putString()
函数在 base64 字符串中上传图片,仅用于Firebase存储,再次使用put()
函数创建一个URL,就像普通图片上传一样
所以我的问题是 - 我可以使用Firebase存储来存储图像并使它们"private"
,以便只有经过身份验证的网络应用用户才能查看它们吗?有没有办法只获取图像数据并使用它来生成frontend/client
中的图像,以便在JS代码中没有放置实际的URL?
答案 0 :(得分:2)
对getDownloadURL()
的调用受安全规则保护,这意味着如果您编写如下规则:
service firebase.storage {
match /b/{bucket}/o {
match /images/{userId}/{userImageName} {
// any authenticated user can read the bytes or get a download URL
allow read: if request.auth != null;
// only the given user can upload their photo
allow write: if request.auth.uid == userId;
}
}
}
他们不允许未经身份验证的人下载网址。
关于第二个问题:一旦有人可以看到文件,假设他们已经下载/截屏并可以共享它,即使该URL不可公开访问(甚至在页面上)。查看某些东西相当于下载它,所以它的来源确实没有区别,因为最终结果可能是相同的。