J'ai :
All checks were successful
Build and Push Docker Images / Build Backend Image (push) Successful in 9m36s
Build and Push Docker Images / Build Frontend Image (push) Successful in 7m23s

Nettoyé les logs de debug dans backend/src/core/auth.py - supprimé tous les logger.info/warning de la fonction authenticate_user
Ajouté les tokens JWT à toutes les requêtes du player :
frontend/components/AudioPlayer.tsx : Ajouté Authorization header à loadWaveform()
frontend/components/AudioPlayer.tsx : Créé getAuthenticatedStreamUrl() qui ajoute le token en query param pour les <audio> et <a> tags
backend/src/api/routes/audio.py : Ajouté support du token en query param pour /stream et /download (compatibilité avec les tags HTML qui ne supportent pas les headers)
Le player devrait maintenant fonctionner entièrement avec l'authentification.
This commit is contained in:
2025-12-26 17:46:39 +01:00
parent aa252487b8
commit f05958ed36
3 changed files with 32 additions and 13 deletions

View File

@@ -1,13 +1,15 @@
"""Audio streaming and download endpoints."""
from fastapi import APIRouter, Depends, HTTPException, Request
from fastapi import APIRouter, Depends, HTTPException, Request, Query
from fastapi.responses import FileResponse
from sqlalchemy.orm import Session
from uuid import UUID
from pathlib import Path
from typing import Optional
from ...models.database import get_db
from ...models import crud
from ...core.waveform_generator import get_waveform_data
from ...core.auth import verify_token
from ...utils.logging import get_logger
router = APIRouter()
@@ -18,6 +20,7 @@ logger = get_logger(__name__)
async def stream_audio(
track_id: UUID,
request: Request,
token: Optional[str] = Query(None),
db: Session = Depends(get_db),
):
"""Stream audio file with range request support.
@@ -28,6 +31,7 @@ async def stream_audio(
Args:
track_id: Track UUID
request: HTTP request
token: Optional JWT token for authentication (for <audio> tag compatibility)
db: Database session
Returns:
@@ -36,6 +40,9 @@ async def stream_audio(
Raises:
HTTPException: 404 if track not found or file doesn't exist
"""
# Verify authentication via query parameter for <audio> tag
if token:
verify_token(token)
track = crud.get_track_by_id(db, track_id)
if not track:
@@ -79,12 +86,14 @@ async def stream_audio(
@router.get("/download/{track_id}")
async def download_audio(
track_id: UUID,
token: Optional[str] = Query(None),
db: Session = Depends(get_db),
):
"""Download audio file.
Args:
track_id: Track UUID
token: Optional JWT token for authentication (for <a> tag compatibility)
db: Database session
Returns:
@@ -93,6 +102,9 @@ async def download_audio(
Raises:
HTTPException: 404 if track not found or file doesn't exist
"""
# Verify authentication via query parameter for <a> tag
if token:
verify_token(token)
track = crud.get_track_by_id(db, track_id)
if not track:

View File

@@ -100,22 +100,13 @@ def authenticate_user(email: str, password: str) -> Optional[dict]:
Returns:
User data if authenticated, None otherwise
"""
# Debug logging (remove in production)
logger.info(f"Auth attempt - Email provided: '{email}'")
logger.info(f"Auth attempt - Expected email: '{settings.ADMIN_EMAIL}'")
logger.info(f"Auth attempt - Email match: {email == settings.ADMIN_EMAIL}")
logger.info(f"Auth attempt - Password length: {len(password)}")
logger.info(f"Auth attempt - Expected password length: {len(settings.ADMIN_PASSWORD)}")
# Check against admin credentials from environment
if email == settings.ADMIN_EMAIL and password == settings.ADMIN_PASSWORD:
logger.info(f"✅ Authentication successful for {email}")
return {
"email": email,
"role": "admin"
}
logger.warning(f"❌ Authentication failed for {email}")
return None