forked from kihun0422/FestiMate_FE
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathaxiosConfig.js
More file actions
208 lines (193 loc) · 7.9 KB
/
axiosConfig.js
File metadata and controls
208 lines (193 loc) · 7.9 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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
import axios from "axios";
// Axios 기본 설정
const instance = axios.create({
baseURL: import.meta.env.VITE_BACKEND_URL,
});
// 요청 인터셉터 설정
instance.interceptors.request.use(
(config) => {
const accessToken = localStorage.getItem("jwtToken");
if (!accessToken) {
window.location.href = "/";
return Promise.reject(new Error("No access token found"));
}
if (accessToken) {
config.headers.Authorization = `Bearer ${accessToken}`;
config.headers['Content-Type'] = 'application/json'; // 추가
}
return config;
},
(error) => Promise.reject(error)
);
// 응답 인터셉터 설정
instance.interceptors.response.use(
(response) => {
// 성공 응답은 그대로 반환
return response;
},
async (error) => {
if (!error.response) {
console.error("Network error or server is down");
alert("서버에 연결할 수 없습니다. 다시 시도해 주세요.");
return Promise.reject(error);
}
console.log("에러 내용", error);
const { config, response: { status, data } } = error;
console.log("config", config, "status", status, "data", data);
const originalRequest = config;
// 액세스 토큰 만료 (401, code: 4012)
if (status === 401 && (data.code === 4011 || data.code === 4012)) {
const refreshToken = localStorage.getItem("refreshToken");
console.log("만료시 보낼 refreshToken",refreshToken)
const baseURL= import.meta.env.VITE_BACKEND_URL;
if (refreshToken) {
try {
const refreshResponse = await axios.patch(
`${baseURL}/v1/auth/reissue/token`, // baseURL은 instance에서 자동 적용
null,
{
headers: {
"Content-Type": "application/json",
"Authorization": `Bearer ${refreshToken}`,
},
}
);
console.log("재발급받아온 정보",refreshResponse);
const newAccessToken = refreshResponse.data.data.accessToken;
const newRefreshToken = refreshResponse.data.data.refreshToken;
// 토큰 업데이트
localStorage.setItem("jwtToken", newAccessToken);
if (newRefreshToken) {
localStorage.setItem("refreshToken", newRefreshToken);
}
originalRequest.headers.Authorization = `Bearer ${newAccessToken}`;
return instance(originalRequest);
} catch (refreshError) {
console.error("Refresh token error:", refreshError.response?.data);
localStorage.removeItem("jwtToken");
localStorage.removeItem("refreshToken");
alert("세션이 만료되었습니다. 다시 로그인해 주세요.");
window.location.href = "/";
return Promise.reject(refreshError);
}
} else {
localStorage.removeItem("jwtToken");
alert("토큰이 만료되었습니다. 다시 로그인해 주세요.");
window.location.href = "/";
}
}
// 새로운 상태 코드 처리 (기존 코드 유지)
// 400 Bad Request
if (status === 400) {
switch (data.code) {
case 4000:
alert("잘못된 요청입니다.");
break;
case 4001:
alert("유효하지 않은 플랫폼 타입입니다.");
break;
case 4002:
alert("요청 파라미터가 잘못되었습니다.");
break;
case 4003:
alert("입력된 글자수가 허용된 범위를 벗어났습니다.");
break;
case 4004:
alert("닉네임은 한글로만 입력 가능합니다.");
break;
case 4005:
alert("유효하지 않은 인가 코드입니다.");
break;
case 4006:
alert("유효하지 않은 날짜 형식입니다.");
break;
default:
alert("잘못된 요청입니다.");
break;
}
}
// 401 Unauthorized (기존 4012, SEC-002 제외)
if (status === 401) {
switch (data.code) {
case 4011:
// alert("액세스 토큰의 값이 올바르지 않습니다.");
break;
case 4012:
alert("엑세스 토큰이 만료되었습니다.");
break;
case 4013:
break;
case 4014:
alert("토큰 값이 올바르지 않습니다..");
break;
case 4015:
alert("토큰 값이 올바르지 않습니다.");
break;
default:
alert("인증 오류가 발생했습니다.");
break;
}
}
// 403 Forbidden (기존 메시지 유지, 코드 추가)
if (status === 403) {
console.error("권한 오류:", data);
alert("해당 작업에 대한 권한이 없습니다.");
}
// 404 Not Found (기존 메시지 유지, 세부 코드 추가)
if (status === 404) {
switch (data.code) {
case 4040:
alert("대상을 찾을 수 없습니다.");
break;
case 4041:
alert("존재하지 않는 회원입니다.");
localStorage.removeItem("jwtToken");
localStorage.removeItem("refreshToken");
window.location.href="/"
break;
case 4042:
// 축제 id가 올바르지 않을때
break;
case 4043:
alert("존재하지 않는 참가자입니다.");
break;
default:
alert("요청한 자원이 존재하지 않습니다.");
break;
}
}
// 405 Method Not Allowed
if (status === 405 && data.code === 4050) {
alert("잘못된 HTTP method 요청입니다.");
}
// 409 Conflict
if (status === 409) {
switch (data.code) {
case 4090:
alert("이미 존재하는 리소스입니다.");
break;
case 4091:
//alert("이미 존재하는 회원입니다.");
//alert 안 띄우고 ui로 처리하겠습니다. by 기훈 2025.05.01
break;
case 4092:
// alert("이미 존재하는 참여자입니다.");
break;
case 4093:
alert("포인트가 부족합니다.");
break;
default:
alert("리소스 충돌이 발생했습니다.");
break;
}
}
// 500 Internal Server Error (기존 메시지 유지, 코드 추가)
if (status === 500) {
console.error("Server error:", data);
alert("서버 오류가 발생했습니다. 잠시 후 다시 시도해 주세요.");
}
console.error("Error response:", error.response);
return error.response;
}
);
export default instance;