Firebase规则仅允许用户使用其设备令牌进行写入

时间:2017-12-20 09:08:55

标签: firebase firebase-authentication firebase-security

假设用户不创建帐户并仅使用设备令牌,则可以使用此结构:

users/${device_token}/posts

现在,您如何保护每个用户只能访问自己的帖子?

我过去曾经使用过这个:.write: "$uid === auth.uid"当我让每个用户创建一个帐户并登录时。如果用户没有创建帐户并只使用设备令牌,我怎么能得到类似的结果?

1 个答案:

答案 0 :(得分:0)

Firebase数据库安全规则中仅提供当前经过身份验证的Firebase身份验证用户。由于FCM令牌不是用户对象的一部分,因此Firebase数据库安全规则中不提供FCM设备令牌。

因此,您需要使用Firebase身份验证来确保有当前用户。幸运的是,您可以使用anonymous authentication来确保当前用户无需用户明确登录。这使您的安全规则中的auth.uid再次有效。

下一步是将用户配置文件与FCM设备令牌相关联。我可以很快想到两种方法:

  1. 将令牌存储在用户的个人资料中作为附加声明。
  2. 将令牌存储在与UID关联的数据库中。
  3. 将令牌存储在用户的个人资料中,您需要使用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".