AUTH-03: Auth context и автовход

Что сделать

Реализовать AuthContext: хранение токенов, auto-refresh, redirect при 401.

Смотри спеку

Секция “Сессия и автовход” в Авторизация — Логин.

Конкретно

AuthContext

  • user — текущий пользователь (из JWT payload или /me)
  • isAuthenticated — boolean
  • login(tokens) — сохранить токены, установить user
  • logout() — очистить токены, redirect /login

Хранение токенов

  • access_token и refresh_token в localStorage
  • Helper: getTokens(), saveTokens(), clearTokens()

Auto-refresh (interceptor)

  • authFetch() — обёртка над fetch
  • При ответе 401 → попробовать POST /api/v1/admin/auth/refresh с refresh_token
  • Если refresh успешен → сохранить новые токены, повторить запрос
  • Если refresh неуспешен → clearTokens, redirect /login

Автовход при открытии /login

  • Есть access_token? → проверить (не expired?) → redirect /
  • Expired? → попробовать refresh → redirect / или остаться на /login

Protected routes

  • <ProtectedRoute> компонент — проверяет isAuthenticated
  • Если нет → redirect /login
  • Обернуть все роуты кроме /login, /forgot-password, /reset-password

Файлы

  • web/src/contexts/AuthContext.tsx — создать
  • web/src/api/client.ts — создать (authFetch с interceptor)
  • web/src/api/auth.ts — добавить refresh, logout
  • web/src/App.tsx — обернуть в AuthProvider, добавить ProtectedRoute

Зависит от

  • AUTH-01 (BFF прокси)