diff --git a/middleware.ts b/middleware.ts index 4037863..383ead9 100644 --- a/middleware.ts +++ b/middleware.ts @@ -18,18 +18,9 @@ export async function middleware(request: NextRequest) { return NextResponse.next() } - // 2. Kiểm tra token (cookies) - const token = request.cookies.get("token") || request.cookies.get("access_token") + // 2. Kiểm tra user data cookie (prioritize này để tránh redirect loop) const userDataCookie = request.cookies.get("userDataRedux") - - // 3. Nếu không có token, redirect về signin - if (!token) { - const signinUrl = new URL("/signin", request.url) - signinUrl.searchParams.set("from", pathname) - return NextResponse.redirect(signinUrl) - } - - // 4. Kiểm tra role-based access + if (userDataCookie) { try { const userData = JSON.parse(userDataCookie.value) @@ -37,16 +28,31 @@ export async function middleware(request: NextRequest) { // Kiểm tra user có quyền truy cập route này không if (!canAccessRoute(userRoles, pathname)) { - // Redirect về dashboard hoặc 403 page + // Redirect về 403 page return NextResponse.redirect(new URL("/error-403", request.url)) } + + // User có quyền, cho qua + return NextResponse.next() } catch (error) { console.error("Error parsing user data in middleware:", error) - // Nếu lỗi parse, vẫn cho qua (để tránh infinite redirect) - return NextResponse.next() + // Xóa cookie lỗi + const response = NextResponse.redirect(new URL("/signin", request.url)) + response.cookies.delete("userDataRedux") + return response } } + // 3. Kiểm tra token từ backend (HTTP-only cookie) + const token = request.cookies.get("token") || request.cookies.get("access_token") + + // 4. Nếu không có token và không có user data, redirect về signin + if (!token) { + const signinUrl = new URL("/signin", request.url) + signinUrl.searchParams.set("from", pathname) + return NextResponse.redirect(signinUrl) + } + return NextResponse.next() } diff --git a/src/components/auth/SignInForm.tsx b/src/components/auth/SignInForm.tsx index 714ac94..de37497 100644 --- a/src/components/auth/SignInForm.tsx +++ b/src/components/auth/SignInForm.tsx @@ -77,7 +77,12 @@ export default function SignInForm() { // Lưu user data vào Redux và cookies dispatch(setUserData(data.data)); saveUserToCookie(data.data); - router.push("/"); + + // Sử dụng window.location để force reload, đảm bảo cookie được set + // và middleware check được cookie trước khi render page + setTimeout(() => { + window.location.href = "/"; + }, 100); } } else { toast.error("Email hoặc mật khẩu không đúng.");