javascript - 如何使用javascript在firebase中将在线用户的状态更改为离线用户

标签 javascript firebase

我正在使用 firebase 数据库制作一个程序。许多用户使用 Android 手机连接数据库并回答一些问题。如果用户回答不正确,那么我想断开该用户与 firebase 数据库的连接。更准确地说,10 个用户连接到 firebase 并从表中提取问题,然后回答一个问题,其中 4 个用户回答错误。我想把这 4 个用户踢出游戏。在 firebase 中可能吗?我看到了 onDisconnect() 函数,但我不知道它是否有效。请帮助我

最佳答案

您希望回答错误的用户无法添加更多数据。 断开用户与 RTD 的连接似乎是一种方法,但考虑到不安全,这似乎是一个太大的问题。

我的建议是:

  1. 创建一组规则,防止恶意客户端继续 在错误答案后添加数据
  2. 拥有适合的 RTD 结构 你的目的
  3. 使用函数安全地控制业务逻辑
  4. 让客户反射(reflect)用户界面正在发生的事情

规则应该是这样的:如果用户在与当前游戏具有相同 id 的验证节点上为 true,则用户可以编写答案;如果验证节点为 false,则用户错误地回答了之前的问题,因此无法写出更多答案。我们会回来讨论这个问题。

你的数据库结构应该是这样的:

{
  "questionnaires": {
    "questionnaire_id_1": {
      "question_1": {
        "question": "How much is 2 + 2",
        "alternatives": {
          "a": 4,
          "b": 3,
          "c": 2
        }
      },
      "question_2": {
        "question": "How much is 0 + 2",
        "alternatives": {
          "a": 4,
          "b": 3,
          "c": 2
        }
      }
    }
  },
  "answers": {
    "questionnaire_id_1": {
      "question_1": "a",
      "question_2": "c"
    }
  },
  "user_answers": {
    "questionnaire_id_1": {
      "uid_1": {
        "question_1": "a",
        "question_2": "c"
      },
      "uid_2": {
        "question_1": "a",
        "question_2": "c"
      },
      "uid_3": {
        "question_1": "a"
      }
    }
  },
  "questionnaires_permissions": {
    "questionnaire_id_1": {
      "uid_1": true,
      "uid_2": true,
      "uid_3": false
    },
    "questionnaire_id_2": {
      "uid_1": true,
      "uid_2": true,
      "uid_3": true
    }
  }
}

调查问卷供用户选择。当用户选择调查问卷时,它将触发 onCall Firebase Function这将验证用户之前是否选择过调查问卷。 onCall 函数将检查 questionnaires_permissions/{user_uid} 是否存在。如果它不存在,它将回复确定前进并创建它,如果它确实存在并且为真,那么它也会响应并确定前进,但是如果为 false,则表示用户之前犯了一个错误,那么它将响应 user failed the test。这样,用户界面可以反射(reflect)第一次选择调查问卷或重新输入调查问卷时的情况。

questionnaires 节点允许用户阅读所有问题,answers 节点具有可供函数只读的正确答案,user_answers 节点有用户实际答案(由用户编写)。

您需要有一个 RTD Functions listener用于创建users_answers/{questionnaire_id}/{uid}/{question}。当用户创建答案时,功能将被触发并检查它是否是正确的答案。如果不正确,则会在 questionnaires_permissions/{questionnaire_id}/{uid} 节点上标记为 false

客户端必须有一个针对 questionnaires_permissions/{questionnaire_id}/{uid} 的实时监听器,如果它更改为 false,则 UI 必须显示警告,告诉用户最后的情况问题错了。

最后 2 个步骤也可以是使用 onCall 的单个操作。

现在我们必须查看数据库规则。

{
  "rules": {
    "questionnaires": {
      ".read": "auth != null",
      ".write": false
    },
    "answers": {
      ".read": false,
      ".write": false
    },
    "user_answers": {
      "$questionnaire_id": {
        "$uid": {
          "$question_id": {
            ".read": false,
            ".write": "$uid === auth.uid && root.child('questionnaires_permissions').child($questionnaire_id).val() == true"
          }
        }
      }
    },
    "questionnaires_permissions": {
      "$questionnaire_id": {
        "$uid": {
          ".read": "$uid === auth.uid",
          ".write": false
        }
      }
    }
  }
}

因此,如果恶意客户端出于任何原因尝试在错误答案后写入,则这是不可能的,因为数据库规则不允许这样做

关于javascript - 如何使用javascript在firebase中将在线用户的状态更改为离线用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54215716/

相关文章:

javascript - JQuery 可排序和可拖动的行为

javascript - 我正在尝试查询 firestore 中的时间戳

android - 具有循环依赖的 Firebase 数据结构

JavaScript - 递归查找父节点

javascript - 自定义 Accordion 菜单,jQuery

javascript - Laravel-5.7 : How to view data in dataset chart in Laravel

java - 实现依赖项时出现Android Studio错误

javascript - 拖动在 Internet Explorer 中不起作用

ios - 从 Firebase 存储下载时出错

firebase 仅部署功能无法识别我的任何功能