Вход и выбор города
Вход в веб-ТГИД своего города: логин и пароль от администратора. У каждого города свой адрес, вход в каждый город — отдельный.
Возможности
- Вход по логину и паролю, выданным администратором; язык интерфейса выбирается прямо в форме входа (русский, қазақша, English).
- Каждый город — свой адрес и свой вход; переход в другой город — меню пользователя → «Перейти: <город>».
- Выход — меню пользователя → «Выйти». Сессия заканчивается сама через срок действия входа: появится «Сессия истекла, войдите снова.» с кнопкой «Войти», логин уже подставлен.
Как это работает
Проверка пароля. Форма отправляет логин и пароль на сервер (POST /api/v1/auth/login). Сервер проверяет их по порядку:
- мастер-учётка сервера (логин
MASTER_LOGIN, хеш пароляMASTER_PASSWORD_HASH); - роли PostgreSQL, если включён вход через базу (
AUTH_BACKEND=pg); - иначе — база пользователей UsersDB (таблица
users, пароли в bcrypt).
Затем проверяется, открыт ли пользователю этот город (поле городов учётной записи). При успехе сервер выдаёт токен (JWT), браузер хранит его до выхода или окончания срока. Права пользователя (роль и матрица прав) приходят вместе с ответом GET /api/v1/auth/me.
Срок входа. Токен действует JWT_EXPIRE_MINUTES минут (по умолчанию 480 — рабочий день). Браузер проверяет срок раз в 30 секунд и при возврате на вкладку; любой ответ сервера «не авторизован» тоже открывает форму входа. Блокировка или смена роли администратором действуют не позже чем через 30 секунд (USER_STATUS_TTL).
Защита от подбора. После 5 неудачных попыток за 10 минут для логина (30 — для одного IP-адреса) вход временно закрыт: «Слишком много неудачных попыток входа. Повторите через N мин.»
Несколько городов. Один сервер API обслуживает несколько городов: у каждого своя база и свой адрес веба (/tgid/<код>/). Запросы города идут по пути /city/<код>/…; без кода сервер отвечает «Город не указан». Настройки браузера (слои, подложка, черновики карточек) хранятся отдельно для каждого города.
Что нужно для работы
- Учётная запись — выдаёт администратор в «Личном кабинете» → «Пользователи» с доступом к нужным городам.
- Сервер: вход включён (
AUTH_DISABLED=false); ключ подписи токеновJWT_SECRETзадан и одинаков у всех процессов API.
Шаги
Меню пользователя → «Войти». Если сервер требует входа, форма откроется сама сразу после загрузки страницы и закрыть её нельзя.

Введите логин и пароль и нажмите «Войти». Значок глаза показывает пароль, под полем предупреждение о включённом Caps Lock. Поле «Роль» видно только на тестовых серверах.

Примеры
Два города у одного пользователя. Инженеру открыты Алматы и Астана. В Алматы он входит по адресу /tgid/almaty/, в меню пользователя видит «Перейти: Астана». Переход открывает адрес Астаны — там вход отдельный, слои и фрагменты Астаны свои.
Конец рабочего дня. Вход в 9:00, срок 480 минут. Около 17:00 появится «Сессия истекла, войдите снова.»; форма откроется с уже подставленным логином, достаточно ввести пароль.
Если не получается
- «Неверный логин или пароль.» — проверьте раскладку и Caps Lock (форма предупреждает о нём).
- «Нет доступа к городу «…». Доступ выдаёт администратор» — учётная запись есть, но город ей не открыт.
- «Слишком много неудачных попыток входа…» — подождите указанное время или попросите администратора сбросить пароль.
- «База пользователей недоступна» — сервер не может связаться с базой учётных записей; это работа администратора.
Для администратора
- Вход по умолчанию выключен: без
AUTH_DISABLED=falseсервер пускает всех без пароля (режим для стендов). На проде переменная обязана бытьfalse; заодноAUTH_REQUIRED_GET=true— без входа нельзя даже смотреть. - Переменные:
AUTH_BACKEND(pg— роли PostgreSQL),JWT_SECRET,JWT_EXPIRE_MINUTES,USER_STATUS_TTL,LOGIN_FAIL_WINDOW_SECONDS,LOGIN_MAX_FAILS,LOGIN_MAX_FAILS_PER_IP,MASTER_LOGIN,MASTER_PASSWORD_HASH. - Мастер-учётку нельзя удалить или заблокировать из веба, её пароль меняется только на сервере; смена пароля закрывает все её прежние сессии.
- Города:
TGID_CITIES(каталогкод:название[:путь веба]),TGID_CITY_DBS(один API на несколько баз), у веба —NUXT_APP_BASE_URLиNUXT_PUBLIC_STORAGE_PREFIXдля каждого города. DEV_LOGIN_ENABLED— вход без пароля с выбором роли (поле «Роль» в форме). Только для стендов.
Для разработчика
- API:
routers/auth_routes.py—POST /api/v1/auth/login,GET /api/v1/auth/config(флаги входа и записи для веба),GET /api/v1/auth/me(также ставит HttpOnly-куку для GeoServer),POST /api/v1/auth/logout,POST /api/v1/auth/password,GET /auth/check(дляauth_requestnginx). Ограничение попыток —login_guard.py, города —cities.py,city_context.py(CityPathMiddleware). - Веб:
components/LoginDialog.vue,stores/authStore.ts(срок токена, повторный вход),utils/appStorage.ts(префикс города у ключей хранилища). - Тесты:
tests/test_auth.py,test_auth_master.py,test_city_access.py,test_multi_city.py,test_pg_auth_unit.py; веб —tests/utils/appStorage.spec.ts,e2e/permissions.spec.ts.
