假设用户不创建帐户并仅使用设备令牌,则可以使用此结构:
users/${device_token}/posts
现在,您如何保护每个用户只能访问自己的帖子?
我过去曾经使用过这个:.write: "$uid === auth.uid"
当我让每个用户创建一个帐户并登录时。如果用户没有创建帐户并只使用设备令牌,我怎么能得到类似的结果?
答案 0 :(得分:0)
Firebase数据库安全规则中仅提供当前经过身份验证的Firebase身份验证用户。由于FCM令牌不是用户对象的一部分,因此Firebase数据库安全规则中不提供FCM设备令牌。
因此,您需要使用Firebase身份验证来确保有当前用户。幸运的是,您可以使用anonymous authentication来确保当前用户无需用户明确登录。这使您的安全规则中的auth.uid
再次有效。
下一步是将用户配置文件与FCM设备令牌相关联。我可以很快想到两种方法:
要将令牌存储在用户的个人资料中,您需要使用Firebase管理员SDK。这意味着您需要在受信任的环境(例如您控制的服务器或云功能)上运行此代码。完成后,setting a custom claim就像以下一样简单:
admin.auth().setCustomUserClaims(uid, {deviceToken: "....."});
您可以在安全规则中使用它:
".write": "auth.token.deviceToken === '...'",
阅读文档以获取更多信息,因为您可以设置的内容有一些限制。
更灵活但更麻烦的方法是将令牌存储在数据库中。为此,您需要向数据库添加一个新的顶级节点,您可以在其中存储每个用户的令牌:
tokens
$uid: "..."
您需要保护数据库的这一部分,以便users can only write their own token。
之后,您可以在其他规则中访问此节点以检查其令牌。例如:
".write": "root.child('tokens').child(auth.uid).val() === $token".