Spaces:
Running
Running
File size: 2,993 Bytes
bffe28b |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
#!/usr/bin/env python3
"""
Module d'authentification pour l'API.
Fournit un système de vérification de clé API via header HTTP.
"""
from fastapi import Header, HTTPException, status
from fastapi.security import APIKeyHeader
from src.config import get_settings
# Schéma pour la documentation Swagger
api_key_header = APIKeyHeader(name="X-API-Key", auto_error=False)
async def verify_api_key(x_api_key: str = Header(None)) -> str:
"""
Vérifie que la clé API fournie est valide.
Cette fonction est utilisée comme dépendance FastAPI (Depends).
Elle vérifie le header HTTP "X-API-Key" et compare avec la clé configurée.
Args:
x_api_key: Clé API fournie dans le header HTTP.
Returns:
str: La clé API validée.
Raises:
HTTPException: 401 si la clé est manquante ou invalide.
Comment ça marche :
1. FastAPI extrait automatiquement le header "X-API-Key"
2. La fonction compare avec la clé configurée dans .env
3. Si valide → continue, sinon → erreur 401
Exemple d'utilisation :
```python
@app.post("/predict", dependencies=[Depends(verify_api_key)])
async def predict(...):
# Cette route est protégée !
```
Exemple de requête curl :
```bash
curl -X POST http://localhost:8000/predict \\
-H "X-API-Key: your-secret-key" \\
-H "Content-Type: application/json" \\
-d '{...}'
```
"""
settings = get_settings()
# En mode DEBUG, on peut désactiver l'auth
if settings.DEBUG:
return "debug-mode-no-auth-required"
# Vérifier que la clé est fournie
if not x_api_key:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail={
"error": "API Key missing",
"message": "Le header 'X-API-Key' est requis pour accéder à cette ressource",
"solution": "Ajoutez le header: -H 'X-API-Key: votre-cle-api'",
},
headers={"WWW-Authenticate": "ApiKey"},
)
# Vérifier que la clé est correcte
if x_api_key != settings.API_KEY:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail={
"error": "Invalid API Key",
"message": "La clé API fournie est invalide",
"solution": "Vérifiez votre clé API ou contactez l'administrateur",
},
headers={"WWW-Authenticate": "ApiKey"},
)
return x_api_key
def get_api_key_dependency():
"""
Retourne la dépendance d'authentification si nécessaire.
Permet de conditionner l'authentification selon la config.
Returns:
Depends(verify_api_key) si auth requise, None sinon.
"""
settings = get_settings()
if settings.is_api_key_required:
from fastapi import Depends
return Depends(verify_api_key)
return None
|