© 2026 Hedgehog Software, LLC
AuthApiError
exchangeCodeForSession
signInWithOAuth({ provider: "google" })
@supabase/ssr
import { createServerClient, parseCookieHeader, serializeCookieHeader, } from "@supabase/ssr"; export function getSupabase(request: Request) { const headers = new Headers(); const supabase = createServerClient( process.env.SUPABASE_URL!, process.env.SUPABASE_ANON_KEY!, { cookies: { getAll() { return parseCookieHeader(request.headers.get("Cookie") ?? ""); }, setAll(cookiesToSet) { cookiesToSet.forEach(({ name, value, options }) => headers.append( "Set-Cookie", serializeCookieHeader(name, value, options) ) ); }, }, } ); return { supabase, headers }; }
const { data, error } = await supabase.auth.signInWithOAuth({ provider: "google", options: { redirectTo: `http://localhost:5173/auth/callback`, }, });
auth/callback
export async function loader({ request }: LoaderFunctionArgs) { const requestUrl = new URL(request.url); const code = requestUrl.searchParams.get("code"); if (code) { const { supabase } = await getSupabase(request); const res = await supabase.auth.exchangeCodeForSession(code); console.log("*".repeat(33)); console.log({ res }); } else { console.log("Error..."); } return null; }
data: { user: null, session: null, redirectType: null }, error: AuthApiError: invalid request: both auth code and code verifier should be non-empty