Scute

Next.js

Using the Next.js SDK with the pre-built React UI

If you would like to use the pre-built Scute UI with your Next.js app, you can do so using the @scute/ui-react package alongside @scute/nextjs and @scute/react. This package would expose the pre-built Auth and Profile components which you can use to easily integrate Scute to your current app.

Head over to the example project repo to clone and run this example project and check out the type docs for more scuteClient methods.

Install the SDK

Install our React SDKs with your favorite package manager:

npm install @scute/nextjs @scute/react @scute/ui-react

Add your credentials to your environment variable handler:

NEXT_PUBLIC_SCUTE_APP_ID="YOUR_SCUTE_PROJECT_ID"
NEXT_PUBLIC_SCUTE_BASE_URL="YOUR_SCUTE_BASE_URL"
SCUTE_SECRET="YOUR_SCUTE_SECRET"

Add the Scute Next.js Handlers (App Router)

In your project under src/app, create the path auth/[...scute]. Inside the newly created folder [...scute], create a file named route.js. This file will be the handler for the requests coming in from the pre-built React UI.

The directory structure should look like this:

src/
└─ app/
  └─ auth/
    └─ [...scute]/
      └─ route.js

To implement the handlers, add the code block below to the route.js file.

import { cookies, headers } from "next/headers";
import { ScuteHandler } from "@scute/nextjs";
 
const handler = ScuteHandler({ cookies, headers });
 
export { handler as GET, handler as POST };

Add the UI and the AuthContextProvider

Using the @scute/ui-react and @scute/react packages, create an AuthProvider and the Auth component. Please refer to the Scute React UI docs for more information.

// src/components/authprovider.js
 
"use client";
import { useState } from "react";
import { createClientComponentClient } from "@scute/nextjs";
import { AuthContextProvider } from "@scute/react";
 
export default function AuthProvider({ children }) {
  const [scuteClient] = useState(() =>
    createClientComponentClient({
      appId: process.env.NEXT_PUBLIC_SCUTE_APP_ID,
      baseUrl: process.env.NEXT_PUBLIC_SCUTE_BASE_URL,
    })
  );
 
  return (
    <AuthContextProvider scuteClient={scuteClient}>
      {children}
    </AuthContextProvider>
  );
}
// src/components/auth.js
 
"use client";
import { useRouter } from "next/navigation";
import { useScuteClient } from "@scute/react";
import { Auth as ScuteAuth } from "@scute/ui-react";
 
export default function Auth() {
  const router = useRouter();
  const scuteClient = useScuteClient();
 
  return (
    <ScuteAuth
      scuteClient={scuteClient}
      policyURLs={{
        privacyPolicy: "https://example.com/privacy",
        termsOfService: "https://example.com/terms",
      }}
      // This callback will redirect authenticated users to their profile page
      onSignIn={() => {
        router.push("/profile");
      }}
      logoUrl="https://example.com/logo.svg"
    />
  );
}

Add the AuthProvider to the RootLayout

Wrap the HTML body with the Auth provider inside your root layout file

// src/app/layout.js
 
import AuthProvider from "@/components/authprovider";
import "./globals.css";
 
export const metadata = {
  title: "Create Next App",
  description: "Generated by create next app",
};
 
export default function RootLayout({ children }) {
  return (
    <html lang="en">
      <AuthProvider>
        <body>{children}</body>
      </AuthProvider>
    </html>
  );
}

Once the AuthProvider is in place, go ahead and add the Auth component to your homepage:

// src/app/page.js
 
import Auth from "@/components/auth";
 
export default function Home() {
  return (
    <main>
      <Auth />
    </main>
  );
}

Create a profile page with the Profile component

Finally, build the profile page to handle the redirect from the home page on successful authentication,

// src/app/profile/page.js
 
"use client";
import { useScuteClient } from "@scute/react";
import { Profile as ScuteProfile } from "@scute/ui-react";
 
export default function Profile() {
  const scuteClient = useScuteClient();
 
  return <ScuteProfile scuteClient={scuteClient} />;
}

Congratulations! You now have a working Scute instance inside your Next.js app!

Add the Scute Next.js Handlers (Pages Router)

To add the Scute handlers for Pages Router, create the path src/pages/auth and create a file named [...scute].js with the below content.

// src/pages/auth/[...scute].js
 
import { ScuteHandler } from "@scute/nextjs";
 
export default ScuteHandler;

To use Edge runtime, use the following code:

import { authenticateRequest } from "@scute/edge";
import { createPagesEdgeRuntimeClient } from "@scute/nextjs";
import { type NextRequest, NextResponse } from "next/server";
 
export const config = {
  runtime: "edge",
};
 
export default async function handler(request: NextRequest) {
  const scute = createPagesEdgeRuntimeClient({ request });
 
  const { data: user, error } = await authenticateRequest(request, scute);
  return NextResponse.json(user);
}
Edit on GitHub

Last updated on