Skip to content

Protected Routes ​

This document outlines the strategy for securing specific routes and features within the Bagisto Headless storefront. Currently, the project employs a Component-Level Protection strategy, allowing for a flexible balance between guest access and authenticated user features.

4.1 Protection Strategy Overview ​

Unlike a rigid middleware-only approach, this project uses NextAuth tokens to conditionally render features or redirect users from sensitive areas.

Protection LevelMechanismImplementation
GlobalNext.js Middleware(Optional / Planned) Best for high-security dashboard groups.
Page LevelgetServerSessionUsed in Server Components to prevent data fetching for guests.
Component LeveluseSession (Client)Controls visibility of UI elements (e.g., Review Forms).

4.2 Protected Features ​

Currently, the following areas require authentication:

1. Product Reviews ​

Customers must be logged in to submit reviews for products.

  • File: src/components/catalog/review/ReviewSection.tsx
  • Logic: Checks for a valid session; if missing, triggers a redirect to /customer/login.

2. Authenticated Checkout ​

While guest checkout is supported, authenticated users benefit from saved addresses and order history.

  • Logic: The useAddressesFromApi hook dynamically fetches data based on the presence of an accessToken in the session.

4.3 Implementing Page Protection ​

To protect a new page in the src/app directory, use the following pattern:

This approach prevents the page from rendering at all if a session isn't present.

typescript
import { getServerSession } from "next-auth";
import { authOptions } from "@/utils/auth";
import { redirect } from "next/navigation";

export default async function ProtectedPage() {
  const session = await getServerSession(authOptions);

  if (!session) {
    redirect("/customer/login");
  }

  return <div>Welcome to your secure dashboard</div>;
}

Client Component Protection ​

Best for interactive elements that need to react to auth state changes.

typescript
"use client";

import { useSession } from "next-auth/react";
import { useRouter } from "next/navigation";

export function SecureButton() {
  const { data: session, status } = useSession();
  const router = useRouter();

  if (status === "unauthenticated") {
    return <button onClick={() => router.push("/customer/login")}>Login to Continue</button>;
  }

  return <button>Perform Action</button>;
}

4.4 Future: Middleware Protection ​

As the project grows (e.g., adding a full /customer/account section), a middleware.ts file can be added to the project root to secure entire route groups:

typescript
// middleware.ts (Proposed)
export { default } from "next-auth/middleware";

export const config = {
  matcher: ["/customer/account/:path*", "/checkout/success/:path*"],
};

📖 Related Documentation:

Released under the MIT License.