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

206 lines
7.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 🔐 Документация по системе аутентификации 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