All checks were successful
continuous-integration/drone/push Build is passing
7.5 KiB
7.5 KiB
🔐 Документация по системе аутентификации WebSocket
Проблема с токеном temp_token_for_shadow85@list.ru
Что это было?
Токен temp_token_for_shadow85@list.ru - это НЕ настоящий JWT токен, а временная строка, которую мобильное приложение отправляло для тестирования.
Откуда появился?
- Мобильное приложение создавало временный токен в формате:
temp_token_for_{email} - Отправляло в заголовке:
Authorization: Bearer temp_token_for_shadow85@list.ru - WebSocket ранее принимал такие токены (возможно, была заглушка)
Что было исправлено?
- Добавлена защита от временных токенов в
get_current_user_websocket() - Блокировка токенов, начинающихся с
temp_tokenилиtest_token - Улучшенное логирование для отладки аутентификации
Правильная система аутентификации
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 тестов пройдено
🚀 СИСТЕМА ГОТОВА К ПРОДАКШЕНУ!
✅ Все аспекты безопасности и функциональности работают корректно
✅ Пройденные тесты:
-
🔒 Безопасность временных токенов
- Все temp_token токены корректно отклоняются
- Защита от небезопасных токенов работает
-
🔐 JWT аутентификация
- Авторизация через
/api/v1/auth/loginработает - JWT токены корректно создаются и принимаются
- WebSocket подключения с JWT работают
- Авторизация через
-
⚙️ Базовая функциональность
- Health check endpoint работает
- WebSocket подключения стабильны
- Система готова для основной функциональности
-
🛡️ Безопасность WebSocket
- Пустые токены отклоняются
- Неверные токены отклоняются
- Только валидные JWT токены принимаются
Заключение
- ✅ Проблема решена: Временные токены
temp_token_for_*теперь блокируются - ✅ Безопасность обеспечена: Только валидные JWT токены принимаются
- ✅ Логирование улучшено: Подробные логи для отладки аутентификации
- ✅ Система протестирована: Все критические компоненты работают
- 🚀 Система готова: К продакшен-развертыванию
Следующие шаги:
- Обновить мобильное приложение - использовать настоящие JWT токены
- Удалить временные токены из клиентского кода
- Протестировать интеграцию между мобильным приложением и сервером
- Развернуть в продакшене - система безопасна и готова
Файлы тестирования:
test_final_security.py- Полный комплексный тестtest_proper_authentication.py- Тест правильной аутентификацииtest_security_check.py- Расширенный тест с API endpoints