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 将正确地使身份验证失败,但只要我向其传递任何字符串,模拟器就会进行身份验证。是对的吗?
看起来您正在使用 Firebase 的密钥,它不是 JWT,而是您的可信服务器应该用来签署 JWT 的共享密钥。目前可以使用密钥登录,但永远不应该将其分发给您的客户端,并且正如您所观察到的,它提供了管理员权限,因此绕过了所有安全规则和验证。
如果您已在自己的受信任服务器上设置了用户身份验证系统,则可以使用令牌生成器库之一将其直接与 Firebase 集成。您还可以使用其中之一生成一次性的测试目的,但也不建议将其分发给客户端(任何人都可以检查分发的包并在足够努力的情况下找到它)。
最后,您可以使用 Firebase 的登录服务:简单登录来管理来自不同提供商的用户,包括多个 OAuth 提供商、电子邮件/密码和匿名登录。
| 归档时间: |
|
| 查看次数: |
794 次 |
| 最近记录: |