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

Cant get Firebase Storage security rules to refuse access to a file

我确定我遗漏了一些关于 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;
    }
  }
}

我希望只有具有与相关位置匹配的自定义声明 permId 的登录用户才能下载文件,allow read: if request.auth.token.permId == perm_id;

所以,我对一个用户设置了一个 custom claim in 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
        });
    });

然后我注销用户并重新登录...设置自定义声明。 我检查了它们在 Cloud Functions 中的设置如下:

第 3 步

admin.auth().verifyIdToken(idToken).then((claims) => {
       console.log("--------------claims -------------");
       console.log(JSON.stringify(claims));
    });

我在声明字符串中看到...permID: "1"

然后在客户端我请求了一个下载 URL(希望这里是我出错的地方)...我预计这不是 public 下载 url 而是下载url Firebase 存储安全规则将检查:

第 4 步

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

pathReference.getDownloadURL()
.then((url)=>{
    console.log("url: ", url);
})

我接到这个电话的 url 给了我这个 link https://firebasestorage.googleapis.com/v0/b/emiru84-games.appspot.com/o/games%2FcfaoVuEdJqOWDi9oeaLLphXl0E82%2F1%2FGame-1?alt=media&token=45653143-924a-4a7e-b51d-00774d8986a0 (我用来测试的小图片)

到目前为止一切顺利,正确声明的用户能够查看此图片

然后我再次重复第 2 步 logout/login,只是这次的 permId 为“0”。我预计之前生成的 url 不再有效,因为我的用户不再具有正确的自定义声明...并且存储桶位置仍在同一位置 (bucket/dev_key/1/filename),但它仍然有效。

如果我重复第 4 步,我会得到一个新的 url,然后会给出相应的 403 错误响应。然而,旧的 url 仍然有效(我猜只要添加了 token 参数)。这是预期的吗?如果是这样,我不确定我是否理解存储安全规则如何在下载 url 是 public 时产生影响?

如果能帮助我清理迷雾中的大脑,我们将不胜感激。

Cloud Storage for Firebase 中的下载 URL 始终 public 可读。它不受安全规则的影响。

如果您不想允许 public 访问文件,您可以撤销其下载 URL。