feat: BreakPilot PWA - Full codebase (clean push without large binaries)
Some checks failed
Tests / Go Tests (push) Has been cancelled
Tests / Python Tests (push) Has been cancelled
Tests / Integration Tests (push) Has been cancelled
Tests / Go Lint (push) Has been cancelled
Tests / Python Lint (push) Has been cancelled
Tests / Security Scan (push) Has been cancelled
Tests / All Checks Passed (push) Has been cancelled
Security Scanning / Secret Scanning (push) Has been cancelled
Security Scanning / Dependency Vulnerability Scan (push) Has been cancelled
Security Scanning / Go Security Scan (push) Has been cancelled
Security Scanning / Python Security Scan (push) Has been cancelled
Security Scanning / Node.js Security Scan (push) Has been cancelled
Security Scanning / Docker Image Security (push) Has been cancelled
Security Scanning / Security Summary (push) Has been cancelled
CI/CD Pipeline / Go Tests (push) Has been cancelled
CI/CD Pipeline / Python Tests (push) Has been cancelled
CI/CD Pipeline / Website Tests (push) Has been cancelled
CI/CD Pipeline / Linting (push) Has been cancelled
CI/CD Pipeline / Security Scan (push) Has been cancelled
CI/CD Pipeline / Docker Build & Push (push) Has been cancelled
CI/CD Pipeline / Integration Tests (push) Has been cancelled
CI/CD Pipeline / Deploy to Staging (push) Has been cancelled
CI/CD Pipeline / Deploy to Production (push) Has been cancelled
CI/CD Pipeline / CI Summary (push) Has been cancelled
ci/woodpecker/manual/build-ci-image Pipeline was successful
ci/woodpecker/manual/main Pipeline failed
Some checks failed
Tests / Go Tests (push) Has been cancelled
Tests / Python Tests (push) Has been cancelled
Tests / Integration Tests (push) Has been cancelled
Tests / Go Lint (push) Has been cancelled
Tests / Python Lint (push) Has been cancelled
Tests / Security Scan (push) Has been cancelled
Tests / All Checks Passed (push) Has been cancelled
Security Scanning / Secret Scanning (push) Has been cancelled
Security Scanning / Dependency Vulnerability Scan (push) Has been cancelled
Security Scanning / Go Security Scan (push) Has been cancelled
Security Scanning / Python Security Scan (push) Has been cancelled
Security Scanning / Node.js Security Scan (push) Has been cancelled
Security Scanning / Docker Image Security (push) Has been cancelled
Security Scanning / Security Summary (push) Has been cancelled
CI/CD Pipeline / Go Tests (push) Has been cancelled
CI/CD Pipeline / Python Tests (push) Has been cancelled
CI/CD Pipeline / Website Tests (push) Has been cancelled
CI/CD Pipeline / Linting (push) Has been cancelled
CI/CD Pipeline / Security Scan (push) Has been cancelled
CI/CD Pipeline / Docker Build & Push (push) Has been cancelled
CI/CD Pipeline / Integration Tests (push) Has been cancelled
CI/CD Pipeline / Deploy to Staging (push) Has been cancelled
CI/CD Pipeline / Deploy to Production (push) Has been cancelled
CI/CD Pipeline / CI Summary (push) Has been cancelled
ci/woodpecker/manual/build-ci-image Pipeline was successful
ci/woodpecker/manual/main Pipeline failed
All services: admin-v2, studio-v2, website, ai-compliance-sdk, consent-service, klausur-service, voice-service, and infrastructure. Large PDFs and compiled binaries excluded via .gitignore.
This commit is contained in:
7
backend/llm_gateway/middleware/__init__.py
Normal file
7
backend/llm_gateway/middleware/__init__.py
Normal file
@@ -0,0 +1,7 @@
|
||||
"""
|
||||
LLM Gateway Middleware.
|
||||
"""
|
||||
|
||||
from .auth import verify_api_key
|
||||
|
||||
__all__ = ["verify_api_key"]
|
||||
96
backend/llm_gateway/middleware/auth.py
Normal file
96
backend/llm_gateway/middleware/auth.py
Normal file
@@ -0,0 +1,96 @@
|
||||
"""
|
||||
Auth Middleware für LLM Gateway.
|
||||
|
||||
Unterstützt:
|
||||
- API Key Auth (X-API-Key Header oder Authorization Bearer)
|
||||
- JWT Token Auth (vom Consent Service)
|
||||
"""
|
||||
|
||||
import logging
|
||||
from typing import Optional
|
||||
from fastapi import HTTPException, Header, Depends
|
||||
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
|
||||
import jwt
|
||||
|
||||
from ..config import get_config
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
security = HTTPBearer(auto_error=False)
|
||||
|
||||
|
||||
async def verify_api_key(
|
||||
x_api_key: Optional[str] = Header(None, alias="X-API-Key"),
|
||||
authorization: Optional[HTTPAuthorizationCredentials] = Depends(security),
|
||||
) -> str:
|
||||
"""
|
||||
Verifiziert den API Key oder JWT Token.
|
||||
|
||||
Akzeptiert:
|
||||
- X-API-Key Header
|
||||
- Authorization: Bearer <token>
|
||||
|
||||
Returns:
|
||||
str: User ID oder "api_key" bei API Key Auth
|
||||
"""
|
||||
config = get_config()
|
||||
|
||||
# 1. Prüfe X-API-Key Header
|
||||
if x_api_key:
|
||||
if x_api_key in config.api_keys:
|
||||
return "api_key"
|
||||
logger.warning(f"Invalid API key attempted")
|
||||
raise HTTPException(
|
||||
status_code=401,
|
||||
detail={"error": "unauthorized", "message": "Invalid API key"},
|
||||
)
|
||||
|
||||
# 2. Prüfe Authorization Header
|
||||
if authorization:
|
||||
token = authorization.credentials
|
||||
|
||||
# Prüfe ob es ein API Key ist
|
||||
if token in config.api_keys:
|
||||
return "api_key"
|
||||
|
||||
# Versuche JWT zu dekodieren
|
||||
if config.jwt_secret:
|
||||
try:
|
||||
payload = jwt.decode(
|
||||
token,
|
||||
config.jwt_secret,
|
||||
algorithms=["HS256"],
|
||||
)
|
||||
user_id = payload.get("user_id") or payload.get("sub")
|
||||
if user_id:
|
||||
return str(user_id)
|
||||
except jwt.ExpiredSignatureError:
|
||||
raise HTTPException(
|
||||
status_code=401,
|
||||
detail={"error": "token_expired", "message": "Token has expired"},
|
||||
)
|
||||
except jwt.InvalidTokenError as e:
|
||||
logger.warning(f"Invalid JWT token: {e}")
|
||||
raise HTTPException(
|
||||
status_code=401,
|
||||
detail={"error": "invalid_token", "message": "Invalid token"},
|
||||
)
|
||||
|
||||
# 3. In Development Mode ohne Auth erlauben
|
||||
if config.debug:
|
||||
logger.warning("Auth bypassed in debug mode")
|
||||
return "debug_user"
|
||||
|
||||
# 4. Keine gültige Auth gefunden
|
||||
raise HTTPException(
|
||||
status_code=401,
|
||||
detail={
|
||||
"error": "unauthorized",
|
||||
"message": "API key or valid token required",
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
def get_current_user_id(user_id: str = Depends(verify_api_key)) -> str:
|
||||
"""Dependency um die aktuelle User ID zu bekommen."""
|
||||
return user_id
|
||||
Reference in New Issue
Block a user