auth: вход по логину/паролю от веб-админки роутера + сессионные токены

- auth.py: NDM-аутентификация (md5+sha256 challenge) к http://ROUTER_HOST/auth
- Сессионные токены (secrets, TTL 8ч, скользящее окно), заголовок X-Session-Token
- WEB_PASSWORD остаётся как запасной мастер-пароль
- /api/login и /api/logout, форма входа в UI с полем «Логин»
- Шапка автора в UI: GitHub, Telegram, Boosty, Поддержать (Ozon СБП)
- README: NDM-флоу, переменные ROUTER_HOST/ROUTER_LOGIN/ROUTER_TIMEOUT
- install.sh копирует auth.py
This commit is contained in:
Андрей Бобырев
2026-04-26 00:19:09 +03:00
parent 7c7a58b3a9
commit 75cb432e13
6 changed files with 324 additions and 90 deletions

View File

@@ -1,16 +1,29 @@
# Пароль веб-интерфейса (обязательно смените)
WEB_PASSWORD=change_me
# --- Авторизация по логину/паролю от веб-админки роутера (рекомендуется) ---
# HTTP-адрес админки Keenetic. На самом роутере обычно подходит loopback.
# Если приложение крутится в той же LAN — поставьте http://192.168.1.1
ROUTER_HOST=http://127.0.0.1
# Логин по умолчанию в форме входа (можно изменить руками при логине)
ROUTER_LOGIN=admin
# Таймаут запроса к /auth роутера, секунд
ROUTER_TIMEOUT=5
# --- Запасной/мастер пароль (если ROUTER_HOST недоступен) ---
# Если роутерная авторизация не сработала, разрешит вход по этому паролю.
# Можно оставить пустым, чтобы вход был только по паролю от админки.
WEB_PASSWORD=
# --- Сеть ---
# Порт HTTP (по умолчанию 2001)
PORT=2001
# Таймаут одной команды, сек
CMD_TIMEOUT=300
# Подпись внизу страницы (Telegram @username без @)
# Подпись и Telegram внизу страницы (без @)
AUTHOR_TELEGRAM_USERNAME=Iot_andrey
# Ограничение по IP клиента (через запятую). Пусто = все IP (только пароль).
# Пример: ALLOWED_IPS=192.168.1.0/24 нельзя — только конкретные хосты:
# ALLOWED_IPS=192.168.1.100,10.0.0.5
# Ограничение по IP клиента (через запятую, без масок). Пусто = все IP.
# Пример: ALLOWED_IPS=192.168.1.100,10.0.0.5
ALLOWED_IPS=