我正在努力将我的应用程序迁移到基于云的数据库。目前,我已将所有内容存储在sqllite中的用户设备上。
将数据上传到云端后,我希望允许我的用户将他们的个人数据库访问给另一个人,以便在两个用户之间进行同步。
用例:
人1创建一个帐户并开始存储数据。人1想要给人2访问他们的帐户。 Person 2登录并且应用程序确定person 2可以访问person 1的repo,并且两个客户端应用程序变得同步到相同的firestore集合,就像它们登录到同一帐户一样。
这种结构的最佳方法是什么?允许次要用户访问某人的个人文档很容易,但我如何以我的客户端应用程序可以轻松确定次要用户可以访问哪些文档的方式执行此操作?我应该维护另一组用户访问映射吗?我应该如何构建呢?
答案 0 :(得分:0)
我能想到的最简单的方法是在您自己的服务器上使用Firebase的Admin SDK,以便向应该访问该节点的目标用户授予自定义声明。
让我们说
UID1 =想要授予访问权限的用户
UID2 =将获得授权以访问其他人的节点
的用户在这里,我将给你一个关于写规则的想法,你可以阅读公开或相同或你喜欢
所以UID1节点的规则可以是(你的结构可以根据你的需要,这是一个例子):
match /users/{UID1}/{allPaths=**}{
allow write: if request.auth.uid == UID1 || request.auth.token.allowedAccesToId == UID1
}
因此,这是基于默认用户的规则和自定义声明规则
的组合这里的allowedAccesToId是通过admin sdk(JAVA)添加的自定义声明,如下所示:
Map<String, Object> claims = new HashMap<>();
claims.put("allowedAccesToId", UID1);
FirebaseAuth.getInstance().setCustomUserClaimsAsync(UID2, claims).get();
您可以在此处查看如何使用其他服务器端语言进行操作
https://firebase.google.com/docs/auth/admin/custom-claims
现在,这将授予对UID2用户的访问权限,默认持续时间为1小时,不要认为您可以再自定义自定义令牌的持续时间。
一旦用户想要撤销它,请将allowedAccesToId的自定义声明值设置为某个随机值,例如xx,它永远不会匹配任何节点。这样,UID2用户就不能再访问user1的节点了