From bb5f721b38c92d587b2d57746d057c81a942ceca Mon Sep 17 00:00:00 2001 From: 4Ventures <4ventures@MacBook-Air-de-4Ventures.local> Date: Mon, 5 Oct 2026 16:14:00 +0200 Subject: [PATCH] fix: restore login by dropping broken Supabase Kong rewrite Middleware getUser() could not validate the session cookie via the internal Docker hostname, so auth succeeded in the browser but kept redirecting back to /login stuck on "Verificando". Co-authored-by: Cursor --- src/app/login/page.tsx | 13 +++++++++---- src/lib/supabase/server.ts | 16 ---------------- src/middleware.ts | 24 ++++++------------------ 3 files changed, 15 insertions(+), 38 deletions(-) diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx index 601170c..0348241 100644 --- a/src/app/login/page.tsx +++ b/src/app/login/page.tsx @@ -2,12 +2,11 @@ import React, { useState, Suspense } from 'react'; import Image from 'next/image'; -import { useRouter, useSearchParams } from 'next/navigation'; +import { useSearchParams } from 'next/navigation'; import { createClient } from '@/lib/supabase/client'; import { Mail, Lock, Eye, EyeOff, ShieldCheck, ArrowRight, Loader2 } from 'lucide-react'; function LoginForm() { - const router = useRouter(); const searchParams = useSearchParams(); const next = searchParams.get('next') || '/dashboard/kpis'; @@ -36,9 +35,15 @@ function LoginForm() { } if (data.session) { - router.push(next); - router.refresh(); + // Hard navigation so middleware always sees the fresh auth cookie. + const dest = + next.startsWith('/') && !next.startsWith('//') ? next : '/dashboard/kpis'; + window.location.assign(dest); + return; } + + setErrorMsg('No se pudo crear la sesión. Inténtalo de nuevo.'); + setLoading(false); } catch (err: any) { setErrorMsg( err?.message || 'Error de conexión con el servidor de autenticación.' diff --git a/src/lib/supabase/server.ts b/src/lib/supabase/server.ts index 2f4516d..cec89f1 100644 --- a/src/lib/supabase/server.ts +++ b/src/lib/supabase/server.ts @@ -7,22 +7,6 @@ export async function createClient() { process.env.NEXT_PUBLIC_SUPABASE_URL!, process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!, { - global: { - fetch: (url: string | URL | Request, options?: RequestInit) => { - const u = new URL(url.toString()); - if (process.env.NODE_ENV === 'production' && u.hostname === 'supabase.4ventures.es') { - u.protocol = 'http:'; - u.hostname = 'ventures-web-supabase-gm0nnn-supabase-kong'; - u.port = '8000'; - if (!options) options = {}; - if (!options.headers) options.headers = new Headers(); - const headers = new Headers(options.headers); - headers.set('Host', 'supabase.4ventures.es'); - options.headers = headers; - } - return fetch(u.toString(), options); - } - }, cookies: { getAll() { return cookieStore.getAll(); diff --git a/src/middleware.ts b/src/middleware.ts index f85331e..bb34766 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -1,11 +1,13 @@ import { createServerClient } from '@supabase/ssr'; import { NextRequest, NextResponse } from 'next/server'; -function withSecurityHeaders(res: NextResponse) { +function withSecurityHeaders(res: NextResponse, path?: string) { res.headers.set('X-Frame-Options', 'DENY'); res.headers.set('X-Content-Type-Options', 'nosniff'); res.headers.set('Referrer-Policy', 'strict-origin-when-cross-origin'); - res.headers.set('X-Robots-Tag', 'noindex, nofollow'); + if (!path?.startsWith('/legal')) { + res.headers.set('X-Robots-Tag', 'noindex, nofollow'); + } res.headers.set( 'Permissions-Policy', 'camera=(), microphone=(), geolocation=()' @@ -24,26 +26,12 @@ export async function middleware(req: NextRequest) { request: { headers: req.headers }, }); + // Public Supabase URL only — Docker-internal Kong rewrite made getUser() fail + // after login (cookie set, middleware treats user as logged out → stuck verifying). const supabase = createServerClient( process.env.NEXT_PUBLIC_SUPABASE_URL!, process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!, { - global: { - fetch: (url: string | URL | Request, options?: RequestInit) => { - const u = new URL(url.toString()); - if (process.env.NODE_ENV === 'production' && u.hostname === 'supabase.4ventures.es') { - u.protocol = 'http:'; - u.hostname = 'ventures-web-supabase-gm0nnn-supabase-kong'; - u.port = '8000'; - if (!options) options = {}; - if (!options.headers) options.headers = new Headers(); - const headers = new Headers(options.headers); - headers.set('Host', 'supabase.4ventures.es'); - options.headers = headers; - } - return fetch(u.toString(), options); - } - }, cookies: { getAll() { return req.cookies.getAll();