Initial commit: RAG Service

This commit is contained in:
2026-01-26 20:17:44 +03:00
commit 9b8a1c64bc
22 changed files with 2255 additions and 0 deletions

71
app/api/auth.py Normal file
View File

@@ -0,0 +1,71 @@
"""
Авторизация для API RAG сервиса.
Поддерживает авторизацию через API ключ в заголовке X-API-Key.
"""
import logging
from typing import Annotated, Optional
from fastapi import Depends, HTTPException, Security, status
from fastapi.security import APIKeyHeader
from app.config import Settings, get_settings
logger = logging.getLogger(__name__)
# Схема авторизации через заголовок
api_key_header = APIKeyHeader(name="X-API-Key", auto_error=False)
async def verify_api_key(
api_key: Annotated[Optional[str], Security(api_key_header)],
settings: Annotated[Settings, Depends(get_settings)],
) -> bool:
"""
Проверяет API ключ из заголовка запроса.
Args:
api_key: Ключ из заголовка X-API-Key
settings: Настройки приложения
Returns:
True если авторизация успешна
Raises:
HTTPException: Если ключ неверный или отсутствует
"""
# Если API ключ не настроен и разрешены запросы без авторизации
if settings.api_key is None:
if settings.allow_no_auth:
logger.debug("Авторизация отключена (RAG_ALLOW_NO_AUTH=true)")
return True
else:
logger.warning("API ключ не настроен! Установите RAG_API_KEY")
# В продакшене без ключа сервис не должен работать
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail="API ключ не настроен на сервере",
)
# Проверяем ключ
if api_key is None:
logger.warning("Запрос без API ключа")
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="API ключ не предоставлен. Используйте заголовок X-API-Key",
headers={"WWW-Authenticate": "ApiKey"},
)
if api_key != settings.api_key:
logger.warning("Неверный API ключ")
raise HTTPException(
status_code=status.HTTP_403_FORBIDDEN,
detail="Неверный API ключ",
)
return True
# Dependency для использования в роутах
AuthDep = Annotated[bool, Depends(verify_api_key)]