fix(auth): список сессий без мусора ротаций — фильтр isReplaced, перенос UA/IP, чистка старых

- listUserSessions: + isReplaced = false — иначе каждый рефреш токена добавлял
  в список устройств «новую сессию» (цепочка ротации видна только для детекта кражи);
- rotateFamilySession: userAgent/ipAddress переносятся из исходной сессии —
  rotated-строки больше не «Неизвестное устройство»;
- новый worker session-cleanup (тик раз в сутки + прогон при старте): удаляет
  replaced-сессии старше 72ч (grace-окно детекта кражи) и истёкшие.
This commit is contained in:
2026-09-22 09:01:59 +03:00
parent 13db5be030
commit 8d11ad3b33
4 changed files with 69 additions and 2 deletions

View File

@@ -11,6 +11,7 @@ import { startAutomationScheduler } from "./workers/automation-scheduler";
import { startDelayedStatusChangeWorker } from "./workers/delayed-status-change.worker";
import { sendTaskMessage } from "./services/task-message.service";
import { startErrorLogsRetention } from "./workers/error-logs-retention";
import { startSessionCleanup } from "./workers/session-cleanup";
import { startGpsWorker } from "./gps/worker";
import { storage } from "./storage";
import type { ReminderRecipient } from "@shared/schema";
@@ -1152,6 +1153,10 @@ async function runStartupDataPatches() {
startErrorLogsRetention();
log('Error logs retention started');
// Start session cleanup (daily: replaced-сессии старше 72ч + истёкшие)
startSessionCleanup();
log('Session cleanup worker started');
// Start GPS worker (offline detection for tracked assets)
startGpsWorker();
log('GPS worker started');