Descope SDK for NextJS
The Descope SDK for NextJS provides convenient access to the Descope for an application written on top of NextJS. You can read more on the Descope Website.
This SDK uses under the hood the Descope React SDK and Descope Node SDK
Refer to the Descope React SDK and Descope Node SDK for more details.
Requirements
Installing the SDK
Install the package with:
npm i --save @descope/nextjs-sdk
Usage
This section contains guides for App router and Pages router.
For Pages router, see the Pages Router section.
App Router
Wrap your app layout with Auth Provider
import { AuthProvider } from '@descope/nextjs-sdk';
export default function RootLayout({
children
}: {
children: React.ReactNode
}) {
return (
<AuthProvider projectId="your-descope-project-id">
<html lang="en">
<body>{children}</body>
</html>
</AuthProvider>
);
}
Note: AuthProvider
uses sessionTokenViaCookie
by default, in order that the AuthMiddleware will work out of the box.
Use Descope to render Flow
You can use default flows or provide flow id directly to the Descope component
import { Descope } from '@descope/nextjs-sdk';
const Page = () => {
return (
<Descope
flowId="sign-up-or-in"
onSuccess={(e) => console.log('Logged in!')}
onError={(e) => console.log('Could not logged in!')}
redirectAfterSuccess="/"
// redirectAfterError="/error-page"
/>
);
};
Refer to the Descope React SDK Section for a list of available props.
Note: Descope is a client component. if the component that renders it is a server component, you cannot pass onSuccess
/onError
/errorTransformer
/logger
props because they are not serializable. To redirect the user after the flow is completed, use the redirectAfterSuccess
and redirectAfterError
props.
Client Side Usage
Use the useDescope
, useSession
and useUser
hooks in your components in order to get authentication state, user details and utilities
This can be helpful to implement application-specific logic. Examples:
- Render different components if current session is authenticated
- Render user's content
- Logout button
Note: these hooks should be used in a client component only (For example, component with use client
notation).
'use client';
import { useDescope, useSession, useUser } from '@descope/nextjs-sdk/client';
import { useCallback } from 'react';
const App = () => {
const { isAuthenticated, isSessionLoading, sessionToken } = useSession();
const { user } = useUser();
const sdk = useDescope();
if (isSessionLoading || isUserLoading) {
return <p>Loading...</p>;
}
const handleLogout = useCallback(() => {
sdk.logout();
}, [sdk]);
if (isAuthenticated) {
return (
<>
<p>Hello {user.name}</p>
<button onClick={handleLogout}>Logout</button>
</>
);
}
return <p>You are not logged in</p>;
};
Server Side Usage
Require authentication for application (Middleware)
You can use NextJS Middleware to require authentication for a page/route or a group of pages/routes.
Descope SDK provides a middleware function that can be used to require authentication for a page/route or a group of pages/routes.
import { authMiddleware } from '@descope/nextjs-sdk/server'
export default authMiddleware({
projectId: 'your-descope-project-id'
redirectUrl?: string
publicRoutes?: string[]
})
export const config = {
matcher: ['/((?!.+\\.[\\w]+$|_next).*)', '/', '/(api|trpc)(.*)']
}
Read session information in server side
use the session()
helper to read session information in Server Components and Route handlers.
Note: session()
requires the authMiddleware
to be used for the Server Component or Route handler that uses it.
Server Component:
import { session } from '@descope/nextjs-sdk/server';
async function Page() {
const sessionRes = session();
if (!sessionRes) {
}
const { jwt, token } = sessionRes;
}
Route handler:
export async function GET() {
const currSession = session();
if (!currSession.isAuthenticated) {
}
const { jwt, token } = currSession;
}
Access Descope SDK in server side
Use createSdk
function to create Descope SDK in server side.
Refer to the Descope Node SDK for a list of available functions.
Usage example in Route handler:
import { createSdk } from '@descope/nextjs-sdk/server';
const sdk = createSdk({
projectId: 'your-descope-project-id',
managementKey: 'your-descope-management-key'
});
export async function GET(req) {
const { searchParams } = new URL(req.url);
const loginId = searchParams.get('loginId');
const { ok, data: user } = await sdk.management.user.load(loginId);
if (!ok) {
}
}
Pages Router
This section is Working in progress :-)
In the meantime, you can see the example in the Pages Router folder.
Code Example
You can find an example react app in the examples folder. - App Router - Pages Router
Learn More
To learn more please see the Descope Documentation and API reference page.
Contact Us
If you need help you can email Descope Support
License
The Descope SDK for React is licensed for use under the terms and conditions of the MIT license Agreement.