request.auth != null 和 request.auth == null 不提供访问权限,其中 true 提供 - firebase 存储
Posted
技术标签:
【中文标题】request.auth != null 和 request.auth == null 不提供访问权限,其中 true 提供 - firebase 存储【英文标题】:request.auth != null and request.auth == null give no access, where true does - firebase stoarge 【发布时间】: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;
使用模拟器,规则正常运行。
-
再试一次:
一探究竟
https://firebasestorage.googleapis.com/v0/b/kuyua-2199c.appspot.com/o/images%2FIFjwtbvRjwbeIVYJlCYuHMdhfTA3%2FphotoURL.jpg?alt=media&token=84138d8a-b608-45d3-8f17-f9d22d24ae04
是否给出了图片,让我想知道它实际上是改变行为的令牌(这是两个 url 之间的唯一区别)?那么,我的问题是如何关联到 Firebase 规则?
有人知道吗?
汤姆 (ps。写这篇文章的时候,我想我可能需要弄清楚为什么它对产品有用,但对头像不起作用,不过,欢迎大家帮忙)
【问题讨论】:
规则本身不做任何事情,所以我建议编辑你的问题以显示失败的最小代码。在这种情况下,在加载图像之前,我建议记录当前用户的 UID,因为这很可能是问题所在。 谢谢@FrankvanPuffelen。我编辑了这个问题。我认为我收到了错误,因为 downloadURL 上的令牌已更改。如果规则说“允许读取:如果为真”,是否会影响 firebase 查看令牌的方式? (正如你所说,规则不做任何事情)。让我也想知道request.auth的内容。我不确定是否可以检查那个。谢谢你的帮助。现在的规则是:允许读取:if imageId == "photoURL.jpg";效果很好 【参考方案1】:下载 URL 提供对基础文件的公共只读访问权限。因此,通过下载 URL 访问 Cloud Storage 中的图像,不会导致检查安全规则。
如果工作 URL 和非工作 URL 之间的唯一区别在于其中的 token
,则很可能是通过 Firebase 控制台撤销了非工作 URL 的令牌。
【讨论】:
谢谢。如果您说 downloadURL 不会导致检查安全规则,我仍然想知道为什么当我在规则中检查 auth 时会收到损坏的 url,而当我将其设置为“允许读取:始终为真”时,链接有效。以上是关于request.auth != null 和 request.auth == null 不提供访问权限,其中 true 提供 - firebase 存储的主要内容,如果未能解决你的问题,请参考以下文章
Firestore 安全规则无法检索 request.auth.token.name
Firebase 规则如何获取“request.auth.uid”字段?
在 Cloud Firestore 规则中,request.auth.uid 似乎始终为空
在使用 Firestore 权限的本机应用程序(通过 Expo)中 - request.auth 始终为空