diff --git a/app/api/api_key_api.py b/app/api/api_key_api.py index 7a26140..0617237 100644 --- a/app/api/api_key_api.py +++ b/app/api/api_key_api.py @@ -4,6 +4,7 @@ from app.core.response import ResponseMessage from app.core.status import CommonCode from app.schemas.api_key.create_model import APIKeyCreate +from app.schemas.api_key.decrypted_response_model import DecryptedAPIKeyResponse from app.schemas.api_key.response_model import APIKeyResponse from app.schemas.api_key.update_model import APIKeyUpdate from app.services.api_key_service import APIKeyService, api_key_service @@ -31,7 +32,6 @@ def store_api_key( response_data = APIKeyResponse( id=created_api_key.id, service_name=created_api_key.service_name.value, - api_key_encrypted=created_api_key.api_key, created_at=created_api_key.created_at, updated_at=created_api_key.updated_at, ) @@ -86,6 +86,23 @@ def get_api_key_by_service_name( return ResponseMessage.success(value=response_data, code=CommonCode.SUCCESS_GET_API_KEY) +@router.get( + "/find/decrypted/{serviceName}", + response_model=ResponseMessage[DecryptedAPIKeyResponse], + summary="[내부용] 복호화된 API KEY 조회", + description="내부 AI 서버와 같이, 신뢰된 서비스가 복호화된 API 키를 요청할 때 사용합니다. (외부 노출 금지)", + # include_in_schema=False, # Swagger 문서에 포함하지 않음 +) +def get_decrypted_api_key( + serviceName: LLMServiceEnum, service: APIKeyService = api_key_service_dependency +) -> ResponseMessage[DecryptedAPIKeyResponse]: + """서비스 이름을 기준으로 API Key를 복호화하여 반환합니다.""" + decrypted_key = service.get_decrypted_api_key(serviceName.value) + return ResponseMessage.success( + value=DecryptedAPIKeyResponse(api_key=decrypted_key), code=CommonCode.SUCCESS_GET_API_KEY + ) + + @router.put( "/modify/{serviceName}", response_model=ResponseMessage[APIKeyResponse], diff --git a/app/schemas/api_key/decrypted_response_model.py b/app/schemas/api_key/decrypted_response_model.py new file mode 100644 index 0000000..65c730e --- /dev/null +++ b/app/schemas/api_key/decrypted_response_model.py @@ -0,0 +1,7 @@ +from pydantic import BaseModel, Field + + +class DecryptedAPIKeyResponse(BaseModel): + """Decrypted API Key 응답용 스키마""" + + api_key: str = Field(..., description="복호화된 실제 API Key") diff --git a/app/services/api_key_service.py b/app/services/api_key_service.py index 36b7492..88f1730 100644 --- a/app/services/api_key_service.py +++ b/app/services/api_key_service.py @@ -61,6 +61,16 @@ def get_api_key_by_service_name(self, service_name: str) -> APIKeyInDB: except sqlite3.Error as e: raise APIException(CommonCode.FAIL) from e + def get_decrypted_api_key(self, service_name: str) -> str: + """서비스 이름으로 암호화된 API Key를 조회하고 복호화하여 반환합니다.""" + api_key_in_db = self.get_api_key_by_service_name(service_name) + try: + decrypted_key = AES256.decrypt(api_key_in_db.api_key) + return decrypted_key + except Exception as e: + # 복호화 실패 시 서버 에러 발생 + raise APIException(CommonCode.FAIL_DECRYPT_API_KEY) from e + def update_api_key(self, service_name: str, key_data: APIKeyUpdate) -> APIKeyInDB: """서비스 이름에 해당하는 API Key를 수정합니다.""" key_data.validate_with_api_key()