diff --git a/HISTORY/2026-08-14-session-log.md b/HISTORY/2026-08-14-session-log.md index 77fa562..45eb538 100644 --- a/HISTORY/2026-08-14-session-log.md +++ b/HISTORY/2026-08-14-session-log.md @@ -334,3 +334,24 @@ SQS API, /health, /, /metrics не затронуты. Совпадают с расчётным SHA256(email) — email-идентичность v0.1.28 работает. Smoke-тест: `aws sqs list-queues --endpoint-url https://sqs.containerk8s.dev.nubes.ru` с этими ключами → 200, `{"QueueUrls": []}`. SigV4-аутентификация на проде подтверждена. + +--- + +## Q&A с Claude Sonnet — кэш валидации JWT (14.08.2026) + +**Запрос**: файлы только `app/auth/jwt.go`, `app/admin/admin.go`; задача — кэш успешной валидации +токена (TTL 5 мин) из-за нестабильного шлюза Nubes. + +**Ответ Sonnet**: +1. Кэш — в auth (новый `app/auth/cache.go`): `PingNubesAPICached`, `WarmTokenCache`, `StartTokenCacheCleanup`. + В admin.go: jwtMiddleware → PingNubesAPICached; jwtAuth → свежая проверка + WarmTokenCache; NewHandler → cleanup. +2. Ключ `hex(sha256(token))`; `map[string]tokenCacheEntry{validUntil}` + `sync.RWMutex` + (не sync.Map — нужна итерация при очистке); уборщик — ticker 5 мин. +3. `ErrTokenRejected` (sentinel, `%w`) — отличать 401/403 от сетевых ошибок; сигнатура PingNubesAPI не меняется. +4. Таблица: HIT → nil; MISS+2xx → записать; MISS+401/403 → удалить, вернуть ошибку; + MISS+сетевая → ошибка; протухший+сетевая → опция grace +2 мин (принято). +5. Гонки: параллельные MISS безвредны (singleflight избыточен); запись в кэш до проверки ctx; + рестарт пода сбрасывает кэш (норма); exp проверяется локально ДО кэша/шлюза. + +**Решение (принято)**: всё выше + grace-продление 2 мин при сетевой ошибке для ранее валидного токена. +TTL 5 мин; отозванный токен умирает максимум через 5 мин; изоляция тенантов не затрагивается.