1

在我的应用程序中,我想要一个“可以阅读”和一个“可以写”的视图。当应用程序在没有现有参数的情况下启动(“第一次用户”)时,会创建 2 个随机哈希值,连同 firebase 应用程序机密,将它们发布到 PHP FirebaseTokenGenerator 以接收我的令牌。

然后我想这样做:

  • 第一个散列(“读取散列”)表示“匿名用户”条目
  • 第二个散列(“写散列”)表示一个“键”,它是用户条目的子条目

看起来像这样:

<appname>
    users
        <read_hash>
            key
                <write_hash>
            [other user related data]
                ...

哈希值可以用作 URL 参数,例如“myapp.com/#read_hash/write_hash”

我想要实现的是:

  • 当用户只有他的 read_hash(只调用“myapp.com/#read_hash”)时,他应该能够看到他第一次输入的所有条目(让应用程序为他创建 write_hash /“key”)。但他不允许修改它们。
  • 当他提供他的 write_hash(调用“myapp.com/#read_hash/write_hash”)时,允许写入 Firebase。

我的安全规则:

{
    "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 ?

任何其他想法如何实现这一目标?任何架构/不一致?

我正在使用这些库:

  • 带有骨干-firebase.js 的骨干 JS
  • FirebaseTokenGenerator PHP

提前致谢。

4

2 回答 2

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)",
    }
  }
}
于 2013-05-15T16:48:42.840 回答
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)"
于 2013-05-15T16:10:36.320 回答