From 87fca22ea0a833a6a78a2264d10b6064f592a72b Mon Sep 17 00:00:00 2001 From: king Date: Fri, 14 Aug 2026 13:54:15 +0900 Subject: [PATCH] =?UTF-8?q?feat(cafe24):=20=EB=94=94=EC=9E=90=EC=9D=B8=20?= =?UTF-8?q?=EC=8A=A4=EC=BD=94=ED=94=84=20=EC=B6=94=EA=B0=80=20(mall.read?= =?UTF-8?q?=5Fdesign/write=5Fdesign)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 상단 공통 홍보를 스킨 쪽에서 처리할 수 있는지 실물로 확인하려면 토큰에 디자인 권한이 있어야 한다. 개발자센터 앱에는 이미 추가됐고, 우리가 요청하는 scope 에도 넣는다. 재인증을 해야 실제 토큰에 반영된다. 확인해 둔 사실을 config.py 주석으로 남겼다. 카페24 Admin API 에는 스킨 HTML 파일(detail.html)을 직접 읽거나 쓰는 엔드포인트가 없다. 조회 가능한 것은 테마 목록과 테마 페이지뿐이며, 스크립트 태그 주입은 디자인이 아니라 mall.write_store 권한이고 인라인 코드가 아닌 외부 HTTPS URL 만 받는다. 요청 scope 를 DEFAULT_SCOPES 한 곳으로 모아, 앞으로 늘어날 때 authorize 와 클라이언트가 어긋나지 않게 했다. 검증: 유닛테스트 49개 통과. scope_param 출력 확인. Co-Authored-By: Claude Opus 5 --- app/integrations/cafe24/__init__.py | 6 +++++- app/integrations/cafe24/config.py | 13 ++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/app/integrations/cafe24/__init__.py b/app/integrations/cafe24/__init__.py index 4b37b13..3a00cd2 100644 --- a/app/integrations/cafe24/__init__.py +++ b/app/integrations/cafe24/__init__.py @@ -28,6 +28,8 @@ from typing import Any from . import products from .client import Cafe24Client from .config import ( + DEFAULT_SCOPES, + DESIGN_SCOPES, ORDER_SCOPES, PRODUCT_SCOPES, Cafe24Config, @@ -58,6 +60,8 @@ __all__ = [ "products", "PRODUCT_SCOPES", "ORDER_SCOPES", + "DESIGN_SCOPES", + "DEFAULT_SCOPES", "Cafe24Error", "Cafe24ConfigError", "Cafe24AuthError", @@ -75,7 +79,7 @@ class Cafe24Api: client: Cafe24Client -def build_cafe24_api(store: Any, *, scopes: tuple[str, ...] = PRODUCT_SCOPES) -> Cafe24Api: +def build_cafe24_api(store: Any, *, scopes: tuple[str, ...] = DEFAULT_SCOPES) -> Cafe24Api: """Cafe24Store 를 저장소로 쓰는 API 묶음 생성. store 는 토큰 3개 메서드(get_token_row/save_token_row/token_lock)와 diff --git a/app/integrations/cafe24/config.py b/app/integrations/cafe24/config.py index c212767..af50e58 100644 --- a/app/integrations/cafe24/config.py +++ b/app/integrations/cafe24/config.py @@ -13,6 +13,17 @@ from dataclasses import dataclass PRODUCT_SCOPES: tuple[str, ...] = ("mall.read_product", "mall.write_product") ORDER_SCOPES: tuple[str, ...] = ("mall.read_order", "mall.write_order") +# 디자인(테마) — 상단 공통 홍보 숨김을 스킨 쪽에서 처리할 수 있는지 확인/구현용. +# ⚠️ 카페24 Admin API 에는 스킨 HTML 파일(detail.html)을 직접 읽거나 쓰는 +# 엔드포인트가 없다. 조회 가능한 것은 테마 목록과 테마 페이지뿐이다. +# 스크립트 태그 주입은 디자인이 아니라 mall.write_store(상점) 권한이며 +# 인라인 코드가 아닌 외부 HTTPS URL 만 받는다. +DESIGN_SCOPES: tuple[str, ...] = ("mall.read_design", "mall.write_design") + +# 실제로 요청하는 scope 묶음. 개발자센터 앱에 등록된 권한과 어긋나면 인증이 +# 거부되므로, 여기에 추가할 때는 앱 권한도 함께 확인해야 한다. +DEFAULT_SCOPES: tuple[str, ...] = PRODUCT_SCOPES + DESIGN_SCOPES + DEFAULT_API_VERSION = "2026-03-01" @@ -57,7 +68,7 @@ class Cafe24Config: return ",".join(self.scopes) -def load_config(*, scopes: tuple[str, ...] = PRODUCT_SCOPES) -> Cafe24Config: +def load_config(*, scopes: tuple[str, ...] = DEFAULT_SCOPES) -> Cafe24Config: """환경변수에서 설정을 읽는다. 값이 없어도 예외를 던지지 않는다. 미설정 판단은 호출부가 `configured` / `missing` 으로 한다