diff --git a/src/lib/proxy-access.test.ts b/src/lib/proxy-access.test.ts index 8de21b6e..8bdd3860 100644 --- a/src/lib/proxy-access.test.ts +++ b/src/lib/proxy-access.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "vitest"; -import { shouldRedirectAdminRequest } from "./proxy-access"; +import { shouldRedirectAdminRequest, usesSecureAuthCookie } from "./proxy-access"; describe("shouldRedirectAdminRequest", () => { it("redirects anonymous admin requests before rendering", () => { @@ -12,3 +12,10 @@ describe("shouldRedirectAdminRequest", () => { expect(shouldRedirectAdminRequest("/news", null)).toBe(false); }); }); + +describe("usesSecureAuthCookie", () => { + it("matches Auth.js production cookie naming", () => { + expect(usesSecureAuthCookie("production")).toBe(true); + expect(usesSecureAuthCookie("development")).toBe(false); + }); +}); diff --git a/src/lib/proxy-access.ts b/src/lib/proxy-access.ts index 63c98431..fd32c1a9 100644 --- a/src/lib/proxy-access.ts +++ b/src/lib/proxy-access.ts @@ -2,6 +2,10 @@ export interface ProxyToken { rank?: unknown; } +export function usesSecureAuthCookie(environment: string | undefined): boolean { + return environment === "production"; +} + export function shouldRedirectAdminRequest(pathname: string, token: ProxyToken | null): boolean { if (pathname !== "/admin" && !pathname.startsWith("/admin/")) return false; return token === null; diff --git a/src/proxy.ts b/src/proxy.ts index 4f1aa10e..16747cfb 100644 --- a/src/proxy.ts +++ b/src/proxy.ts @@ -1,6 +1,6 @@ import { type NextRequest, NextResponse } from "next/server"; import { getToken } from "next-auth/jwt"; -import { shouldRedirectAdminRequest } from "@/lib/proxy-access"; +import { shouldRedirectAdminRequest, usesSecureAuthCookie } from "@/lib/proxy-access"; // Edge proxy (formerly "middleware"): Prisma can't run here, so we only forward // the request path (so server components / the access guard can read it via @@ -9,7 +9,9 @@ import { shouldRedirectAdminRequest } from "@/lib/proxy-access"; export async function proxy(req: NextRequest) { if (req.nextUrl.pathname === "/admin" || req.nextUrl.pathname.startsWith("/admin/")) { const secret = process.env.AUTH_SECRET; - const token = secret ? await getToken({ req, secret }) : null; + const token = secret + ? await getToken({ req, secret, secureCookie: usesSecureAuthCookie(process.env.NODE_ENV) }) + : null; if (shouldRedirectAdminRequest(req.nextUrl.pathname, token)) { return NextResponse.redirect(new URL("/login", req.url)); }