41 lines
1.2 KiB
TypeScript
41 lines
1.2 KiB
TypeScript
import { NextResponse } from "next/server";
|
|
import type { NextRequest } from "next/server";
|
|
|
|
export function middleware(request: NextRequest) {
|
|
// Dev bypass: skip all auth checks for local testing
|
|
if (process.env.DEV_BYPASS_AUTH === "true") {
|
|
return NextResponse.next();
|
|
}
|
|
|
|
const { pathname } = request.nextUrl;
|
|
const isAuthPage = pathname.startsWith("/login");
|
|
const isApiAuth = pathname.startsWith("/api/auth");
|
|
|
|
// Always allow auth API routes
|
|
if (isApiAuth) {
|
|
return NextResponse.next();
|
|
}
|
|
|
|
// Check for session cookie (Auth.js database sessions)
|
|
const sessionToken =
|
|
request.cookies.get("authjs.session-token")?.value ||
|
|
request.cookies.get("__Secure-authjs.session-token")?.value;
|
|
|
|
const isLoggedIn = !!sessionToken;
|
|
|
|
// Redirect logged-in users away from login page
|
|
if (isAuthPage && isLoggedIn) {
|
|
return NextResponse.redirect(new URL("/dashboard", request.url));
|
|
}
|
|
|
|
// Redirect unauthenticated users to login
|
|
if (!isAuthPage && !isLoggedIn) {
|
|
return NextResponse.redirect(new URL("/login", request.url));
|
|
}
|
|
|
|
return NextResponse.next();
|
|
}
|
|
|
|
export const config = {
|
|
matcher: ["/((?!_next/static|_next/image|favicon.ico).*)"],
|
|
};
|