From 0d5dbaba4f862a13b27acd50e6c64282bb9064b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Fri, 14 Aug 2026 14:06:45 +0400 Subject: [PATCH] =?UTF-8?q?HISTORY:=20Q&A=20Sonnet=20=D0=BF=D0=BE=20=D0=BA?= =?UTF-8?q?=D1=8D=D1=88=D1=83=20=D0=B2=D0=B0=D0=BB=D0=B8=D0=B4=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=B8=20JWT?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HISTORY/2026-08-14-session-log.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) 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 мин; изоляция тенантов не затрагивается.