我正在尝试将一些安全规则应用于我们的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失败,但只要我传递任何字符串,模拟器都会进行身份验证。是吗?
答案 0 :(得分:4)
看起来您正在使用Firebase的秘密,这不是JWT,而是您的可信服务器用于签署JWT的共享秘密。目前可以使用秘密登录,但不应该与您的客户一起分发,并且当您观察它时,它提供管理员权限,因此绕过所有安全规则和验证。
如果您已在自己的受信任服务器上设置了用户身份验证系统,则可以使用其中一个token generator libraries直接将其与Firebase集成。您也可以使用其中一个来生成一次性用于测试目的,但不建议将其与客户端一起分发(任何人都可以检查分布式软件包,如果它们看起来足够硬,就可以找到它)。
最后,您可以使用Firebase的登录服务:Simple Login来管理来自不同提供商的用户,包括许多OAuth提供商,电子邮件/密码和匿名登录。