Emi*_*zen 4 firebase firebase-security google-cloud-functions firebase-storage
我确定我遗漏了一些关于 Firebase 存储规则的内容,但我已经完成了以下操作:
第1步
首先,我设置了以下 Firebase 存储规则:
service firebase.storage {
match /b/{bucket}/o {
match /items/{dev_key}/{perm_id}/{file_name} {
allow write: if request.auth.uid == dev_id;
allow read: if request.auth.token.permId == perm_id;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我希望只有具有与相关位置匹配的自定义声明 permId 的登录用户才能下载文件, allow read: if request.auth.token.permId == perm_id;.
因此,我随后在 Cloud Functions中为用户设置了自定义声明,如下所示:
第2步
admin.auth().setCustomUserClaims(uid, {permId: '1'}).then(() => {
// send off some triggers to let user know the download is coming
admin.database().ref(`collection/${uid}/${itemId}`).update({
downloadReady: true
});
});
Run Code Online (Sandbox Code Playgroud)
然后我将用户注销并再次登录......这设置了自定义声明。我检查了它们在 Cloud Functions 中的设置如下:
第 3 步
admin.auth().verifyIdToken(idToken).then((claims) => {
console.log("--------------claims -------------");
console.log(JSON.stringify(claims));
});
Run Code Online (Sandbox Code Playgroud)
我在索赔字符串中看到... permID: "1"
在客户端,我然后请求了一个 downloadURL(希望这里是我出错的地方)......我希望这不是公共下载 url,而是 Firebase 存储安全规则将检查的下载 url:
第四步
var pathReference = storage.ref('items/<some-key>/1/Item-1');
pathReference.getDownloadURL()
.then((url)=>{
console.log("url: ", url);
})
Run Code Online (Sandbox Code Playgroud)
我从这个电话中收到的网址给了我这个链接 https://firebasestorage.googleapis.com/v0/b/emiru84-games.appspot.com/o/games%2FcfaoVuEdJqOWDi9oeaLLphXl0E82%2F1%2FGame-1?alt=media&token=4365 -924a-4a7e-b51d-00774d8986a0 (我用于测试的一个小图像)
到目前为止一切顺利,拥有正确声明的用户能够查看此图片
然后我重复了第 2 步,再次注销/登录,但这次的 permId 为“0”。我希望之前生成的 url 不再有效,因为我的用户不再有正确的自定义声明......并且存储桶位置仍然在相同的位置 (bucket/dev_key/1/filename) 但它仍然有效。
如果我重复第 4 步,我会得到一个新的 url,然后给出相应的 403 错误响应。但是旧的 url 仍然有效(我想只要附加了 token 参数)。这是预期的吗?如果是这样,我不确定我是否理解如果下载 url 是公开的,存储安全规则如何产生影响?
任何帮助清除我模糊的大脑的帮助将不胜感激。
Cloud Storage for Firebase 中的下载 URL 始终是公开可读的。它不受安全规则的影响。
如果您不想允许公众访问某个文件,则可以撤销其下载 URL。
| 归档时间: |
|
| 查看次数: |
1122 次 |
| 最近记录: |