Fix cookie handling for Vercel serverless

This commit is contained in:
OpenClaw Bot 2026-02-21 15:54:32 -06:00
parent cd0fdfbd60
commit ff3cc87dc8
2 changed files with 40 additions and 7 deletions

View File

@ -1,8 +1,11 @@
import { NextResponse } from "next/server"; import { NextResponse } from "next/server";
import { authenticateUser, createUserSession, setSessionCookie } from "@/lib/server/auth"; import { authenticateUser, createUserSession } from "@/lib/server/auth";
export const runtime = "nodejs"; export const runtime = "nodejs";
const SESSION_COOKIE_NAME = "gantt_session";
const SESSION_DAYS_REMEMBER = 30;
export async function POST(request: Request) { export async function POST(request: Request) {
try { try {
const body = (await request.json()) as { const body = (await request.json()) as {
@ -25,13 +28,31 @@ export async function POST(request: Request) {
} }
const session = await createUserSession(user.id, rememberMe); const session = await createUserSession(user.id, rememberMe);
await setSessionCookie(session.token, rememberMe);
return NextResponse.json({ // Set cookie on response for Vercel compatibility
const response = NextResponse.json({
success: true, success: true,
user, user,
session: { expiresAt: session.expiresAt, rememberMe }, session: { expiresAt: session.expiresAt, rememberMe },
}); });
const baseCookieOptions = {
httpOnly: true,
sameSite: "lax" as const,
secure: process.env.NODE_ENV === "production",
path: "/",
};
if (rememberMe) {
response.cookies.set(SESSION_COOKIE_NAME, session.token, {
...baseCookieOptions,
maxAge: SESSION_DAYS_REMEMBER * 24 * 60 * 60,
});
} else {
response.cookies.set(SESSION_COOKIE_NAME, session.token, baseCookieOptions);
}
return response;
} catch { } catch {
return NextResponse.json({ error: "Login failed" }, { status: 500 }); return NextResponse.json({ error: "Login failed" }, { status: 500 });
} }

View File

@ -1,14 +1,26 @@
import { NextResponse } from "next/server"; import { NextResponse } from "next/server";
import { clearSessionCookie, getSessionTokenFromCookies, revokeSession } from "@/lib/server/auth"; import { getSessionTokenFromCookies, revokeSession } from "@/lib/server/auth";
export const runtime = "nodejs"; export const runtime = "nodejs";
const SESSION_COOKIE_NAME = "gantt_session";
export async function POST() { export async function POST() {
try { try {
const token = await getSessionTokenFromCookies(); const token = await getSessionTokenFromCookies();
if (token) await revokeSession(token); if (token) await revokeSession(token);
await clearSessionCookie();
return NextResponse.json({ success: true }); // Clear cookie on response for Vercel compatibility
const response = NextResponse.json({ success: true });
response.cookies.set(SESSION_COOKIE_NAME, "", {
httpOnly: true,
sameSite: "lax",
secure: process.env.NODE_ENV === "production",
path: "/",
maxAge: 0,
});
return response;
} catch { } catch {
return NextResponse.json({ error: "Logout failed" }, { status: 500 }); return NextResponse.json({ error: "Logout failed" }, { status: 500 });
} }