# Auth для Tunnel-метода Bearer JWT (HS256), HMAC signing secret в `/etc/stats-gateway/jwt.key`. ## Claims - `sub` — client-id (`bergamot-laptop`, `bergamot-phone`, ...) - `scope` — `tunnel` (только этот scope разрешён для Tunnel-метода) - `iat`, `exp` — стандартные UNIX timestamps - `jti` — random hex для аудита/revocation ## Выпуск нового токена На gitea-узле от пользователя с доступом к `jwt.key`: sudo -u stats /usr/local/bin/stats-issue-token --sub --days (Helper-скрипт `issue-token.sh` устанавливается на сервер в Task 11 как Go-binary `stats-issue-token`.) Локальный путь во время разработки — `experiments/grpc-tunnel/issue-token.sh`. Семантика идентична Go-варианту. ## Revocation Опции (по убыванию агрессивности): 1. **Polite revocation** (один client) — добавить `jti` отзываемого токена в `/etc/stats-gateway/revoked.txt` (формат: один jti на строку, `#` в начале строки — комментарий). Сервис подгружает на каждом запросе. 2. **Mass revocation** (все клиенты) — `openssl rand -hex 32 > /etc/stats-gateway/jwt.key`, `systemctl restart stats-gateway`. Затем переиздать токены живым клиентам и раздать оффлайн. Polite revocation реализуется в Task 11 (через `LoadRevokedFile`). Для старта — только rotation. ## Ротация secret Раз в год минимум. Перед сменой: 1. Выпустить новые токены клиентам с новым ключом (НЕ deploy ещё на сервер) 2. Раздать токены оффлайн (мессенджер, не plain SMS) 3. Заменить ключ на сервере, restart 4. Старые токены немедленно невалидны ## Storage клиентского токена На клиенте — `~/.psp/token` mode 600. CLI читает только этот файл (см. `psp-stats-cli connect --token-file`). Не коммитить токены в репозитории, не передавать через email/Slack без e2e.