[Bug] Сбой сети или 5xx при refresh (деплой backend) выкидывает пользователя на /login #97

Closed
opened 2026-10-23 07:52:30 +03:00 by codex-bot · 0 comments
Owner

Problem

При загрузке страницы AuthProvider вызывает POST /auth/refresh (src/features/auth/model/auth.vm.ts). Любой неуспех (!data или исключение) вызывает clearSession(). Во время деплоя backend останавливается (бэкап и миграция), nginx отдаёт 502, и пользователь с валидной refresh-cookie оказывается разлогинен: UI уходит на login, кэш очищен. После запуска backend cookie ещё валидна, но приложение уже не пытается ею воспользоваться.

Expected Behavior

Сессия сбрасывается только когда сервер подтвердил, что refresh-токен недействителен (401). Сетевая ошибка и 5xx не считаются выходом: сессия и кэш сохраняются, готовность (ready) устанавливается, следующий защищённый запрос с 401 снова запускает refresh. Политика single-flight и «один retry после 401» не меняется, собственный retry-loop не добавляется (.ai/conventions/data.md, «Auth и invalidation»).

Scope

In scope

  • Различать в refresh() 401 и транзитивные сбои (network error, 5xx).
  • Обновить тест auth.test.tsx «settles unauthenticated … transport error» и добавить кейс 5xx.
  • Уточнить правило в .ai/conventions/data.md, если оно описывает очистку при любом сбое.

Out of scope

  • Retry/backoff внутри refresh.
  • Изменения backend (cookie Max-Age: WealthLedger/backend#123).
  • Межвкладочная синхронизация.

Acceptance Criteria

  • Холодный старт: refresh отвечает 401 → сессия сброшена, пользователь видит login (как сейчас).
  • Холодный старт: refresh завершился сетевой ошибкой или 5xx → сессия не очищается, ready становится true, кэш не удаляется, пользователь не получает ложное «вы вышли».
  • Следующий запрос, получивший 401 UNAUTHORIZED, по-прежнему запускает single-flight refresh.
  • Тест MSW на transport boundary для 401, сетевой ошибки и 5xx.

Verification

npm run verify (кроме отдельной Issue про date-зависимые тесты AccountEventsPage).

Traceability

Связано с WealthLedger/backend#123 (refresh cookie без срока жизни).

## Problem При загрузке страницы `AuthProvider` вызывает `POST /auth/refresh` (`src/features/auth/model/auth.vm.ts`). Любой неуспех (`!data` или исключение) вызывает `clearSession()`. Во время деплоя backend останавливается (бэкап и миграция), nginx отдаёт 502, и пользователь с валидной refresh-cookie оказывается разлогинен: UI уходит на login, кэш очищен. После запуска backend cookie ещё валидна, но приложение уже не пытается ею воспользоваться. ## Expected Behavior Сессия сбрасывается только когда сервер подтвердил, что refresh-токен недействителен (401). Сетевая ошибка и 5xx не считаются выходом: сессия и кэш сохраняются, готовность (`ready`) устанавливается, следующий защищённый запрос с 401 снова запускает refresh. Политика single-flight и «один retry после 401» не меняется, собственный retry-loop не добавляется (`.ai/conventions/data.md`, «Auth и invalidation»). ## Scope ### In scope - Различать в `refresh()` 401 и транзитивные сбои (network error, 5xx). - Обновить тест `auth.test.tsx` «settles unauthenticated … transport error» и добавить кейс 5xx. - Уточнить правило в `.ai/conventions/data.md`, если оно описывает очистку при любом сбое. ### Out of scope - Retry/backoff внутри refresh. - Изменения backend (cookie Max-Age: WealthLedger/backend#123). - Межвкладочная синхронизация. ## Acceptance Criteria - [ ] Холодный старт: refresh отвечает 401 → сессия сброшена, пользователь видит login (как сейчас). - [ ] Холодный старт: refresh завершился сетевой ошибкой или 5xx → сессия не очищается, `ready` становится true, кэш не удаляется, пользователь не получает ложное «вы вышли». - [ ] Следующий запрос, получивший 401 `UNAUTHORIZED`, по-прежнему запускает single-flight refresh. - [ ] Тест MSW на transport boundary для 401, сетевой ошибки и 5xx. ## Verification `npm run verify` (кроме отдельной Issue про date-зависимые тесты AccountEventsPage). ## Traceability Связано с WealthLedger/backend#123 (refresh cookie без срока жизни).
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: WealthLedger/frontend#97