Обычный способ защитить ваш бэкэнд от злоумышленников - добавить ограничение скорости для определенных событий.В вашем случае события голосования "за" / "против".
Ваш первый подход
Вы упомянули, что это очень близко к тому, как работает ограничение скорости.Просто вместо того, чтобы запустить событие в firestore через 2 секунды после , когда пользователь нажал, и ничего не изменилось, вы также можете немедленно запустить событие и затем заблокировать любые события на 2 секунды.Таким образом, пользователь может покинуть страницу в течение 2 секунд, и в вашей базе данных все еще будет сохраняться голосование «вверх / вниз».
Ваш второй подход
Это на самом деленекоторые из них я никогда не пробовал, но только потому, что вы уже упомянули потенциальные проблемы, возникающие в сочетании с SSR, и сложность сохранения его во временном локальном состоянии, заставило меня подумать, что этот подход может не стоить работы.
пример решения
Я скопировал это из комментария к проблеме GitHub, см. Пример jsfiddle:
Существуют решения, которые вы можете сделать для ограничения скорости для каждого пользователя.используя правила link to fiddle
http://jsfiddle.net/firebase/VBmA
Мы обсуждали раскрытие этой информации, но в настоящее время мы не раскрываем квоту, ограничение скорости или показатели выставления счетов.Вероятно, есть более эффективные способы настройки этих вещей, чем Правила (которые в основном предназначены для authN / Z, определения ресурсов, проверки типов).Беспокойство об их разоблачении вызвано распространением различных конфигурационных файлов (firestore.quota, firestore.billing, firestore.rules и т. Д.), Которые бесполезно сбивают с толку пользователей.
проблема: https://github.com/firebase/firebase-js-sdk/issues/647#issuecomment-380303400