import secrets import string from datetime import datetime, timedelta, timezone from typing import Optional, Dict, Any, Tuple import bcrypt from jose import jwt, JWTError from app.core.config import settings from fastapi_limiter import FastAPILimiter from fastapi_limiter.depends import RateLimiter # Ezt az auth végpontokhoz adjuk hozzá: # @router.post("/login", dependencies=[Depends(RateLimiter(times=5, seconds=60))]) DEFAULT_RANK_MAP = { "superadmin": 100, "admin": 80, "fleet_manager": 25, "service": 15, "user": 10, "driver": 5 } def generate_secure_slug(length: int = 12) -> str: """Biztonságos kód generálása (pl. mappákhoz).""" alphabet = string.ascii_lowercase + string.digits return ''.join(secrets.choice(alphabet) for _ in range(length)) def verify_password(plain_password: str, hashed_password: str) -> bool: if not hashed_password: return False try: return bcrypt.checkpw(plain_password.encode("utf-8"), hashed_password.encode("utf-8")) except Exception: return False def get_password_hash(password: str) -> str: return bcrypt.hashpw(password.encode("utf-8"), bcrypt.gensalt()).decode("utf-8") def create_tokens(data: Dict[str, Any], access_delta: Optional[timedelta] = None, refresh_delta: Optional[timedelta] = None) -> Tuple[str, str]: """Access és Refresh token generálása.""" to_encode = data.copy() now = datetime.now(timezone.utc) acc_min = access_delta if access_delta else timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES) access_payload = {**to_encode, "exp": now + acc_min, "iat": now, "type": "access", "iss": "service-finder-auth"} access_token = jwt.encode(access_payload, settings.SECRET_KEY, algorithm=settings.ALGORITHM) ref_days = refresh_delta if refresh_delta else timedelta(days=settings.REFRESH_TOKEN_EXPIRE_DAYS) refresh_payload = {"sub": str(to_encode.get("sub")), "exp": now + ref_days, "iat": now, "type": "refresh"} refresh_token = jwt.encode(refresh_payload, settings.SECRET_KEY, algorithm=settings.ALGORITHM) return access_token, refresh_token def decode_token(token: str) -> Optional[Dict[str, Any]]: try: return jwt.decode(token, settings.SECRET_KEY, algorithms=[settings.ALGORITHM]) except JWTError: return None