Skip to main content

Quick example

First, we will be showing a quick example of how to use the CentralAuth NPM library in a NextJS application. This will give you a good idea of how to use the library and what it can do. After that, we will go into more detail about the different features and how to use them.

Step 1: Create a new NextJS application

npx create-next-app@latest --ts --tailwind --turbopack --yes my-auth-app
cd my-auth-app

Step 2: Install the library

npm install --save centralauth

Step 3: Create an environment declaration file

Create a new file environment.d.ts in the root of your project and add the following code:

declare global {
namespace NodeJS {
interface ProcessEnv {
AUTH_ORGANIZATION_ID: string;
AUTH_SECRET: string;
AUTH_BASE_URL: string;
}
}
}

export { };

Step 4: Create a new environment file

Create a new file .env in the root of your project and add the following environment variables:

AUTH_ORGANIZATION_ID=your_organization_id
AUTH_SECRET=your_secret
AUTH_BASE_URL=https://your_auth_base_url

Replace the example values with the values you got from the CentralAuth dashboard. The AUTH_BASE_URL is the URL you use to redirect to CentralAuth, which will either be https://centralauth.com or your own custom domain. The AUTH_ORGANIZATION_ID and AUTH_SECRET are the client ID and secret that are used to authenticate your application with CentralAuth. See the integration page for more information.

Step 5: Create a new API route for authentication

Create the folder app/api/auth/[action] and create a new file route.ts inside it. This will be the API route that will handle authentication requests.

Step 6: Add a GET method

export async function GET(req: Request, props: { params: Promise<{ action: "login" | "callback" | "logout" | "user" }> }) {
const { action } = await props.params;

const requestUrl = new URL(req.url);
const searchParams = requestUrl.searchParams;
}

This method will handle requests to the /api/auth/[action] route. The action parameter will be used to determine what action to take.

Step 7: Instantiate the CentralAuth class

import { CentralAuthClass } from "centralauth/server";

export async function GET(req: Request, props: { params: Promise<{ action: "login" | "callback" | "logout" | "user" }> }) {
const { action } = await props.params;

const requestUrl = new URL(req.url);
const searchParams = requestUrl.searchParams;

const authClient = new CentralAuthClass({
clientId: process.env.AUTH_ORGANIZATION_ID,
secret: process.env.AUTH_SECRET,
authBaseUrl: process.env.AUTH_BASE_URL,
callbackUrl: `${requestUrl.origin}/api/auth/callback`
});
}

Step 8: Handle the actions

We will make a try-catch block to handle the different actions. The login action will redirect the user to the CentralAuth login page, the callback action will handle the callback from CentralAuth, the user action will return the user information, and the logout action will log the user out.

import { CentralAuthClass } from "centralauth/server";

export async function GET(req: Request, props: { params: Promise<{ action: "login" | "callback" | "user" | "logout" }> }) {
const { action } = await props.params;

const requestUrl = new URL(req.url);

const authClient = new CentralAuthClass({
clientId: process.env.AUTH_ORGANIZATION_ID,
secret: process.env.AUTH_SECRET,
authBaseUrl: process.env.AUTH_BASE_URL,
callbackUrl: `${requestUrl.origin}/api/auth/callback`
});

try {
if (action == "login")
return await authClient.login(req);
if (action == "callback")
return await authClient.callback(req);
if (action == "user")
return await authClient.user(req);
if (action == "logout")
return await authClient.logout(req);
} catch (error: unknown) {
console.log(error);
}
}

Step 9: Create a new page for the login

Edit the existing page file app/page.tsx and add the following code:

/* eslint-disable @next/next/no-html-link-for-pages */
"use client";

import { useUser } from "centralauth/client";

export default function Home() {
const { user } = useUser();

return <div className="min-h-screen flex flex-col justify-center items-center gap-8 p-8 font-[family-name:var(--font-geist-sans)]">
{!!user && <>
<p>{`You are logged in as ${user.email}.`}</p>
<a
className="rounded-full border border-solid border-gray-600 px-8 py-2"
href="/api/auth/logout"
>Log out</a>
</>}

{user === null && <a
className="rounded-full border border-solid border-gray-600 px-8 py-2"
href="/api/auth/login"
>Log in</a>}
</div>
}

This page will display the user's email address if the user is logged in, and a login button if the user is not logged in.

Step 10: Run the application

That's it! You can now run the application using the following command:

npm run dev

Navigate to http://localhost:3000 to see the login button. When you click the login button, you will be redirected to the CentralAuth login page. After logging in, you will be redirected back to your application and see your email address displayed on the page.

Next steps

Next, we will go into more detail about the different features of CentralAuth and how to implement them in your application.