diff --git a/src/backend/langflow/api/v1/store.py b/src/backend/langflow/api/v1/store.py index 65f004fa5..c94bf0156 100644 --- a/src/backend/langflow/api/v1/store.py +++ b/src/backend/langflow/api/v1/store.py @@ -51,12 +51,19 @@ def check_if_store_is_enabled( @router.get("/check/api_key") -def check_if_store_has_api_key( - api_key=Depends(get_optional_user_store_api_key), +async def check_if_store_has_api_key( + api_key: Optional[str] = Depends(get_optional_user_store_api_key), + store_service: StoreService = Depends(get_store_service), ): - return { - "has_api_key": api_key is not None, - } + if api_key is None: + return {"has_api_key": False} + + try: + is_valid = await store_service.check_api_key(api_key) + except Exception as e: + raise HTTPException(status_code=400, detail=str(e)) + + return {"has_api_key": is_valid} @router.post("/components/", response_model=CreateComponentResponse, status_code=201) diff --git a/src/backend/langflow/services/store/service.py b/src/backend/langflow/services/store/service.py index 5da323138..acf6efcd0 100644 --- a/src/backend/langflow/services/store/service.py +++ b/src/backend/langflow/services/store/service.py @@ -4,8 +4,6 @@ from uuid import UUID import httpx from httpx import HTTPError, HTTPStatusError -from loguru import logger - from langflow.services.base import Service from langflow.services.store.schema import ( CreateComponentResponse, @@ -15,6 +13,7 @@ from langflow.services.store.schema import ( StoreComponentCreate, ) from langflow.services.store.utils import process_tags_for_post, update_components_with_user_data +from loguru import logger if TYPE_CHECKING: from langflow.services.settings.service import SettingsService @@ -78,6 +77,23 @@ class StoreService(Service): # will make a property return that data # Without making the request multiple times + async def check_api_key(self, api_key: str): + # Check if the api key is valid + # If it is, return True + # If it is not, return False + try: + user_data, _ = await self._get(f"{self.base_url}/users/me", api_key, params={"fields": "id"}) + if isinstance(user_data, list): + user_data = user_data[0] + return "id" in user_data + except HTTPStatusError as exc: + if exc.response.status_code in [403, 401]: + return False + else: + raise ValueError(f"Unexpected status code: {exc.response.status_code}") + except Exception as exc: + raise ValueError(f"Unexpected error: {exc}") + async def _get( self, url: str, api_key: Optional[str] = None, params: Optional[Dict[str, Any]] = None ) -> Tuple[List[Dict[str, Any]], Dict[str, Any]]: