diff --git a/backend/app/services/kiosk_auth_service.py b/backend/app/services/kiosk_auth_service.py index ec00e49..452c376 100644 --- a/backend/app/services/kiosk_auth_service.py +++ b/backend/app/services/kiosk_auth_service.py @@ -256,15 +256,15 @@ class KioskAuthService: redis = get_async_redis() key = QR_TOKEN_PREFIX + qr_token try: - data = await redis.get(key) + # GETDEL statt GET+DELETE: atomar, sonst können zwei parallele + # Requests denselben Token vor dem Löschen lesen (TOCTOU, Audit- + # Finding K-1) und beide eine Session erzeugen. + data = await redis.getdel(key) except Exception as exc: raise HTTPException(status_code=503, detail="QR-Login nicht verfügbar (Redis).") from exc if data is None: raise HTTPException(status_code=401, detail="QR-Code abgelaufen oder ungültig.") - # Einmalig: Token sofort löschen - await redis.delete(key) - payload = json.loads(data) if str(payload.get("company_id")) != str(company_id): raise HTTPException(status_code=401, detail="QR-Code für falsches Unternehmen.")