Next.js

Authentication

Implementing authentication using NextAuth.js (Auth.js) in the App Router.

Installation: Install NextAuth.js packages.
📄terminal
BASH
npm install next-auth@beta
# Generate an Auth Secret
npx auth secret
Auth Config: NextAuth configuration with a generic provider (e.g., Credentials or GitHub).
📄auth.ts
TS
import NextAuth from "next-auth"
import GitHub from "next-auth/providers/github"

export const { handlers, signIn, signOut, auth } = NextAuth({
  providers: [GitHub],
  pages: {
    signIn: '/login', // Optional: custom login page
  },
  callbacks: {
    authorized({ auth, request: { nextUrl } }) {
      const isLoggedIn = !!auth?.user;
      const isOnDashboard = nextUrl.pathname.startsWith('/dashboard');
      if (isOnDashboard) {
        if (isLoggedIn) return true;
        return false; // Redirect unauthenticated users to login page
      } else if (isLoggedIn) {
        return Response.redirect(new URL('/dashboard', nextUrl));
      }
      return true;
    },
  },
})
Route Handler: Setting up the API route for NextAuth.
📄app/api/auth/[...nextauth]/route.ts
TS
import { handlers } from "@/auth"

export const { GET, POST } = handlers
Protecting Server Components: Checking session in a server component.
📄app/dashboard/page.tsx
TSX
import { auth, signOut } from "@/auth"
import { redirect } from "next/navigation"

export default async function DashboardPage() {
  const session = await auth()

  if (!session?.user) {
    redirect("/api/auth/signin")
  }

  return (
    <div>
      <h1>Welcome, {session.user.name}</h1>
      <p>Email: {session.user.email}</p>
      
      <form action={async () => {
        "use server"
        await signOut()
      }}>
        <button type="submit">Sign Out</button>
      </form>
    </div>
  )
}