54 lines
1.6 KiB
Python
54 lines
1.6 KiB
Python
import httpx
|
|
import os
|
|
import logging
|
|
from fastapi import HTTPException, Header
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
LITELLM_URL = os.getenv("LITELLM_PROXY_URL", "http://litellm:4000")
|
|
MASTER_KEY = os.getenv("LITELLM_MASTER_KEY")
|
|
|
|
async def verify_api_key(authorization: str = Header(...)) -> dict:
|
|
token = authorization.removeprefix("Bearer ")
|
|
|
|
async with httpx.AsyncClient() as client:
|
|
try:
|
|
# Master Key nutzen um Key-Info abzufragen
|
|
resp = await client.get(
|
|
f"{LITELLM_URL}/key/info",
|
|
headers={
|
|
"Authorization": f"Bearer {MASTER_KEY}"
|
|
},
|
|
params={"key": token},
|
|
timeout=5.0
|
|
)
|
|
except httpx.RequestError as e:
|
|
logger.error(f"LiteLLM nicht erreichbar: {e}")
|
|
raise HTTPException(503, f"Auth service unavailable: {e}")
|
|
|
|
logger.debug(f"LiteLLM Status: {resp.status_code}")
|
|
logger.debug(f"LiteLLM Response: {resp.text}")
|
|
|
|
if resp.status_code == 404:
|
|
raise HTTPException(401, "Invalid API Key")
|
|
if resp.status_code == 401:
|
|
raise HTTPException(401, "Invalid API Key")
|
|
if resp.status_code != 200:
|
|
raise HTTPException(502, f"Auth service error: {resp.status_code}")
|
|
|
|
data = resp.json()
|
|
|
|
user_id = (
|
|
data.get("info", {}).get("user_id") or
|
|
data.get("user_id")
|
|
)
|
|
|
|
if not user_id:
|
|
raise HTTPException(400, "API Key hat keine user_id")
|
|
|
|
return {
|
|
"user_id": user_id,
|
|
"token": token,
|
|
"key_alias": data.get("info", {}).get("key_alias"),
|
|
}
|