01 · poll-board · порт 8119
Голосуем
вживую
Создайте опрос на 2-10 вариантов с таймером, отправьте ссылку и смотрите, как растут столбики: результаты приходят по SSE или WebSocket без перезагрузки. Один человек голосует один раз, накрутка режется токеном и хэшем адреса.
02 · создание
Новый опрос
Демо-вопрос помечен «демо», настоящих людей за ним нет.
03 · голосование
Опрос
Создайте опрос выше или откройте ссылку вида /#ID.
открыт
04 · как устроено
Против накрутки
Токен
Браузер получает подписанный токен голосующего в cookie HttpOnly. Подпись HMAC, подделать нельзя, повторный бюллетень отклоняется.
Хэш IP
Адрес хранится только как HMAC с секретной солью и привязкой к опросу. Сам адрес не пишется ни в базу, ни в логи. С одного хэша допускается ограниченное число бюллетеней.
Порядок событий
Каждое событие несёт номер seq, он растёт на единицу. Страница игнорирует устаревшие кадры, так что при переподключении числа не откатываются.
05 · API
То же из консоли
curl -s localhost:8119/api/polls -H 'content-type: application/json' \
-d '{"question":"Чай или кофе?","options":["Чай","Кофе"],"ttl_seconds":3600}'
curl -s -c jar -b jar localhost:8119/api/polls/<id>/vote \
-H 'content-type: application/json' -d '{"choices":[0]}'
curl -N localhost:8119/api/polls/<id>/events