This commit is contained in:
162
tests/test_proper_authentication.py
Normal file
162
tests/test_proper_authentication.py
Normal 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())
|
||||
Reference in New Issue
Block a user