Files
rmser/ocr-service/app/services/auth.py

68 lines
2.5 KiB
Python
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.

import os
import time
import logging
import requests
from typing import Optional
logger = logging.getLogger(__name__)
IAM_TOKEN_URL = "https://iam.api.cloud.yandex.net/iam/v1/tokens"
class YandexAuthManager:
def __init__(self):
self.oauth_token = os.getenv("YANDEX_OAUTH_TOKEN")
# Кэширование IAM токена
self._iam_token = None
self._token_expire_time = 0
if not self.oauth_token:
logger.warning("YANDEX_OAUTH_TOKEN not set. Yandex services will be unavailable.")
def is_configured(self) -> bool:
return bool(self.oauth_token)
def reset_token(self):
"""Сбрасывает кэшированный токен, заставляя получить новый при следующем вызове."""
self._iam_token = None
self._token_expire_time = 0
def get_iam_token(self) -> Optional[str]:
"""
Получает IAM-токен. Если есть живой кэшированный — возвращает его.
Если нет — обменивает OAuth на IAM.
"""
current_time = time.time()
# Если токен есть и он "свежий" (с запасом в 5 минут)
if self._iam_token and current_time < self._token_expire_time - 300:
return self._iam_token
if not self.oauth_token:
logger.error("OAuth token not available.")
return None
logger.info("Obtaining new IAM token from Yandex...")
try:
response = requests.post(
IAM_TOKEN_URL,
json={"yandexPassportOauthToken": self.oauth_token},
timeout=10
)
response.raise_for_status()
data = response.json()
self._iam_token = data["iamToken"]
# Токен обычно живет 12 часов, но мы будем ориентироваться на поле expiresAt если нужно,
# или просто поставим таймер. Для простоты берем 1 час жизни кэша.
self._token_expire_time = current_time + 3600
logger.info("IAM token received successfully.")
return self._iam_token
except Exception as e:
logger.error(f"Failed to get IAM token: {e}")
return None
# Глобальный инстанс
yandex_auth = YandexAuthManager()