Firebase在使用密钥时忽略安全规则

时间:2014-10-02 14:56:13

标签: firebase

我正在尝试将一些安全规则应用于我们的firebase实例,但我似乎无法从iOS调用来尊重它们。我从一个简单的测试开始,验证身份验证(应该成功),然后尝试将未定义的值写入根目录(应该失败)。

规则:

{
  "rules": 
  {
    //Default read and write access to authenticated users only
    ".read" : "auth != null",
    ".write" : "auth != null",

    //Prevent undefined child variables
    "$undef" : { ".validate" : false  }
  }
}

登录:

- (void)authenticate
{
    [_dataRef authWithCredential:SECURITY_CREDENTIAL //Firebase Secret JSON token
     withCompletionBlock:^(NSError *error, id data){}
     withCancelBlock:^(NSError *error)
     {
          //If the authentication becomes invalid, re-authenticate
          [self authenticate];
     }];
}

写测试:

[[[[Firebase alloc] initWithUrl:ROOT_URL] childByAppendingPath:CHILD_PATH] setValue:VALUE];

现在我似乎无法弄清楚模拟器正确无法写入此值的原因,但iOS忽略了验证并写入了数据。

此外,经过进一步测试,我遇到了第二个问题。如果我更改了用于对不是有效的firebase机密令牌的内容进行身份验证的凭据,iOS将正确地使auth失败,但只要我传递任何字符串,模拟器都会进行身份验证。是吗?

1 个答案:

答案 0 :(得分:4)

看起来您正在使用Firebase的秘密,这不是JWT,而是您的可信服务器用于签署JWT的共享秘密。目前可以使用秘密登录,但不应该与您的客户一起分发,并且当您观察它时,它提供管理员权限,因此绕过所有安全规则和验证。

如果您已在自己的受信任服务器上设置了用户身份验证系统,则可以使用其中一个token generator libraries直接将其与Firebase集成。您也可以使用其中一个来生成一次性用于测试目的,但不建议将其与客户端一起分发(任何人都可以检查分布式软件包,如果它们看起来足够硬,就可以找到它)。

最后,您可以使用Firebase的登录服务:Simple Login来管理来自不同提供商的用户,包括许多OAuth提供商,电子邮件/密码和匿名登录。