randomayzer/agents/antigravity/inbox/TASK-2026-08-21-13-preview-anonymous-policy.md

21 lines
2.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Task 13: Политика анонимного доступа к POST /api/posts/preview
**Assigned to:** Antigravity (Implementation Orchestrator)
**Priority:** MEDIUM (security / quota protection / UX consistency)
**Date:** 2026-08-21
**Base SHA:** `76ab7d0e77d06cbc31b66fc5c0cdd80282d7f496`
## Проблема
Анонимный доступ к `POST /api/posts/preview` создает риски истощения квоты `VK_SERVICE_TOKEN` через пул IP-адресов либо взаимную блокировку анонимных пользователей на ключе `direct-client`. При этом весь визард создания розыгрыша (`POST /api/giveaways` и последующие шаги) жестко требует авторизации через VK ID (`requireAuthenticatedUser`), поэтому анонимный доступ к превью не обслуживает завершаемый пользовательский сценарий.
## Scope
1. Реализовать **Вариант A (рекомендуемый)**:
- Закрыть `POST /api/posts/preview` за `requireAuthenticatedUser(req)`.
- Анонимные запросы получают `401 Unauthorized` с внятным сообщением о необходимости войти через VK ID.
- Запросы без авторизации не доходят до VK API / провайдера (защита квоты приложения).
- Лимитирование становится строго user-scoped (`generalApiRateLimiter.assertAllowed('post-preview:user:' + sessionUser.id)`).
2. Обновить тесты:
- Создать `tests/preview-quota-policy.test.ts` (проверка `requireAuthenticatedUser`, 0 вызовов VK провайдера для неавторизованных запросов, успешная работа для авторизованных пользователей).
- Обновить `tests/post-preview-guard.test.ts`, `tests/security.test.ts`, `tests/rate-limit-identity.test.ts` с явным объяснением перехода на обязательную аутентификацию.
3. Документировать исправление в отчете `agents/antigravity/done/TASK-2026-08-21-13-preview-anonymous-policy.md`.
4. Полный верификационный гейт.