| |
| import asyncio |
| import os |
| import time |
| from typing import Optional |
| from datetime import datetime |
| from core.utils import sign_in_with_idp, handle_firebase_response, refresh_token_via_rest |
|
|
|
|
| class TokenManager: |
| def __init__(self): |
| self.id_token: Optional[str] = None |
| self.last_refresh_time: Optional[float] = None |
| self.refresh_interval = 30 * 60 |
| self.is_running = False |
|
|
| async def get_token(self) -> str: |
| """ |
| 获取当前的 idToken,如果不存在或已过期则刷新 |
| """ |
| if not self.id_token or self._should_refresh(): |
| await self.refresh_token() |
| return self.id_token |
|
|
| def _should_refresh(self) -> bool: |
| """ |
| 检查是否需要刷新 token |
| """ |
| if not self.last_refresh_time: |
| return True |
| return time.time() - self.last_refresh_time >= self.refresh_interval |
|
|
| async def refresh_token(self): |
| """ |
| 刷新 idToken |
| """ |
| try: |
| if os.getenv("REFRESH_TOKEN", "") == "" or os.getenv("REFRESH_TOKEN", "") == "None": |
| response = await sign_in_with_idp() |
| result = await handle_firebase_response(response) |
| else: |
| result = await refresh_token_via_rest(os.getenv("REFRESH_TOKEN")) |
| if result is not None: |
| self.id_token = result |
| |
| print(f"Before Token is {os.getenv('TOKEN', '')}") |
| os.environ["TOKEN"] = self.id_token |
| print(f"Now Token is {os.getenv('TOKEN', '')}") |
| self.last_refresh_time = time.time() |
| print(f"Token refreshed at {datetime.now()}") |
| else: |
| print(f"Failed to refresh token: {result['error']}") |
| except Exception as e: |
| print(f"Error refreshing token: {str(e)}") |
|
|
| async def start_auto_refresh(self): |
| """ |
| 启动自动刷新任务 |
| """ |
| if self.is_running: |
| return |
|
|
| self.is_running = True |
| while self.is_running: |
| try: |
| await self.refresh_token() |
| |
| await asyncio.sleep(self.refresh_interval) |
| except Exception as e: |
| print(f"Auto refresh error: {str(e)}") |
| |
| await asyncio.sleep(60) |
|
|
| async def stop_auto_refresh(self): |
| """ |
| 停止自动刷新任务 |
| """ |
| self.is_running = False |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|