main functions commit
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
2025-10-19 19:50:00 +09:00
parent ce72785184
commit 3050e084fa
39 changed files with 7149 additions and 186 deletions

View File

@@ -0,0 +1,162 @@
#!/usr/bin/env python3
"""
Тест правильной аутентификации и WebSocket подключения
"""
import asyncio
import json
import httpx
import websockets
from typing import Optional
class ProperAuthTest:
def __init__(self):
self.base_url = "http://localhost:8000" # API Gateway
self.ws_url = "ws://localhost:8002" # Emergency Service
self.token: Optional[str] = None
async def login_and_get_token(self) -> Optional[str]:
"""Получаем настоящий JWT токен через авторизацию"""
try:
async with httpx.AsyncClient() as client:
# Данные для входа
login_data = {
"email": "shadow85@list.ru",
"password": "R0sebud1985"
}
print("🔐 Авторизация пользователя...")
response = await client.post(
f"{self.base_url}/api/v1/auth/login",
json=login_data,
headers={"Content-Type": "application/json"}
)
print(f"📡 Статус авторизации: {response.status_code}")
if response.status_code == 200:
auth_data = response.json()
token = auth_data.get("access_token")
print(f"✅ Получен JWT токен: {token[:50]}...")
return token
else:
print(f"❌ Ошибка авторизации: {response.text}")
return None
except Exception as e:
print(f"❌ Ошибка при авторизации: {e}")
return None
async def test_websocket_with_jwt_token(self, token: str) -> bool:
"""Тестируем WebSocket подключение с настоящим JWT токеном"""
try:
# Формируем URL с JWT токеном
ws_url = f"{self.ws_url}/api/v1/emergency/ws/current_user_id?token={token}"
print(f"🔌 Подключение к WebSocket с JWT токеном...")
async with websockets.connect(ws_url) as websocket:
print("✅ WebSocket подключен успешно!")
# Отправляем тестовое сообщение
test_message = {
"type": "ping",
"message": "Hello from proper auth test!"
}
await websocket.send(json.dumps(test_message))
print(f"📤 Отправлено: {test_message}")
# Ждём ответ (с таймаутом)
try:
response = await asyncio.wait_for(websocket.recv(), timeout=5.0)
print(f"📥 Получен ответ: {response}")
except asyncio.TimeoutError:
print("⏰ Таймаут - ответ не получен, но подключение работает")
return True
except websockets.exceptions.ConnectionClosed as e:
print(f"❌ WebSocket подключение закрыто: {e.code} - {e.reason}")
return False
except Exception as e:
print(f"❌ Ошибка WebSocket подключения: {e}")
return False
async def show_token_analysis(self, token: str):
"""Анализ JWT токена"""
print("\n" + "="*50)
print("🔍 АНАЛИЗ JWT ТОКЕНА")
print("="*50)
try:
import jwt
from shared.config import settings
# Декодируем токен БЕЗ проверки (для анализа структуры)
unverified_payload = jwt.decode(token, options={"verify_signature": False})
print(f"📋 Содержимое токена:")
for key, value in unverified_payload.items():
if key == 'exp':
import datetime
exp_time = datetime.datetime.fromtimestamp(value)
print(f" {key}: {value} ({exp_time})")
else:
print(f" {key}: {value}")
# Проверяем подпись
try:
verified_payload = jwt.decode(
token,
settings.SECRET_KEY,
algorithms=[settings.ALGORITHM]
)
print("✅ Подпись токена валидна")
except jwt.InvalidTokenError as e:
print(f"❌ Ошибка проверки подписи: {e}")
except Exception as e:
print(f"❌ Ошибка анализа токена: {e}")
async def run_test(self):
"""Запуск полного теста"""
print("🚀 ЗАПУСК ТЕСТА ПРАВИЛЬНОЙ АУТЕНТИФИКАЦИИ")
print("="*60)
# Шаг 1: Получаем JWT токен
token = await self.login_and_get_token()
if not token:
print("Не удалось получить токен. Проверьте, что сервисы запущены.")
return False
# Шаг 2: Анализируем токен
await self.show_token_analysis(token)
# Шаг 3: Тестируем WebSocket
print("\n" + "="*50)
print("🔌 ТЕСТ WEBSOCKET ПОДКЛЮЧЕНИЯ")
print("="*50)
websocket_success = await self.test_websocket_with_jwt_token(token)
# Результат
print("\n" + "="*50)
print("📊 РЕЗУЛЬТАТ ТЕСТА")
print("="*50)
if websocket_success:
print("✅ Тест пройден успешно!")
print("✅ JWT аутентификация работает корректно")
print("✅ WebSocket подключение установлено")
else:
print("❌ Тест не прошел")
print("❌ Проблемы с WebSocket подключением")
return websocket_success
async def main():
"""Главная функция"""
tester = ProperAuthTest()
await tester.run_test()
if __name__ == "__main__":
asyncio.run(main())