Как изменить статус онлайн-пользователя на оффлайн-пользователя в firebase, используя JavaScript

Оказывается, я уже выбрал некоторые элементы для обзора, прежде чем я правильно понял процесс, поэтому я оказался в состоянии неспособности сделать приложение вживую, поскольку у меня были ожидающие элементы обзора. Я удалил разрешения из очереди просмотра, сделал приложение вживую, и все хорошо.

0
задан Abdusoli Ergashev 16 January 2019 в 11:06
поделиться

1 ответ

Вы хотите, чтобы пользователи, которые ответили неправильно, не могли добавлять больше данных. Отключение пользователя от RTD выглядит как способ сделать это, но кажется слишком большой проблемой, учитывая, что это небезопасно.

Я рекомендую:

  1. Создать набор правил, которые не позволяют злонамеренным клиентам добавлять данные после неправильного ответа
  2. Иметь структуру RTD, соответствующую вашим целям [ 1118]
  3. Используйте функции для безопасного управления бизнес-логикой
  4. Заставьте клиентов задуматься о том, что происходит в пользовательском интерфейсе

Правила должны выглядеть примерно так: если пользователь имеет значение true на узле проверки с тем же идентификатором, что и в текущей игре, пользователь может написать ответы, если узел проверки ложен, тогда пользователь ошибочно ответил на предыдущий вопрос и, следовательно, не может написать больше ответов. Мы вернемся к этому.

Ваша структура базы данных должна выглядеть примерно так:

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

Есть questionnaires для выбора пользователя. Когда пользователь выбирает вопросник, он запускает функцию onCall Firebase , которая будет проверять, если пользователь ранее выбрал вопросник. Функция onCall проверит, существует ли questionnaires_permissions/{user_uid}. Если он не существует, он ответит ok move forward и создаст его, если он существует и является истинным, то он также ответит и ok move forward, но если он ложный, это означает, что пользователь ранее допустил ошибку, тогда это будет ответ user failed the test. Таким образом, пользовательский интерфейс может отражать то, что в первый раз выбирает анкету или вводит ее заново.

Узлы questionnaires позволяют пользователю читать все вопросы, узел answers имеет правильные ответы, доступные только для чтения функциями, а узел user_answers имеет фактические ответы пользователя (написанные пользователем). ).

Для создания users_answers/{questionnaire_id}/{uid}/{question} необходим слушатель RTD Functions . Когда пользователь создает ответ, функции срабатывают и проверяют правильность ответа. Если он неверен, он будет помечен как false на узле questionnaires_permissions/{questionnaire_id}/{uid}.

Клиент должен иметь прослушиватель в режиме реального времени для questionnaires_permissions/{questionnaire_id}/{uid}, если он меняется на false, тогда пользовательский интерфейс должен отображать предупреждение, сообщающее пользователю, что последний вопрос был неверным.

Последние 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
        }
      }
    }
  }
}

Так что, если по какой-либо причине клиент malicios попытается написать после неправильного ответа, это будет невозможно, потому что правила базы данных не позволят этого

0
ответ дан cutiko 16 January 2019 в 11:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: