Маршруты и редиректы: куда ведёт базовый URL и как распределяются роли. Механику входа (токены, хэширование, смена пароля) держит аутентификация — здесь только карта.
/admin и /chat — одно React-приложение.
Админ-зона — отдельный lazy-чанк. Общий слой: auth / токены,
дизайн-система, i18n. Гейт — клиентский редирект роутером.
/login?returnTo=<route>
→
возврат на исходный
?returnTo, если он разрешён роли. ?returnTo принимается только
как локальный путь (начинается с одного
/, но не // и не /\, без
схемы и хоста) — иначе игнорируется, редирект идёт на дом по роли.
Защита от open-redirect: внешний ?returnTo увёл бы
после входа на
фишинговый клон.
must_change_password
→
/change-password
→
дальше по роли
must_change_password (выдан временный пароль) →
принудительный редирект на /change-password, выход
заблокирован, пока не задан постоянный пароль. Редирект —
клиентский; настоящую границу держит сервер, прямой вызов API в
обход экрана отклоняется — механика в
модели данных.
Флаг снят →
распределение по роли (Q3 выше). Фича —
Принудительная смена пароля.
/admin/*
/admin/*
→
403 Forbidden
→
/chat
/admin/* — только Owner / Admin.
Member на admin-маршруте → редирект на свой /chat:
для известного дома роли тупика не создаём. Общий экран
403 «Доступ запрещён»
— для прочих запрещённых deep-link'ов, где очевидного
редиректа нет.