Files
chat/docs/WEBSOCKET_AUTH_EXPLANATION.md
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

7.5 KiB
Raw Blame History

🔐 Документация по системе аутентификации WebSocket

Проблема с токеном temp_token_for_shadow85@list.ru

Что это было?

Токен temp_token_for_shadow85@list.ru - это НЕ настоящий JWT токен, а временная строка, которую мобильное приложение отправляло для тестирования.

Откуда появился?

  1. Мобильное приложение создавало временный токен в формате: temp_token_for_{email}
  2. Отправляло в заголовке: Authorization: Bearer temp_token_for_shadow85@list.ru
  3. WebSocket ранее принимал такие токены (возможно, была заглушка)

Что было исправлено?

  1. Добавлена защита от временных токенов в get_current_user_websocket()
  2. Блокировка токенов, начинающихся с temp_token или test_token
  3. Улучшенное логирование для отладки аутентификации

Правильная система аутентификации

1. Получение JWT токена

POST /api/v1/auth/login
Content-Type: application/json

{
  "email": "shadow85@list.ru",
  "password": "R0sebud1985"
}

Ответ:

{
  "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "token_type": "bearer",
  "user": {
    "id": 2,
    "email": "shadow85@list.ru"
  }
}

2. Структура JWT токена

Заголовок (Header):

{
  "alg": "HS256",
  "typ": "JWT"
}

Содержимое (Payload):

{
  "sub": "2",                           // ID пользователя
  "email": "shadow85@list.ru",          // Email пользователя  
  "exp": 1760732009                     // Время истечения (15 минут)
}

Подпись (Signature):

HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  SECRET_KEY
)

3. WebSocket подключение

Правильный URL:

ws://localhost:8002/api/v1/emergency/ws/current_user_id?token=JWT_TOKEN_HERE

Пример:

ws://localhost:8002/api/v1/emergency/ws/current_user_id?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

Безопасность

Что РАЗРЕШЕНО:

  • Настоящие JWT токены с валидной подписью
  • Токены в пределах срока действия (15 минут)
  • Токены с корректным user_id и email

Что ЗАБЛОКИРОВАНО:

  • Токены, начинающиеся с temp_token_
  • Токены, начинающиеся с test_token_
  • Невалидные JWT токены
  • Истёкшие токены
  • Токены без подписи

Логи безопасности:

При блокировке временного токена:

❌ WebSocket auth: REJECTED - Temporary tokens not allowed in production!
❌ Token prefix: temp_token_for_shadow...

При успешной аутентификации:

✅ WebSocket auth: JWT token valid for user_id=2, email=shadow85@list.ru

Исправления для мобильного приложения

НЕПРАВИЛЬНО (старый код):

// Временная заглушка - НЕ ИСПОЛЬЗОВАТЬ!
val tempToken = "temp_token_for_${userEmail}"
headers["Authorization"] = "Bearer $tempToken"

ПРАВИЛЬНО (новый код):

// 1. Сначала авторизуемся
val loginResponse = apiService.login(
    LoginRequest(email = userEmail, password = userPassword)
)

// 2. Сохраняем JWT токен
val jwtToken = loginResponse.access_token
sharedPreferences.edit()
    .putString("jwt_token", jwtToken)
    .apply()

// 3. Используем JWT токен для WebSocket
val wsUrl = "ws://server:8002/api/v1/emergency/ws/current_user_id?token=$jwtToken"

Проверка работы системы

Тест безопасности:

./venv/bin/python test_security_check.py

Ожидаемый результат:

ВСЕ ТЕСТЫ БЕЗОПАСНОСТИ ПРОЙДЕНЫ!
✅ Временные токены корректно блокируются
✅ JWT токены корректно принимаются
🔒 Система готова к продакшену

Тест правильной аутентификации:

./venv/bin/python test_proper_authentication.py

Результаты тестирования

🛡️ Полный комплексный тест системы

Запуск: ./venv/bin/python test_final_security.py

Результат:

🎯 ОБЩИЙ РЕЗУЛЬТАТ: 4/4 тестов пройдено
🚀 СИСТЕМА ГОТОВА К ПРОДАКШЕНУ!
✅ Все аспекты безопасности и функциональности работают корректно

Пройденные тесты:

  1. 🔒 Безопасность временных токенов

    • Все temp_token токены корректно отклоняются
    • Защита от небезопасных токенов работает
  2. 🔐 JWT аутентификация

    • Авторизация через /api/v1/auth/login работает
    • JWT токены корректно создаются и принимаются
    • WebSocket подключения с JWT работают
  3. ⚙️ Базовая функциональность

    • Health check endpoint работает
    • WebSocket подключения стабильны
    • Система готова для основной функциональности
  4. 🛡️ Безопасность WebSocket

    • Пустые токены отклоняются
    • Неверные токены отклоняются
    • Только валидные JWT токены принимаются

Заключение

  1. Проблема решена: Временные токены temp_token_for_* теперь блокируются
  2. Безопасность обеспечена: Только валидные JWT токены принимаются
  3. Логирование улучшено: Подробные логи для отладки аутентификации
  4. Система протестирована: Все критические компоненты работают
  5. 🚀 Система готова: К продакшен-развертыванию

Следующие шаги:

  1. Обновить мобильное приложение - использовать настоящие JWT токены
  2. Удалить временные токены из клиентского кода
  3. Протестировать интеграцию между мобильным приложением и сервером
  4. Развернуть в продакшене - система безопасна и готова

Файлы тестирования:

  • test_final_security.py - Полный комплексный тест
  • test_proper_authentication.py - Тест правильной аутентификации
  • test_security_check.py - Расширенный тест с API endpoints