"""API密钥认证模块 - 简化版""" import os import threading from typing import Any from pathlib import Path from ..utils.logger import get_logger # 初始化日志 logger = get_logger(__name__) class APIKeyManager: """简化的API密钥管理器 - 只保留基本验证功能""" def __init__(self, keys_file: str | None = None): logger.info("初始化 API 密钥管理器") self.keys_file: str = keys_file or str(Path(__file__).parent.parent.parent / "config" / "api_keys.txt") self.api_keys: set[str] = set() self.key_names: dict[str, str] = {} # api_key -> name self._lock: threading.Lock = threading.Lock() logger.debug(f"API 密钥文件路径: {self.keys_file}") def load_keys(self) -> bool: """从配置文件加载API密钥""" logger.info("开始加载 API 密钥") try: if not os.path.exists(self.keys_file): logger.warning(f"API 密钥文件不存在: {self.keys_file}") return False with self._lock: self.api_keys.clear() self.key_names.clear() valid_count = 0 error_count = 0 logger.debug(f"读取密钥文件: {self.keys_file}") with open(self.keys_file, 'r', encoding='utf-8') as f: for line_num, line in enumerate(f, 1): line = line.strip() # 跳过空行和注释行 if not line or line.startswith('#'): continue # 解析格式: key_name:api_key:description parts = line.split(':', 2) if len(parts) < 2: logger.warning(f"第 {line_num} 行格式错误,跳过") error_count += 1 continue key_name = parts[0].strip() api_key = parts[1].strip() # 验证密钥格式 if not api_key.startswith('sk-'): logger.warning(f"第 {line_num} 行密钥格式无效 ({key_name}),跳过") error_count += 1 continue self.api_keys.add(api_key) self.key_names[api_key] = key_name valid_count += 1 logger.debug(f"加载密钥: {key_name} ({api_key[:8]}...)") if valid_count > 0: logger.success(f"成功加载 {valid_count} 个 API 密钥") if error_count > 0: logger.warning(f"跳过 {error_count} 个无效条目") return True except Exception as e: logger.error(f"加载 API 密钥失败: {e}") return False def validate_key(self, api_key: str) -> bool: """验证API密钥是否有效""" if not api_key: logger.debug("API 密钥为空") return False is_valid = api_key.strip() in self.api_keys if is_valid: key_name = self.key_names.get(api_key.strip(), 'unknown') logger.debug(f"API 密钥验证成功: {key_name} ({api_key[:8]}...)") else: logger.debug(f"API 密钥验证失败: {api_key[:8]}...") return is_valid # 全局密钥管理器实例 api_key_manager = APIKeyManager()