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 始终为空

无法将 request.auth.id 与 Firestore 规则中的文档 ID 匹配

nginx 第三方auth认证