J'ai :
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:
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user