Files
chat/tests/test_proper_authentication.py
Andrey K. Choi 3050e084fa
All checks were successful
continuous-integration/drone/push Build is passing
main functions commit
2025-10-19 19:50:00 +09:00

162 lines
6.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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())