40 lines
1.4 KiB
TypeScript
40 lines
1.4 KiB
TypeScript
import { NextResponse, NextRequest } from "next/server";
|
|
|
|
const protectedApi = [
|
|
/^\/api\/posts\/[^/]+\/pin$/,
|
|
/^\/api\/posts\/[^/]+\/approve$/,
|
|
];
|
|
|
|
export async function middleware(req: NextRequest) {
|
|
const { pathname } = req.nextUrl;
|
|
const response = NextResponse.next();
|
|
|
|
// 쿠키에 uid가 없으면 어드민으로 자동 로그인 (기본값)
|
|
const uid = req.cookies.get("uid")?.value;
|
|
if (!uid) {
|
|
// 어드민 사용자 ID 가져오기 (DB 조회 대신 하드코딩 - 실제 환경에서는 다른 방식 사용 권장)
|
|
// 어드민 nickname은 "admin"으로 고정되어 있다고 가정
|
|
// 실제 userId는 DB에서 가져와야 하지만, middleware는 비동기 DB 호출을 제한적으로 지원
|
|
// 대신 page.tsx에서 처리하도록 함
|
|
|
|
// 페이지 요청일 경우만 쿠키 설정 시도
|
|
// API는 제외하고 페이지만 처리
|
|
if (!pathname.startsWith("/api")) {
|
|
// 페이지 레벨에서 처리하도록 함 (쿠키는 클라이언트 측에서 설정 필요)
|
|
}
|
|
}
|
|
|
|
const needAuth = protectedApi.some((re) => re.test(pathname));
|
|
if (needAuth && !uid) {
|
|
return new NextResponse(JSON.stringify({ error: "Unauthorized" }), { status: 401 });
|
|
}
|
|
|
|
return response;
|
|
}
|
|
|
|
export const config = {
|
|
matcher: ["/((?!_next/static|_next/image|favicon.ico|.*\\.(?:svg|png|jpg|jpeg|gif|webp)$).*)"],
|
|
};
|
|
|
|
|