فهرست منبع

新增内部鉴权机制

袁威 1 هفته پیش
والد
کامیت
2edc06ad20
1فایلهای تغییر یافته به همراه29 افزوده شده و 3 حذف شده
  1. 29 3
      app/api/auto_import.py

+ 29 - 3
app/api/auto_import.py

@@ -71,6 +71,7 @@ async def _post_form(
         files: List[Tuple[str, bytes, str] | Tuple[str, bytes, str, str]],
         params: Optional[Dict[str, Any]] = None,
         form_fields: Optional[Dict[str, Any]] = None,
+        headers: Optional[Dict[str, str]] = None,
 ) -> Tuple[int, bytes]:
     """通用 multipart 调用:files 元素为 (field_name, file_bytes, filename[, content_type])。"""
     form_data = aiohttp.FormData()
@@ -93,7 +94,7 @@ async def _post_form(
         )
 
     try:
-        async with session.post(url, data=form_data, params=params) as response:
+        async with session.post(url, data=form_data, params=params, headers=headers) as response:
             response_content = await response.read()
             if not response.ok:
                 logger.error(
@@ -208,6 +209,7 @@ async def create_card_record(
         card_name: str,
         cardNo: Optional[str],
         card_type: CardType,
+        forward_headers: Optional[Dict[str, str]] = None,
 ) -> int:
     """调用自身服务创建新的卡牌记录"""
     url = f"{base_url}{settings.API_PREFIX}/cards/created"
@@ -215,7 +217,7 @@ async def create_card_record(
     if cardNo:
         params["cardNo"] = cardNo
 
-    async with session.post(url, params=params) as response:
+    async with session.post(url, params=params, headers=forward_headers) as response:
         if response.status == 201:
             data = await response.json()
             return data.get("id")
@@ -231,6 +233,7 @@ async def upload_main_image(
         file_bytes: bytes,
         filename: str,
         score_json: Dict[str, Any],
+        forward_headers: Optional[Dict[str, str]] = None,
 ):
     """带 JSON 的图走主图入库接口(fusion / ring / stripe 共用同一面的 detection_json)。"""
     url = f"{base_url}{settings.API_PREFIX}/images/insert/{card_id}"
@@ -247,6 +250,7 @@ async def upload_main_image(
             ("json_data_file", json_bytes, f"{image_type}_score.json", "application/json"),
         ],
         form_fields=form_fields,
+        headers=forward_headers,
     )
     if status != 201:
         logger.error(
@@ -263,6 +267,7 @@ async def upload_auxiliary_image(
         image_type: str,
         file_bytes: bytes,
         filename: str,
+        forward_headers: Optional[Dict[str, str]] = None,
 ):
     """ring / gray / stripe 这些辅助图走灰度图入库接口(不带 JSON)。"""
     url = f"{base_url}{settings.API_PREFIX}/images/insert/gray/{card_id}"
@@ -273,6 +278,7 @@ async def upload_auxiliary_image(
         url=url,
         files=[("image", file_bytes, filename or f"{image_type}.jpg")],
         form_fields=form_fields,
+        headers=forward_headers,
     )
     if status != 201:
         logger.error(
@@ -308,6 +314,7 @@ async def _run_import_flow(
         strict_mode: bool,
         bytes_map: Dict[str, Tuple[bytes, str]],
         non_gray_to_main: bool = False,
+        forward_headers: Optional[Dict[str, str]] = None,
 ) -> Dict[str, Any]:
     """
     共用导入流程:bytes_map 的 key 是 image_type,value 是 (bytes, filename)。
@@ -361,7 +368,14 @@ async def _run_import_flow(
             )
 
         # 2. 创建卡牌
-        card_id = await create_card_record(session, local_base_url, card_name, cardNo, card_type)
+        card_id = await create_card_record(
+            session,
+            local_base_url,
+            card_name,
+            cardNo,
+            card_type,
+            forward_headers=forward_headers,
+        )
         logger.info("auto_import card_created card_name=%s card_id=%s", card_name, card_id)
 
         # 3. 串行上传所有图:避免同时打满本服务的数据库连接池
@@ -393,6 +407,7 @@ async def _run_import_flow(
                     await upload_main_image(
                         session, local_base_url, card_id,
                         image_type, f_bytes, f_name, score_json,
+                        forward_headers=forward_headers,
                     )
                 else:
                     if field == "fusion" and score_json is None:
@@ -403,6 +418,7 @@ async def _run_import_flow(
                     await upload_auxiliary_image(
                         session, local_base_url, card_id,
                         image_type, f_bytes, f_name,
+                        forward_headers=forward_headers,
                     )
                 upload_count += 1
 
@@ -460,6 +476,10 @@ async def auto_import_script_api(
     ring + gray + stripe1..4,返回的 JSON 落到对应 fusion 主图记录中。
     """
     local_base_url = str(request.base_url).rstrip("/")
+    forward_headers: Dict[str, str] = {}
+    auth = request.headers.get("authorization")
+    if auth:
+        forward_headers["Authorization"] = auth
 
     raw_inputs: Dict[str, Union[UploadFile, str, None]] = {
         ImageType.front_fusion.value: front_fusion,
@@ -507,6 +527,7 @@ async def auto_import_script_api(
             strict_mode=strict_mode,
             bytes_map=bytes_map,
             non_gray_to_main=True,
+            forward_headers=forward_headers or None,
         )
     except HTTPException as e:
         logger.error(
@@ -546,6 +567,10 @@ async def auto_import_url_script_api(
         back_stripe4: Optional[str] = Form(None, description="反面调光图4 URL"),
 ):
     local_base_url = str(request.base_url).rstrip("/")
+    forward_headers: Dict[str, str] = {}
+    auth = request.headers.get("authorization")
+    if auth:
+        forward_headers["Authorization"] = auth
 
     url_inputs: Dict[str, Optional[str]] = {
         ImageType.front_fusion.value: front_fusion,
@@ -610,6 +635,7 @@ async def auto_import_url_script_api(
             strict_mode=strict_mode,
             bytes_map=bytes_map,
             non_gray_to_main=True,
+            forward_headers=forward_headers or None,
         )
     except HTTPException:
         raise