Skip to main content

Authentication

Tonnex uses Supabase Auth for all authentication needs.

Architecture

ComponentClientPurpose
apps/web@supabase/ssr (Anon Key)Login, signup, session management
apps/api@supabase/supabase-js (Service Role Key)JWT verification, admin operations

Web App Auth Flow (Next.js 16)

  1. User enters credentials on /login or creates account on /signup
  2. Upon success, user is redirected to /dashboard
  3. @supabase/ssr handles Supabase auth call
  4. Session stored as HTTP-only cookies
  5. proxy.ts refreshes session cookie on every request (replaced deprecated middleware.ts)
  6. Data access layer performs actual auth checks in Server Components/Actions
⚠️ Next.js 16 Change: Authentication logic belongs in the data access layer, NOT in the proxy. The proxy.ts only handles session cookie refresh and lightweight route redirects.

API Auth Flow

  1. Web app includes JWT in Authorization: Bearer <token> header
  2. SupabaseGuard extracts and verifies token via Supabase Admin
  3. Authenticated user attached to request.user
  4. All downstream services can access the verified user

User Logout

  1. Click the Sign out button in the dashboard sidebar.
  2. The logout() server action (in apps/web/actions/auth.ts) is triggered.
  3. Supabase session is revoked.
  4. User is redirected to /login.

Key Files

FilePurpose
apps/web/lib/supabase/client.tsBrowser Supabase client
apps/web/lib/supabase/server.tsServer-side Supabase client
apps/web/lib/supabase/proxy.tsSession refresh logic (proxy layer)
apps/web/proxy.tsNext.js 16 proxy entry (replaces middleware.ts)
apps/api/src/auth/supabase.service.tsSupabase Admin service
apps/api/src/auth/supabase.guard.tsJWT verification guard

UI Components

ComponentLocationusage
LoginForm@tonnex/uiUsed in /login page
SignupForm@tonnex/uiUsed in /signup page