Вход и выбор города

Вход в веб-ТГИД своего города: логин и пароль от администратора. У каждого города свой адрес, вход в каждый город — отдельный.

Где найти
открывается сам, если сервер требует входа; иначе — меню пользователя (круглая кнопка справа вверху) → «Войти».
Права
учётную запись выдаёт администратор; без доступа к городу вход в него не пройдёт.
Функция показана в сквозном сценарии:Первый вход и карта
Читаю как

Возможности

  • Вход по логину и паролю, выданным администратором; язык интерфейса выбирается прямо в форме входа (русский, қазақша, English).
  • Каждый город — свой адрес и свой вход; переход в другой город — меню пользователя → «Перейти: <город>».
  • Выход — меню пользователя → «Выйти». Сессия заканчивается сама через срок действия входа: появится «Сессия истекла, войдите снова.» с кнопкой «Войти», логин уже подставлен.

Как это работает

Проверка пароля. Форма отправляет логин и пароль на сервер (POST /api/v1/auth/login). Сервер проверяет их по порядку:

  1. мастер-учётка сервера (логин MASTER_LOGIN, хеш пароля MASTER_PASSWORD_HASH);
  2. роли PostgreSQL, если включён вход через базу (AUTH_BACKEND=pg);
  3. иначе — база пользователей 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.

Шаги

  1. Меню пользователя → «Войти». Если сервер требует входа, форма откроется сама сразу после загрузки страницы и закрыть её нельзя.

    Вход и выбор города: шаг 1

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

    Вход и выбор города: шаг 2

Примеры

Два города у одного пользователя. Инженеру открыты Алматы и Астана. В Алматы он входит по адресу /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_request nginx). Ограничение попыток — 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.
Хотите увидеть эту функцию на своих данных?Покажем ТГИД на демонстрации и ответим на вопросы инженеров.
Запросить демо