在我的应用程序中,我想要一个“可以阅读” - 和一个“可以写”视图。当应用程序启动时没有现有参数(“第一次用户”),然后创建2个随机哈希值,以及firebase应用程序密钥,将它们发布到PHP FirebaseTokenGenerator以接收我的令牌。
然后我想这样做:
看起来像这样:
<appname>
users
<read_hash>
key
<write_hash>
[other user related data]
...
哈希值可用作网址参数,例如“myapp.com/#read_hash/write_hash”
我想要实现的目标是:
我的安全规则:
{
"rules": {
"users": {
"$user": {
".read": "$user == auth.read_hash",
".write": "$user == auth.read_hash && root.child('users').child($user).child('key').val() == auth.write_hash"
}
}
}
}
我的问题是:如何在没有我的安全规则“.write”阻止写入的情况下第一次存储write_hash?
任何其他想法如何实现这一目标?任何架构/不一致?
我正在使用这些库:
提前致谢。
答案 0 :(得分:2)
首先,我应该注意,您应该从不将Firebase Secret放入您的应用中。它应始终安全地存储在安全的服务器上。您的原始问题表明您正在将令牌从客户端发送到服务器。
我建议让read_hash与用户ID相同,然后在第一次创建用户时在//键处存储“key”。
然后我建议如下规则结构:
{
"rules": {
"$userid": {
".read": "$userid == auth.read_hash",
".write": "!data.exists() || ($userid == auth.read_hash && data.child("key") == auth.write_hash)",
}
}
}
答案 1 :(得分:1)
假设您已经拥有了写入哈希的密钥(因为您已经根据您的示例进行了身份验证),这将有效:
{
"rules": {
"users": {
"$user": {
".read": "$user == auth.read_hash",
"$key": {
".write": "$user == auth.read_hash && $key === auth.write_hash"
}
}
}
}
}
如果你需要在获取密钥之前创建哈希,对于一些奇怪的用例(不太可能,但这会给你一些关于安全规则的关键见解),你可以这样做:
".write": "$user == auth.read_hash && (!data.exists() || $key === auth.write_hash)"