aa2aa7f8c9
- Удален Basic Auth, заменен на современную JWT авторизацию - Добавлена страница входа с красивым интерфейсом - Обновлен фронтенд для работы с JWT токенами - Добавлены новые зависимости: PyJWT, passlib[bcrypt], jinja2 - Создан тестовый скрипт для проверки авторизации - Добавлено руководство по миграции - Обновлена документация и README - Улучшен дизайн поля ввода пароля на странице входа Автор: Сергей Антропов Сайт: https://devops.org.ru
200 lines
6.8 KiB
Python
200 lines
6.8 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
Тестовый скрипт для проверки новой системы авторизации LogBoard+
|
|
Автор: Сергей Антропов
|
|
Сайт: https://devops.org.ru
|
|
"""
|
|
|
|
import requests
|
|
import json
|
|
import sys
|
|
from datetime import datetime
|
|
|
|
# Настройки
|
|
BASE_URL = "http://localhost:9001"
|
|
USERNAME = "admin"
|
|
PASSWORD = "admin123"
|
|
|
|
def test_login():
|
|
"""Тест входа в систему"""
|
|
print("🔐 Тестирование входа в систему...")
|
|
|
|
try:
|
|
response = requests.post(
|
|
f"{BASE_URL}/api/auth/login",
|
|
json={
|
|
"username": USERNAME,
|
|
"password": PASSWORD
|
|
},
|
|
headers={"Content-Type": "application/json"}
|
|
)
|
|
|
|
if response.status_code == 200:
|
|
data = response.json()
|
|
print(f"✅ Успешный вход! Получен токен: {data['access_token'][:20]}...")
|
|
return data['access_token']
|
|
else:
|
|
print(f"❌ Ошибка входа: {response.status_code} - {response.text}")
|
|
return None
|
|
|
|
except Exception as e:
|
|
print(f"❌ Ошибка соединения: {e}")
|
|
return None
|
|
|
|
def test_protected_endpoint(token):
|
|
"""Тест защищенного эндпоинта"""
|
|
print("\n🔒 Тестирование защищенного эндпоинта...")
|
|
|
|
try:
|
|
response = requests.get(
|
|
f"{BASE_URL}/api/auth/me",
|
|
headers={"Authorization": f"Bearer {token}"}
|
|
)
|
|
|
|
if response.status_code == 200:
|
|
data = response.json()
|
|
print(f"✅ Доступ к защищенному эндпоинту: {data}")
|
|
return True
|
|
else:
|
|
print(f"❌ Ошибка доступа: {response.status_code} - {response.text}")
|
|
return False
|
|
|
|
except Exception as e:
|
|
print(f"❌ Ошибка соединения: {e}")
|
|
return False
|
|
|
|
def test_projects_api(token):
|
|
"""Тест API проектов"""
|
|
print("\n📋 Тестирование API проектов...")
|
|
|
|
try:
|
|
response = requests.get(
|
|
f"{BASE_URL}/api/projects",
|
|
headers={"Authorization": f"Bearer {token}"}
|
|
)
|
|
|
|
if response.status_code == 200:
|
|
projects = response.json()
|
|
print(f"✅ Получен список проектов: {projects}")
|
|
return True
|
|
else:
|
|
print(f"❌ Ошибка получения проектов: {response.status_code} - {response.text}")
|
|
return False
|
|
|
|
except Exception as e:
|
|
print(f"❌ Ошибка соединения: {e}")
|
|
return False
|
|
|
|
def test_services_api(token):
|
|
"""Тест API сервисов"""
|
|
print("\n🐳 Тестирование API сервисов...")
|
|
|
|
try:
|
|
response = requests.get(
|
|
f"{BASE_URL}/api/services",
|
|
headers={"Authorization": f"Bearer {token}"}
|
|
)
|
|
|
|
if response.status_code == 200:
|
|
services = response.json()
|
|
print(f"✅ Получен список сервисов: {len(services)} контейнеров")
|
|
return True
|
|
else:
|
|
print(f"❌ Ошибка получения сервисов: {response.status_code} - {response.text}")
|
|
return False
|
|
|
|
except Exception as e:
|
|
print(f"❌ Ошибка соединения: {e}")
|
|
return False
|
|
|
|
def test_logout(token):
|
|
"""Тест выхода из системы"""
|
|
print("\n🚪 Тестирование выхода из системы...")
|
|
|
|
try:
|
|
response = requests.post(
|
|
f"{BASE_URL}/api/auth/logout",
|
|
headers={"Authorization": f"Bearer {token}"}
|
|
)
|
|
|
|
if response.status_code == 200:
|
|
print("✅ Успешный выход из системы")
|
|
return True
|
|
else:
|
|
print(f"❌ Ошибка выхода: {response.status_code} - {response.text}")
|
|
return False
|
|
|
|
except Exception as e:
|
|
print(f"❌ Ошибка соединения: {e}")
|
|
return False
|
|
|
|
def test_unauthorized_access():
|
|
"""Тест доступа без авторизации"""
|
|
print("\n🚫 Тестирование доступа без авторизации...")
|
|
|
|
try:
|
|
response = requests.get(f"{BASE_URL}/api/projects")
|
|
|
|
if response.status_code == 401:
|
|
print("✅ Правильно отклонен доступ без авторизации")
|
|
return True
|
|
else:
|
|
print(f"❌ Неожиданный ответ: {response.status_code} - {response.text}")
|
|
return False
|
|
|
|
except Exception as e:
|
|
print(f"❌ Ошибка соединения: {e}")
|
|
return False
|
|
|
|
def main():
|
|
"""Основная функция тестирования"""
|
|
print("🧪 Тестирование новой системы авторизации LogBoard+")
|
|
print("=" * 60)
|
|
print(f"📅 Время тестирования: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
|
|
print(f"🌐 URL: {BASE_URL}")
|
|
print(f"👤 Пользователь: {USERNAME}")
|
|
print("=" * 60)
|
|
|
|
# Проверяем доступность сервера
|
|
try:
|
|
response = requests.get(f"{BASE_URL}/healthz")
|
|
if response.status_code != 200:
|
|
print("❌ Сервер недоступен")
|
|
sys.exit(1)
|
|
print("✅ Сервер доступен")
|
|
except Exception as e:
|
|
print(f"❌ Сервер недоступен: {e}")
|
|
sys.exit(1)
|
|
|
|
# Тестируем вход
|
|
token = test_login()
|
|
if not token:
|
|
print("❌ Тест провален: не удалось войти в систему")
|
|
sys.exit(1)
|
|
|
|
# Тестируем защищенные эндпоинты
|
|
success = True
|
|
success &= test_protected_endpoint(token)
|
|
success &= test_projects_api(token)
|
|
success &= test_services_api(token)
|
|
|
|
# Тестируем выход
|
|
success &= test_logout(token)
|
|
|
|
# Тестируем доступ без авторизации
|
|
success &= test_unauthorized_access()
|
|
|
|
print("\n" + "=" * 60)
|
|
if success:
|
|
print("🎉 Все тесты пройдены успешно!")
|
|
print("✅ Новая система авторизации работает корректно")
|
|
else:
|
|
print("❌ Некоторые тесты провалились")
|
|
print("🔧 Проверьте настройки и логи сервера")
|
|
|
|
print("=" * 60)
|
|
|
|
if __name__ == "__main__":
|
|
main()
|