diff --git a/backend/src/api/dependencies.py b/backend/src/api/dependencies.py index ae03205..5724bae 100644 --- a/backend/src/api/dependencies.py +++ b/backend/src/api/dependencies.py @@ -12,8 +12,8 @@ from ..core.security import verify_token, get_user_id_from_token from ..models.user import User -# HTTP Bearer 토큰 스키마 -security = HTTPBearer() +# HTTP Bearer 토큰 스키마 (선택적) +security = HTTPBearer(auto_error=False) async def get_current_user( @@ -94,16 +94,22 @@ async def get_current_user_with_token_param( db: AsyncSession = Depends(get_db) ) -> User: """URL 파라미터 또는 헤더에서 토큰을 가져와서 사용자 인증""" + print(f"🔍 토큰 인증 시작 - URL 파라미터: {_token[:50] if _token else 'None'}...") + print(f"🔍 Authorization 헤더: {credentials.credentials[:50] if credentials else 'None'}...") + token = None # URL 파라미터에서 토큰 확인 if _token: token = _token + print("✅ URL 파라미터에서 토큰 사용") # Authorization 헤더에서 토큰 확인 elif credentials: token = credentials.credentials + print("✅ Authorization 헤더에서 토큰 사용") if not token: + print("❌ 토큰이 제공되지 않음") raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="No authentication token provided" @@ -112,23 +118,27 @@ async def get_current_user_with_token_param( try: # 토큰에서 사용자 ID 추출 user_id = get_user_id_from_token(token) + print(f"✅ 토큰에서 사용자 ID 추출: {user_id}") # 데이터베이스에서 사용자 조회 result = await db.execute(select(User).where(User.id == user_id)) user = result.scalar_one_or_none() if not user: + print(f"❌ 사용자를 찾을 수 없음: {user_id}") raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="User not found" ) if not user.is_active: + print(f"❌ 비활성 사용자: {user.email}") raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Inactive user" ) + print(f"✅ 사용자 인증 성공: {user.email}") return user except Exception as e: diff --git a/backend/src/api/routes/documents.py b/backend/src/api/routes/documents.py index dc79d7d..8b887b8 100644 --- a/backend/src/api/routes/documents.py +++ b/backend/src/api/routes/documents.py @@ -516,9 +516,14 @@ async def get_document_pdf( db: AsyncSession = Depends(get_db) ): """문서 PDF 파일 조회""" + print(f"🔍 PDF 요청 - 문서 ID: {document_id}") + print(f"🔍 토큰 파라미터: {_token[:50] if _token else 'None'}...") + print(f"🔍 현재 사용자: {current_user.email if current_user else 'None'}") + try: doc_uuid = UUID(document_id) except ValueError: + print(f"❌ 잘못된 문서 ID 형식: {document_id}") raise HTTPException(status_code=400, detail="Invalid document ID format") # 문서 조회 @@ -527,10 +532,16 @@ async def get_document_pdf( document = result.scalar_one_or_none() if not document: + print(f"❌ 문서를 찾을 수 없음: {document_id}") raise HTTPException(status_code=404, detail="Document not found") + print(f"📄 문서 정보: {document.title}") + print(f"🔐 문서 권한: is_public={document.is_public}, uploaded_by={document.uploaded_by}") + print(f"👤 사용자 권한: is_admin={current_user.is_admin}, user_id={current_user.id}") + # 권한 확인 if not current_user.is_admin and not document.is_public and document.uploaded_by != current_user.id: + print(f"❌ 접근 권한 없음 - 관리자: {current_user.is_admin}, 공개: {document.is_public}, 소유자: {document.uploaded_by == current_user.id}") raise HTTPException(status_code=403, detail="Access denied") # PDF 파일 확인 @@ -562,11 +573,20 @@ async def get_document_pdf( print(f"📂 디렉토리도 없음: {dir_path}") raise HTTPException(status_code=404, detail="PDF file not found on disk") - return FileResponse( + # PDF 인라인 표시를 위한 헤더 설정 + from fastapi.responses import FileResponse + + response = FileResponse( path=file_path, media_type='application/pdf', filename=f"{document.title}.pdf" ) + + # 브라우저에서 인라인으로 표시하도록 설정 (다운로드 방지) + response.headers["Content-Disposition"] = f"inline; filename=\"{document.title}.pdf\"" + response.headers["X-Frame-Options"] = "SAMEORIGIN" # iframe 허용 + + return response @router.get("/{document_id}/search-in-content") diff --git a/frontend/pdf-manager.html b/frontend/pdf-manager.html index 147005e..4ef2969 100644 --- a/frontend/pdf-manager.html +++ b/frontend/pdf-manager.html @@ -193,6 +193,12 @@
PDF를 로드하는 중...
+PDF를 로드할 수 없습니다
+ + +