Initial commit
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
# app/core/auth.py
|
||||
from fastapi import Depends, HTTPException, status, Request
|
||||
from fastapi.security import HTTPBasic, HTTPBasicCredentials
|
||||
from typing import Dict, Optional, Any
|
||||
import secrets
|
||||
import logging
|
||||
from app.core.config import get_settings
|
||||
|
||||
logger = logging.getLogger('VADApp')
|
||||
|
||||
# Базовая HTTP аутентификация
|
||||
security = HTTPBasic()
|
||||
|
||||
# Хранилище сессий (в реальном приложении лучше использовать Redis или другое хранилище)
|
||||
sessions: Dict[str, str] = {}
|
||||
|
||||
def verify_credentials(credentials: HTTPBasicCredentials) -> bool:
|
||||
"""Проверка учетных данных пользователя"""
|
||||
settings = get_settings()
|
||||
correct_username = settings.auth.username
|
||||
correct_password = settings.auth.password
|
||||
|
||||
# Безопасное сравнение строк для предотвращения timing-атак
|
||||
is_username_correct = secrets.compare_digest(credentials.username, correct_username)
|
||||
is_password_correct = secrets.compare_digest(credentials.password, correct_password)
|
||||
|
||||
return is_username_correct and is_password_correct
|
||||
|
||||
def create_session_token(username: str) -> str:
|
||||
"""Создание токена сессии"""
|
||||
token = secrets.token_hex(16)
|
||||
sessions[token] = username
|
||||
logger.info(f"Создана новая сессия для пользователя {username}")
|
||||
return token
|
||||
|
||||
def remove_session(token: str) -> None:
|
||||
"""Удаление сессии"""
|
||||
if token in sessions:
|
||||
username = sessions.pop(token)
|
||||
logger.info(f"Сессия для пользователя {username} удалена")
|
||||
|
||||
def get_current_user(request: Request) -> Optional[str]:
|
||||
"""Получение текущего пользователя из сессии"""
|
||||
token = request.cookies.get("session_token")
|
||||
if token and token in sessions:
|
||||
return sessions[token]
|
||||
return None
|
||||
|
||||
def require_auth(request: Request) -> str:
|
||||
"""Проверка аутентификации пользователя"""
|
||||
username = get_current_user(request)
|
||||
if not username:
|
||||
logger.warning("Попытка доступа без аутентификации")
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_401_UNAUTHORIZED,
|
||||
detail="Требуется аутентификация",
|
||||
headers={"WWW-Authenticate": "Basic"},
|
||||
)
|
||||
return username
|
||||
Reference in New Issue
Block a user