【发布时间】:2021-10-28 05:50:24
【问题描述】:
我正在使用 AngularFire 和 Firebase 8.10.0 访问存储中的文件(要在 IMG 中使用的头像图像 - 所以是 URL)。
编辑:失败的代码 - 获取文件是通过
<img [src]='user.photoURL'>
这会导致 403 GET 错误:
images%2FIFjwtbvRjwbeIVYJlCYuHMdhfTA3%2FphotoURL.jpg:1 GET https://firebasestorage.googleapis.com/v0/b/kuyua-2199c.appspot.com/o/images%2FIFjwtbvRjwbeIVYJlCYuHMdhfTA3%2FphotoURL.jpg?alt=media&token=e2d7e4ac-477b-4e79-8f7b-ece826f9b67a 403
以及给出的网址:
{
"error": {
"code": 403,
"message": "Permission denied. Could not perform this operation"
}
}
Firebase 存储规则是:
rules_version = '2';
service firebase.storage {
match /b/{bucket}/o {
match /images/{userId}/{imageId} {
allow write: if request.resource.size < 0.5 * 1024 * 1024
&& request.resource.contentType.matches('image/.*')
&& request.auth.uid == userId;
allow read: if request.auth != null;
}
}
}
一些尝试:
-
如果我更改为以下内容,则 URL 会完美加载:
允许读取:如果为真;
知道之前关于 auth 和 rules 的问题,我想知道 null 测试是否可行,但这也不会产生任何结果
allow read: if request.auth == null;
使用模拟器,规则正常运行。
- 再试一次:
一探究竟
是否给出了图片,让我想知道它实际上是改变行为的令牌(这是两个 url 之间的唯一区别)?那么,我的问题是如何关联到 Firebase 规则?
有人知道吗?
汤姆 (ps。写这篇文章的时候,我想我可能需要弄清楚为什么它对产品有用,但对头像不起作用,不过,欢迎大家帮忙)
【问题讨论】:
-
规则本身不做任何事情,所以我建议编辑你的问题以显示失败的最小代码。在这种情况下,在加载图像之前,我建议记录当前用户的 UID,因为这很可能是问题所在。
-
谢谢@FrankvanPuffelen。我编辑了这个问题。我认为我收到了错误,因为 downloadURL 上的令牌已更改。如果规则说“允许读取:如果为真”,是否会影响 firebase 查看令牌的方式? (正如你所说,规则不做任何事情)。让我也想知道request.auth的内容。我不确定是否可以检查那个。谢谢你的帮助。现在的规则是:允许读取:if imageId == "photoURL.jpg";效果很好
标签: javascript firebase-storage firebase-security angularfire