1. PUBLIC_SUPABASE_SERVICE_ROLE_KEY를 사용하는 client를 준비해야한다.
import { createServerClient } from "@supabase/ssr";
import { cookies } from "next/headers";
export async function createClientAdmin() {
const cookieStore = await cookies();
return createServerClient(
process.env.NEXT_PUBLIC_SUPABASE_URL!,
process.env.NEXT_PUBLIC_SUPABASE_SERVICE_ROLE_KEY!,
{
cookies: {
getAll() {
return cookieStore.getAll();
},
setAll(cookiesToSet) {
try {
cookiesToSet.forEach(({ name, value, options }) =>
cookieStore.set(name, value, options)
);
} catch {
// The `setAll` method was called from a Server Component.
// This can be ignored if you have middleware refreshing
// user sessions.
}
},
},
}
);
}
import { createServerClient } from "@supabase/ssr";
import { cookies } from "next/headers";
export async function createClient() {
const cookieStore = await cookies();
return createServerClient(
process.env.NEXT_PUBLIC_SUPABASE_URL!,
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
{
cookies: {
getAll() {
return cookieStore.getAll();
},
setAll(cookiesToSet) {
try {
cookiesToSet.forEach(({ name, value, options }) =>
cookieStore.set(name, value, options)
);
} catch {
// The `setAll` method was called from a Server Component.
// This can be ignored if you have middleware refreshing
// user sessions.
}
},
},
}
);
}
// 일반적인 작업을 할 때에는 NEXT_PUBLIC_SUPABASE_ANON_KEY를 사용
2. 계정을 삭제하기 전에 연결된 스토리지와 테이블의 데이터가 삭제되어야 한다.
export async function deleteUser() {
const supabase = await createClientAdmin();
const userData = await getCurrentUserServer(["id"]);
if (!userData?.id) {
throw new Error("로그인이 필요합니다.");
}
// 1. 먼저 스토리지의 파일 삭제
const { error: objectsError } = await supabase.storage
.from(process.env.NEXT_PUBLIC_SUPABASE_BUCKET_NAME!)
.remove([`${userData.id}/avatar.jpg`]);
if (objectsError && objectsError.message !== "The resource was not found") {
throw objectsError;
}
// 2. users 테이블의 데이터 삭제
const { error: userDataError } = await supabase
.from("users")
.delete()
.eq("id", userData.id);
if (userDataError) {
throw userDataError;
}
// 3. 마지막으로 auth.users에서 사용자 삭제
const { error } = await supabase.auth.admin.deleteUser(userData.id);
if (error) {
return {
success: false,
error: {
name: "AuthError",
message: error.message,
code: error.code,
} as AuthError,
};
}
return {
success: true,
error: undefined,
};
}
이렇게 하면 성공적으로 작동한다.
'개발 > NEXTJS' 카테고리의 다른 글
nextjs에서 사용자 정보를 swr과 zustand를 사용하여 관리하기 (0) | 2025.02.23 |
---|---|
nextjs 쿠키 옵션 설정 (1) | 2025.02.16 |
모달창에서 스크롤 방지 (0) | 2025.02.10 |
error.tsx 사용 (0) | 2025.02.10 |
nextjs 에러 관리 (0) | 2025.02.05 |