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

0 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  }
  }
}
Run Code Online (Sandbox Code Playgroud)

登录:

- (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];
     }];
}
Run Code Online (Sandbox Code Playgroud)

编写测试:

[[[[Firebase alloc] initWithUrl:ROOT_URL] childByAppendingPath:CHILD_PATH] setValue:VALUE];
Run Code Online (Sandbox Code Playgroud)

现在我似乎无法弄清楚为什么模拟器无法正确写入该值,但 iOS 会忽略验证并写入数据。

另外,在进一步测试后,我遇到了由此产生的第二个问题。如果我更改用于身份验证的凭据不是有效的 firebase 秘密令牌,iOS 将正确地使身份验证失败,但只要我向其传递任何字符串,模拟器就会进行身份验证。是对的吗?

Chr*_*nor 5

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

如果您已在自己的受信任服务器上设置了用户身份验证系统,则可以使用令牌生成器库之一将其直接与 Firebase 集成。您还可以使用其中之一生成一次性的测试目的,但也不建议将其分发给客户端(任何人都可以检查分发的包并在足够努力的情况下找到它)。

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