我的系统中有一个Media和User实体,并且正在使用Firebase身份验证,存储和Firestore。
关系是:
安全要求,具有media-id和media-auth的用户或某人应该能够使用 firebase客户端和
上传媒体因此,我想到的是为具有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中的实体结构不是最终的-因此,欢迎对数据表示形式进行任何更改以帮助解决此问题。