授予用户访问权限以在Firebase Storage中写入一些动态文件的最佳方法是什么?

时间:2019-06-01 16:16:56

标签: firebase firebase-storage firebase-security-rules

我的系统中有一个Media和User实体,并且正在使用Firebase身份验证,存储和Firestore。

关系是:

  1. 媒体是一个独立的实体-意思是,如果某人具有该媒体的ID(媒体ID)和某些身份验证代码(媒体-身份验证),他就可以上传媒体。
  2. 如果用户具有有效的media-id和media-auth,则该用户还应该能够上传媒体

安全要求,具有media-id和media-auth的用户或某人应该能够使用 firebase客户端

上传媒体
  1. 仅上传一次。
  2. 无法上传任何其他文件。

因此,我想到的是为具有UID = media-id的媒体创建自定义身份验证,它只有权上传一个文件,并且仅在不存在的情况下才可以上传。像这样:

service firebase.storage {
  match /media/{mediaId}/video.mp4 {
      allow write: if resource == null && request.auth != null && request.auth.id == mediaId;
    }
  }
}

我遇到的问题是如何授予“身份验证的用户”权限以执行相同的操作(用户具有有效的media-id和media-auth),并使用Firebase客户端执行此操作-可以使用某些功能来实现/ Server,因为我可以在上传之前检查任何想要的东西,但是我试图避免使用服务器上传文件。

我发现这篇很棒的文章https://medium.com/@fpastorelima/per-user-storage-limit-validation-with-firebase-19ab3341492d展示了一种类似的方法-由于我已经拥有了针对媒体的自定义令牌,因此我可以重新验证为媒体,上传媒体并使用用户的凭据再次进行重新验证

这似乎是一个可能的解决方案,但我不能在后台执行此操作-因为当我上传文件时,我已通过媒体身份验证,并且无法访问Firestore中的用户数据等等。所以我需要完成,然后我才能继续-一个问题。

我还认为我可以给用户一些带有media-id的临时自定义声明,并在规则中添加如下内容:

service firebase.storage {
  match /media/{mediaId}/video.mp4 {
      allow write: if (resource == null && request.auth != null && request.auth.id == mediaId) 
                      || (request.auth.token.mediaId == mediaId);
    }
  }
}

假设我有一份工作将在X分钟后将其从声明中删除-但是我真的不知道这是否是对自定义声明的正确使用...

这种自定义声明的使用正确吗?

也许Firebase文档中缺少我可以实现此目标的方法?

我会说firebase中的实体结构不是最终的-因此,欢迎对数据表示形式进行任何更改以帮助解决此问题。

0 个答案:

没有答案