ZeroToShip

Docs/Tutorial

// tutorial

Login utenti (magic link + Google)

L'auth in ZeroToShip la gestisce Supabase. Due modi per entrare: magic link via email o OAuth con Google. Zero password, zero form dimenticate, zero reset. Il codice che fa girare tutto vive già in app/signin/page.tsx.

1. Il magic link

L'utente scrive la sua email, tu chiami supabase.auth.signInWithOtp(). Supabase manda un'email con un link. Se lo clicca, torna sul tuo sito autenticato:

app/signin/page.tsx
tsx
await supabase.auth.signInWithOtp({
  email,
  options: {
    emailRedirectTo: window.location.origin + "/api/auth/callback",
  },
});

2. Il bottone Google

Stessa storia, provider diverso. OAuth redirect gestito da Supabase:

app/signin/page.tsx
tsx
await supabase.auth.signInWithOAuth({
  provider: "google",
  options: {
    redirectTo: window.location.origin + "/api/auth/callback",
  },
});

Per farlo funzionare devi aver abilitato Google come provider nella dashboard Supabase (Authentication → Providers → Google) e incollato lì i tuoi Client ID e Client Secret da Google Cloud Console.

3. Il callback

Sia il magic link che Google atterrano su /api/auth/callback. Quella route scambia il codice OAuth per una sessione e redirige alla pagina definita in config.auth.callbackUrl (default: /dashboard):

app/api/auth/callback/route.ts
ts
const code = requestUrl.searchParams.get("code");

if (code) {
  const supabase = await createClient();
  await supabase.auth.exchangeCodeForSession(code);
}

return NextResponse.redirect(requestUrl.origin + config.auth.callbackUrl);

4. Proteggere una rotta

Su un server component usi il client di libs/supabase/server.ts e controlli se c'è un utente. Se non c'è, redirect al login:

app/dashboard/pagina-riservata/page.tsx
tsx
import { redirect } from "next/navigation";
import { createClient } from "@/libs/supabase/server";
import config from "@/config";

export default async function PaginaRiservata() {
  const supabase = await createClient();
  const { data: { user } } = await supabase.auth.getUser();

  if (!user) redirect(config.auth.loginUrl);

  return <h1>Ciao {user.email}</h1>;
}

Se vuoi proteggere tutta una sezione di sito, mettilo nel layout.tsx — è già fatto per te sotto /app/dashboard/. Vai a Creare una pagina privata per il dettaglio.