代码之家  ›  专栏  ›  技术社区  ›  Brian

用密钥验证FireBase输入

  •  0
  • Brian  · 技术社区  · 8 年前

    我正在努力研究FireBase实时数据库规则结构。我需要验证用户注册码输入以便写入数据库。我正在验证前端的代码,我正在尝试通过FireBase规则来实现相同的功能。 没有 存储提交的代码。

    例如,要发送的对象是:

    {
      "courseId": "A1",
      "code": "codeToMatch"
    }
    

    预期的数据库结构是:

    {
      courses: {
        "A1": {
          "code": "codeToMatch",
          "date": "2018-07-01T08:00:00.000Z",
          "members": {
            "abcd1234": true,
            "efgh5678": true
          },
        }, ...
      }
    }
    

    到目前为止,我能做的最好的事情是:

    {
          courses: {
            "A1": {
              "code": "codeToMatch",
              "date": "2018-07-01T08:00:00.000Z",
              "members": {
                "abcd1234": {
                  "code": "codeToMatch",
                  "true": true
                },
            ...
          },
        }, ...
      }
    }
    

    我想推到 courses/{courseId}/members/{uid} ,带有 members 存储所有注册用户。

    规则

    {
      "rules": {
        ".write": "auth != null",  // Allow any authorized user to write
        "courses": {
          ".read": "auth != null",
          "$courseId": {
            "members": {
              "$uid": {
                ".validate": "root.child('courses').child($courseId).child('code').val() == newData.child('code').val()" // only write if it's valid
              }
            }
          }
        }
      }
    }
    

    有没有一种方法只发送一个具有某种值的对象来进行验证?

    1 回复  |  直到 8 年前
        1
  •  0
  •   Neel Rao    8 年前

    我不确定是否有一种方法可以在不存储代码的情况下做到这一点。你可以一直只存储代码而不是“真的”,因为“真”对你没有任何其他帮助。如果要检查另一个数据库中的值,只需检查“成员”下是否存在用户ID。

    {
      courses: {
        "A1": {
          "code": "codeToMatch",
          "date": "2018-07-01T08:00:00.000Z",
          "members": {
            "abcd1234": codeToMatch,
            "efgh5678": codeToMatch
          },
        }, ...
      }
    }
    

    另一种选择是使用 Cloud Function 检查代码并进行适当的更新。

    推荐文章