--- name: auth-pages description: Create and manage authentication pages with server-side session handling. Use when adding login, register, or protected pages WITHOUT flicker/skeleton. allowed-tools: Read, Edit, Write, Glob --- # Authentication Pages (FSD) Better Auth integration with Next.js 16 - **Magic Link** (passwordless) authentication. ## Authentication Method This project uses **Magic Link authentication** - users sign in by clicking a link sent to their email. No passwords! ## FSD Paths ``` src/ ├── app/(auth)/ │ ├── login/ # Magic Link Login Page │ ├── magic-link/verify/ # Magic Link Verification UI │ └── verify-email/ # Email Verification UI ├── app/(protected)/ │ ├── dashboard/ # Protected Dashboard │ └── settings/ # Session Management ├── features/auth/ # Auth Feature │ ├── ui/ │ │ ├── login-form.tsx # Orchestrates login flow │ │ ├── login-card.tsx # Email input form │ │ └── email-sent-card.tsx # "Check your email" UI │ ├── model/ │ │ ├── use-login.ts # Login state & logic │ │ └── use-auth-sync.ts # Cross-tab sync │ └── index.ts ├── features/user-settings/ # Session Management │ ├── ui/ │ │ ├── sessions-list.tsx │ │ └── session-card.tsx │ ├── model/ │ │ └── use-sessions.ts │ └── index.ts ├── shared/lib/ │ ├── auth-client/ # Client: signIn.magicLink, signOut │ ├── auth-server/ # Server: getSession, auth config │ └── geo/ # User Agent parsing └── widgets/header/ # Header with UserMenu ``` ## Magic Link Login Flow ``` 1. User enters email → /login 2. signIn.magicLink() called 3. Backend webhook sends email 4. User clicks link → /magic-link/verify?token=... 5. Token verified → Session created → Redirect to /dashboard 6. Login notification sent (new device only) ``` ## Auth Client (Magic Link) ```tsx import { signIn, signOut } from "@shared/lib/auth-client" // Request Magic Link await signIn.magicLink({ email, callbackURL: "/dashboard", newUserCallbackURL: "/dashboard", errorCallbackURL: "/login?error=verification_failed", }) // Sign Out await signOut() ``` ## Server-Side Session (NO FLICKER!) ### Protected Page Pattern ```tsx // app/(protected)/dashboard/page.tsx - SERVER COMPONENT import { getSession } from "@shared/lib/auth-server" import { redirect } from "next/navigation" import { Header } from "@widgets/header" export default async function DashboardPage() { // Server-side Session Check - NO Flicker! const session = await getSession() if (!session) redirect("/login") return (