fix: validate session server-side in proxy to prevent stale cookie redirect loops

This commit is contained in:
2026-04-26 19:49:26 +08:00
parent 25aa52ada3
commit dfbc5d61d6
+12 -13
View File
@@ -1,5 +1,6 @@
import { NextResponse } from "next/server" import { NextResponse } from "next/server"
import type { NextRequest } from "next/server" import type { NextRequest } from "next/server"
import { auth } from "@/lib/auth"
const authRoutes = [ const authRoutes = [
"/login", "/login",
@@ -8,23 +9,21 @@ const authRoutes = [
"/reset-password", "/reset-password",
] ]
export function proxy(req: NextRequest) { export async function proxy(req: NextRequest) {
const path = req.nextUrl.pathname const path = req.nextUrl.pathname
const isAuthRoute = authRoutes.some((route) => path.startsWith(route)) const isAuthRoute = authRoutes.some((route) => path.startsWith(route))
// Check specifically for the session token cookie if (!isAuthRoute) {
// (better-auth.session_token or __Secure-better-auth.session_token in HTTPS) return NextResponse.next()
// Other better-auth cookies like last_used_login_method persist after logout }
const hasSession = req.cookies
.getAll()
.some(
(cookie) =>
cookie.name.endsWith("better-auth.session_token") &&
cookie.value.length > 0,
)
// Redirect authenticated users away from auth pages // Validate session server-side instead of just checking cookie existence.
if (isAuthRoute && hasSession) { // This prevents stale cookies from causing redirect loops.
const session = await auth.api.getSession({
headers: req.headers,
})
if (session) {
return NextResponse.redirect(new URL("/", req.url)) return NextResponse.redirect(new URL("/", req.url))
} }