# 🔐 Emergency Service API - Руководство по авторизации ## Обзор Все эндпоинты Emergency Service API требуют авторизацию через JWT Bearer токен. ## 🔑 Получение токена авторизации ### 1. Регистрация пользователя (если нет аккаунта) ```bash curl -X POST "http://localhost:8001/api/v1/auth/register" \ -H "Content-Type: application/json" \ -d '{ "username": "testuser", "email": "test@example.com", "password": "testpass", "full_name": "Test User", "phone": "+1234567890" }' ``` ### 2. Получение JWT токена ```bash curl -X POST "http://localhost:8001/api/v1/auth/login" \ -H "Content-Type: application/json" \ -d '{ "username": "testuser", "password": "testpass" }' ``` **Ответ:** ```json { "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "token_type": "bearer", "expires_in": 86400 } ``` ## 🚨 Использование API Emergency Service ### Авторизация через Bearer токен Все запросы должны включать заголовок: ``` Authorization: Bearer ``` ### Примеры использования #### 📊 Получение статистики ```bash TOKEN="your_jwt_token_here" curl -X GET "http://localhost:8002/api/v1/stats" \ -H "Authorization: Bearer $TOKEN" ``` #### 🆘 Создание экстренного события ```bash TOKEN="your_jwt_token_here" curl -X POST "http://localhost:8002/api/v1/emergency/events" \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{ "latitude": 55.7558, "longitude": 37.6176, "alert_type": "general", "message": "Нужна помощь!", "address": "Красная площадь, Москва", "contact_emergency_services": true, "notify_emergency_contacts": true }' ``` #### 🔍 Получение детальной информации о событии ```bash TOKEN="your_jwt_token_here" EVENT_ID="123" curl -X GET "http://localhost:8002/api/v1/emergency/events/$EVENT_ID" \ -H "Authorization: Bearer $TOKEN" ``` #### 💬 Ответ на событие ```bash TOKEN="your_jwt_token_here" EVENT_ID="123" curl -X POST "http://localhost:8002/api/v1/emergency/events/$EVENT_ID/respond" \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{ "response_type": "help_on_way", "message": "Еду к вам, буду через 10 минут", "eta_minutes": 10 }' ``` #### 🏁 Завершение события ```bash TOKEN="your_jwt_token_here" EVENT_ID="123" curl -X PUT "http://localhost:8002/api/v1/emergency/events/$EVENT_ID/resolve" \ -H "Authorization: Bearer $TOKEN" ``` ## 🔧 Автоматизация авторизации ### Bash скрипт для получения токена ```bash #!/bin/bash # Функция для получения токена get_auth_token() { local username="$1" local password="$2" TOKEN=$(curl -s -X POST "http://localhost:8001/api/v1/auth/login" \ -H "Content-Type: application/json" \ -d "{\"username\": \"$username\", \"password\": \"$password\"}" | \ jq -r '.access_token') if [ "$TOKEN" = "null" ] || [ -z "$TOKEN" ]; then echo "❌ Failed to authenticate" exit 1 fi echo "$TOKEN" } # Использование TOKEN=$(get_auth_token "testuser" "testpass") echo "✅ Token obtained: ${TOKEN:0:20}..." # Теперь можно использовать TOKEN в запросах curl -X GET "http://localhost:8002/api/v1/stats" \ -H "Authorization: Bearer $TOKEN" ``` ### Python пример ```python import requests import json def get_auth_token(username, password): """Получение JWT токена""" auth_data = { "username": username, "password": password } response = requests.post( "http://localhost:8001/api/v1/auth/login", json=auth_data ) if response.status_code == 200: return response.json()["access_token"] else: raise Exception(f"Authentication failed: {response.status_code}") def emergency_api_call(token, endpoint, method="GET", data=None): """Универсальная функция для вызова Emergency API""" headers = { "Authorization": f"Bearer {token}", "Content-Type": "application/json" } url = f"http://localhost:8002{endpoint}" if method == "GET": response = requests.get(url, headers=headers) elif method == "POST": response = requests.post(url, headers=headers, json=data) elif method == "PUT": response = requests.put(url, headers=headers, json=data) return response.json() # Пример использования if __name__ == "__main__": # Получаем токен token = get_auth_token("testuser", "testpass") print("✅ Token obtained") # Получаем статистику stats = emergency_api_call(token, "/api/v1/stats") print("📊 Stats:", stats) # Создаем событие event_data = { "latitude": 55.7558, "longitude": 37.6176, "alert_type": "general", "message": "Test emergency", "address": "Test Address" } event = emergency_api_call(token, "/api/v1/emergency/events", "POST", event_data) print("🆘 Event created:", event["id"]) ``` ## 🔒 Безопасность ### Важные моменты: 1. **Храните токены безопасно** - не передавайте их в URL или логах 2. **Токены имеют срок действия** - обновляйте их регулярно 3. **Используйте HTTPS** в продакшн среде 4. **Не делитесь токенами** - каждый пользователь должен иметь свой токен ### Обработка ошибок авторизации: ```json // 401 Unauthorized { "detail": "Could not validate credentials" } // 403 Forbidden { "detail": "Not authenticated" } ``` ## 📚 Документация API После запуска сервиса документация доступна по адресу: - **Swagger UI**: http://localhost:8002/docs - **ReDoc**: http://localhost:8002/redoc - **OpenAPI JSON**: http://localhost:8002/openapi.json В Swagger UI теперь есть кнопка **🔓 Authorize** для ввода Bearer токена!