This commit is contained in:
206
docs/WEBSOCKET_AUTH_EXPLANATION.md
Normal file
206
docs/WEBSOCKET_AUTH_EXPLANATION.md
Normal file
@@ -0,0 +1,206 @@
|
||||
# 🔐 Документация по системе аутентификации 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 токена
|
||||
|
||||
```http
|
||||
POST /api/v1/auth/login
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"email": "shadow85@list.ru",
|
||||
"password": "R0sebud1985"
|
||||
}
|
||||
```
|
||||
|
||||
**Ответ:**
|
||||
```json
|
||||
{
|
||||
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
|
||||
"token_type": "bearer",
|
||||
"user": {
|
||||
"id": 2,
|
||||
"email": "shadow85@list.ru"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2. Структура JWT токена
|
||||
|
||||
**Заголовок (Header):**
|
||||
```json
|
||||
{
|
||||
"alg": "HS256",
|
||||
"typ": "JWT"
|
||||
}
|
||||
```
|
||||
|
||||
**Содержимое (Payload):**
|
||||
```json
|
||||
{
|
||||
"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
|
||||
```
|
||||
|
||||
## Исправления для мобильного приложения
|
||||
|
||||
### ❌ НЕПРАВИЛЬНО (старый код):
|
||||
```kotlin
|
||||
// Временная заглушка - НЕ ИСПОЛЬЗОВАТЬ!
|
||||
val tempToken = "temp_token_for_${userEmail}"
|
||||
headers["Authorization"] = "Bearer $tempToken"
|
||||
```
|
||||
|
||||
### ✅ ПРАВИЛЬНО (новый код):
|
||||
```kotlin
|
||||
// 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"
|
||||
```
|
||||
|
||||
## Проверка работы системы
|
||||
|
||||
### Тест безопасности:
|
||||
```bash
|
||||
./venv/bin/python test_security_check.py
|
||||
```
|
||||
|
||||
**Ожидаемый результат:**
|
||||
```
|
||||
✅ ВСЕ ТЕСТЫ БЕЗОПАСНОСТИ ПРОЙДЕНЫ!
|
||||
✅ Временные токены корректно блокируются
|
||||
✅ JWT токены корректно принимаются
|
||||
🔒 Система готова к продакшену
|
||||
```
|
||||
|
||||
### Тест правильной аутентификации:
|
||||
```bash
|
||||
./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
|
||||
Reference in New Issue
Block a user