import { NextResponse } from "next/server"; import { getToken } from "next-auth/jwt"; import { signIn } from "@/app/(auth)/auth"; import { isDevelopmentEnvironment } from "@/lib/constants"; export async function GET(request: Request) { const requestUrl = new URL(request.url); const { searchParams } = requestUrl; const redirectUrl = searchParams.get("redirectUrl") || "/"; const token = await getToken({ req: request, secret: process.env.AUTH_SECRET, secureCookie: !isDevelopmentEnvironment, }); if (token) { const baseUrl = process.env.AUTH_URL || requestUrl.origin; return NextResponse.redirect(new URL("/", baseUrl)); } const baseUrl = process.env.AUTH_URL || requestUrl.origin; // 规范化 redirectUrl: // 1. 无论是相对路径还是带 localhost 的绝对地址, // 2. 最终都转换为以 AUTH_URL/baseUrl 为 origin 的完整 URL,保证端口正确。 let finalRedirectUrl = `${baseUrl}/`; try { const candidate = new URL(redirectUrl, baseUrl); // 只保留路径和查询参数,强制使用外网域名和端口 const normalized = new URL( `${candidate.pathname}${candidate.search}${candidate.hash}`, baseUrl, ); finalRedirectUrl = normalized.toString(); } catch { // ignore, 使用默认的 baseUrl } return signIn("guest", { redirect: true, redirectTo: finalRedirectUrl }); }