ai-model-studio / src /core /auth.py
slk1st's picture
Deploy AI Model Studio
8a03d2c verified
Raw
History Blame Contribute Delete
3.68 kB
"""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()