-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapi_client.py
More file actions
93 lines (85 loc) · 4.37 KB
/
api_client.py
File metadata and controls
93 lines (85 loc) · 4.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# api_client.py
import requests
from PyQt6.QtCore import QSettings
from logging_handler import logger
from config import AUTH_URL
class APIClient:
def __init__(self):
self.settings = QSettings("MyCompany", "CardApp")
self.access_token = None
self.refresh_token = self.settings.value("refresh_token", None)
logger.info("APIClient 초기화 완료.")
if self.refresh_token:
logger.info("저장된 Refresh Token을 로드했습니다.")
def _auth_headers(self, use_refresh=False):
headers = {"Content-Type": "application/json"}
token = self.refresh_token if use_refresh else self.access_token
if token:
headers["Authorization"] = f"Bearer {token}"
return headers
def login(self, user_id: str, user_password: str):
url = f"{AUTH_URL}/api/login"
# 중요: 로그에 비밀번호를 남기지 않도록 payload를 별도로 구성
payload = {"user_id": user_id, "user_password": user_password}
log_payload = {"user_id": user_id}
logger.info(f"로그인 요청 -> URL: {url}, Body: {log_payload}")
try:
resp = requests.post(url, json=payload, timeout=5)
resp.raise_for_status()
data = resp.json()
logger.info(f"로그인 응답 <- Status: {resp.status_code}, Response: {data}")
if resp.status_code == 200:
self.access_token = data.get("access_token")
self.refresh_token = data.get("refresh_token")
if self.refresh_token:
self.settings.setValue("refresh_token", self.refresh_token)
logger.info("Access Token과 Refresh Token을 발급받고 저장했습니다.")
return data
except requests.exceptions.RequestException as e:
logger.error(f"로그인 요청 실패. 에러: {e}", exc_info=True)
return {"detail": f"서버 요청 실패: {e}"}
def refresh_token_api(self):
url = f"{AUTH_URL}/api/token"
logger.info(f"토큰 갱신 요청 -> URL: {url}")
try:
resp = requests.post(url, headers=self._auth_headers(use_refresh=True))
data = resp.json()
logger.info(f"토큰 갱신 응답 <- Status: {resp.status_code}, Response: {data}")
if resp.status_code == 200:
self.access_token = data.get("access_token")
logger.info("새로운 Access Token으로 갱신되었습니다.")
else:
self.settings.remove("refresh_token")
self.refresh_token = None
logger.warning("Refresh Token이 만료되어 저장된 토큰을 삭제했습니다.")
return data
except requests.exceptions.RequestException as e:
logger.error(f"토큰 갱신 요청 실패. 에러: {e}", exc_info=True)
return {"detail": f"서버 요청 실패: {e}"}
def logout(self):
url = f"{AUTH_URL}/api/logout"
logger.info(f"로그아웃 요청 -> URL: {url}")
try:
resp = requests.post(url, headers=self._auth_headers())
logger.info(f"로그아웃 응답 <- Status: {resp.status_code}")
if resp.status_code == 200:
self.access_token = None
self.refresh_token = None
self.settings.remove("refresh_token")
logger.info("성공적으로 로그아웃되었으며, 저장된 토큰을 모두 삭제했습니다.")
return resp.json()
except requests.exceptions.RequestException as e:
logger.error(f"로그아웃 요청 실패. 에러: {e}", exc_info=True)
return {"detail": f"서버 요청 실패: {e}"}
def register_card(self, emp_no: str, pubkey: str):
url = f"{AUTH_URL}/api/card"
payload = {"emp_no": emp_no, "pubkey": pubkey}
logger.info(f"카드 등록 요청 -> URL: {url}, Body: {payload}")
try:
resp = requests.post(url, json=payload, headers=self._auth_headers())
data = resp.json()
logger.info(f"카드 등록 응답 <- Status: {resp.status_code}, Response: {data}")
return data
except requests.exceptions.RequestException as e:
logger.error(f"카드 등록 요청 실패. 에러: {e}", exc_info=True)
return {"detail": f"서버 요청 실패: {e}"}