All checks were successful
continuous-integration/drone/push Build is passing
206 lines
7.5 KiB
Markdown
206 lines
7.5 KiB
Markdown
# 🔐 Документация по системе аутентификации 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 |