Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法获取Firebase存储安全规则以拒绝访问文件_Firebase_Firebase Storage_Firebase Security_Google Cloud Functions - Fatal编程技术网

无法获取Firebase存储安全规则以拒绝访问文件

无法获取Firebase存储安全规则以拒绝访问文件,firebase,firebase-storage,firebase-security,google-cloud-functions,Firebase,Firebase Storage,Firebase Security,Google Cloud Functions,我确信我缺少了一些wrt Firebase存储规则,但我做了以下工作: 第一步 首先,我设置了以下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.t

我确信我缺少了一些wrt Firebase存储规则,但我做了以下工作:

第一步

首先,我设置了以下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;
    }
  }
}
我希望只有具有与相关位置匹配的自定义声明permId的登录用户才能下载文件,
allow read:if request.auth.token.permId==perm\u id

因此,我随后对用户设置了如下设置:

步骤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
        });
    });
然后我注销了用户并再次登录。。。设置自定义声明。 我检查了它们是否设置在云函数中,如下所示:

步骤3

admin.auth().verifyIdToken(idToken).then((claims) => {
       console.log("--------------claims -------------");
       console.log(JSON.stringify(claims));
    });
我在索赔字符串中看到<代码>许可证:“1”

在客户端,我请求了一个下载URL(希望这里是我出错的地方)。。。我希望这不是公共下载url,而是Firebase存储安全规则将检查的下载url:

步骤4

var pathReference = storage.ref('items/<some-key>/1/Item-1');

pathReference.getDownloadURL()
.then((url)=>{
    console.log("url: ", url);
})
var pathReference=storage.ref('items//1/Item-1');
pathReference.getDownloadURL()
。然后((url)=>{
log(“url:,url”);
})
我从这个电话中收到的url给了我这个链接 (我用来测试的一个小图像)

到目前为止还不错,拥有正确声明的用户能够查看此图像

然后我重复了第2步,再次注销/登录,但这次的权限为“0”。我希望以前生成的url不再有效,因为我的用户不再具有正确的自定义声明。。。bucket位置仍然在同一位置(bucket/dev_key/1/filename),但仍然有效

如果我重复步骤4,我会得到一个新的url,然后给出相应的403错误响应。但是,旧的url仍然有效(我想只要添加了token参数)。这是预期的吗?如果是,我不确定我是否理解存储安全规则如何在下载url是公共的情况下发挥作用


如果有人能帮我扫清迷茫的大脑,我将不胜感激。

Firebase云存储中的下载URL始终是公开可读的。它不受安全规则的影响


如果你不想让公众访问某个文件,你可以撤销其下载URL。

非常感谢,这正是我想要的澄清。非常感谢。有没有办法完全删除对下载url的访问?当我撤销url时,会弹出一个新的url。我无法找到完全阻止生成公共下载url的方法,但此线程可能是一个好的开始: