Firebase在使用secret时忽略安全规则

Firebase在使用secret时忽略安全规则,firebase,Firebase,我正在尝试将一些安全规则应用到我们的firebase实例,但我似乎无法从iOS获得尊重这些规则的呼叫。我从验证身份验证(应该成功)的简单测试开始,然后尝试将未定义的值写入根(应该失败) 规则: { "rules": { //Default read and write access to authenticated users only ".read" : "auth != null", ".write" : "auth != null", //Pre

我正在尝试将一些安全规则应用到我们的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将正确地使身份验证失败,但只要我传递任何字符串,模拟器就会使用身份验证。是这样吗?

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

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


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

看起来您使用的是Firebase的机密,它不是JWT,而是您的可信服务器应用于签署JWT的共享机密。目前,可以使用该密码登录,但不应将其分发给您的客户端,并且您可以观察到它提供了管理员权限,因此可以绕过所有安全规则和验证

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


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

以下是文档的特定部分:,补充Chris的回答。如果这是在某个地方引用的话会很好——只是花了大量时间想知道为什么我的安全和验证规则不起作用:这里是文档的特定部分,补充Chris的答案。如果这是在某个地方引用的话会很好——只是花了大量时间想知道为什么我的安全和验证规则不起作用:P