From c08af2e16edf1a8fa30671ac4b4a05397657cc8c Mon Sep 17 00:00:00 2001 From: hiwon-lee <84234411+hiwon-lee@users.noreply.github.com> Date: Sat, 25 Jan 2025 00:46:29 +0900 Subject: [PATCH 1/3] =?UTF-8?q?=F0=9F=90=9B=20fix:=20=20dropout=20403=20er?= =?UTF-8?q?ror?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/my/_services/getUserInfo.ts | 23 ++++++++++++++++++----- src/app/my/editinfo/page.tsx | 2 +- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/app/my/_services/getUserInfo.ts b/src/app/my/_services/getUserInfo.ts index 4937c814..58a259e5 100644 --- a/src/app/my/_services/getUserInfo.ts +++ b/src/app/my/_services/getUserInfo.ts @@ -152,15 +152,28 @@ export async function deleteUser() { console.log(accessToken); // 2. 첫 번째 요청 시도 - const response = await axios.patch(url, { - headers: getHeaders(accessToken || ''), - }); + const response = await axios.patch( + url, + {}, + { + headers: getHeaders(accessToken || ''), + }, + ); + + console.log(response); if (response.status === 200) { - return response; + const logoutResponse = await axios.post( + `${process.env.NEXT_PUBLIC_BASE_URL}/logout`, + {}, + { + headers: getHeaders(accessToken || ''), + }, + ); + return logoutResponse; } - return '회원정보 수정에 실패했습니다.'; + return '회원 탈퇴에 실패했습니다.'; // eslint-disable-next-line @typescript-eslint/no-explicit-any } catch (error: any) { diff --git a/src/app/my/editinfo/page.tsx b/src/app/my/editinfo/page.tsx index ad02fa37..bca1ca9b 100644 --- a/src/app/my/editinfo/page.tsx +++ b/src/app/my/editinfo/page.tsx @@ -78,7 +78,7 @@ export default function EditProfile() { }, }); - // 회원 정보 업데이트 함수수 + // 회원 정보 업데이트 함수 const updateUserMutation = useMutation({ mutationKey: ['updateUserInfo'], mutationFn: updateUserInfo, From d4f3916a83b8acd140bc7c2d33c413a4bb2b5827 Mon Sep 17 00:00:00 2001 From: hiwon-lee <84234411+hiwon-lee@users.noreply.github.com> Date: Sun, 26 Jan 2025 00:18:11 +0900 Subject: [PATCH 2/3] =?UTF-8?q?=F0=9F=90=9B=20fix:=20=20remove=20auth=20(l?= =?UTF-8?q?ogout)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/my/_services/getUserInfo.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/app/my/_services/getUserInfo.ts b/src/app/my/_services/getUserInfo.ts index 58a259e5..e7a9a320 100644 --- a/src/app/my/_services/getUserInfo.ts +++ b/src/app/my/_services/getUserInfo.ts @@ -165,10 +165,6 @@ export async function deleteUser() { if (response.status === 200) { const logoutResponse = await axios.post( `${process.env.NEXT_PUBLIC_BASE_URL}/logout`, - {}, - { - headers: getHeaders(accessToken || ''), - }, ); return logoutResponse; } From b37a44fd1917d32b3fcc5adec9412355d1c09c4c Mon Sep 17 00:00:00 2001 From: hiwon-lee <84234411+hiwon-lee@users.noreply.github.com> Date: Sun, 26 Jan 2025 12:02:44 +0900 Subject: [PATCH 3/3] =?UTF-8?q?=E2=9C=85=20test:=20=20cookie=20included=20?= =?UTF-8?q?logout?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/my/_services/deleteUser.ts | 76 ++++++++++++++++++++++++++++++ src/app/my/editinfo/page.tsx | 7 +-- 2 files changed, 78 insertions(+), 5 deletions(-) create mode 100644 src/app/my/_services/deleteUser.ts diff --git a/src/app/my/_services/deleteUser.ts b/src/app/my/_services/deleteUser.ts new file mode 100644 index 00000000..858c7783 --- /dev/null +++ b/src/app/my/_services/deleteUser.ts @@ -0,0 +1,76 @@ +'use server'; + +import { cookies } from 'next/headers'; +import axios from 'axios'; +import refreshAccessToken from '@/lib/refreshToken'; + +// 기본 헤더 구성 +const getHeaders = (token: string, cookieString?: string) => ({ + Authorization: `Bearer ${token}`, + Cookie: cookieString || '', // 쿠키를 헤더에 포함 + 'Content-Type': 'application/json', +}); + +// my : 고객 회원 탈퇴 +export default async function deleteUser() { + const cookieStore = cookies(); + + // 요청할 주소 + const url = `${process.env.NEXT_PUBLIC_BASE_URL}/api/customer/delete`; + + try { + // 1. Access Token 가져오기 + const accessToken = (await cookieStore).get('accessToken')?.value; + const cookieString = (await cookieStore) + .getAll() + .map((c) => `${c.name}=${c.value}`) + .join('; '); + + if (!accessToken) { + throw new Error('Access token is missing'); + } + + console.log(accessToken); + // 2. 첫 번째 요청 시도 + const response = await axios.patch( + url, + {}, + { + headers: getHeaders(accessToken, cookieString), + withCredentials: true, // 서버와 쿠키 공유 + }, + ); + + if (response.status === 200) { + return response.data; + } + + return '회원 탈퇴에 실패했습니다.'; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } catch (error: any) { + // 3. 401 오류 발생 시 토큰 갱신 + if (error.response?.status === 401) { + const newAccessToken = await refreshAccessToken(); + + // 4. 갱신된 토큰으로 재요청 + const retryResponse = await axios.patch( + url, + {}, + { + headers: getHeaders(newAccessToken), + withCredentials: true, + }, + ); + + if (retryResponse.status === 200) { + return retryResponse.data; + } + + return '회원 탈퇴에 실패했습니다.'; + } + + // 5. 기타 오류 처리 + console.error('Error uploading content:', error); + throw error; + } +} diff --git a/src/app/my/editinfo/page.tsx b/src/app/my/editinfo/page.tsx index bca1ca9b..a5da7059 100644 --- a/src/app/my/editinfo/page.tsx +++ b/src/app/my/editinfo/page.tsx @@ -19,11 +19,8 @@ import { import RightChevronIcon from '@/assets/RightChevronIcon'; import { useMutation, useQuery } from '@tanstack/react-query'; import { UpdateUserInfoProps, UserInfoProps } from '@/types/user'; -import { - deleteUser, - getUserInfo, - updateUserInfo, -} from '../_services/getUserInfo'; +import { getUserInfo, updateUserInfo } from '../_services/getUserInfo'; +import deleteUser from '../_services/deleteUser'; import Modal from '../_component/Modal'; /* eslint-disable jsx-a11y/label-has-associated-control */ const ButtonWrapper = styled.div`