@auth0/nextjs-auth0
Version:
Auth0 Next.js SDK
165 lines (164 loc) • 5.99 kB
TypeScript
import type { ParsedUrlQuery } from "querystring";
import { GetServerSideProps, GetServerSidePropsContext, GetServerSidePropsResult } from "next";
import { User } from "../../types/index.js";
import { Auth0Client } from "../client.js";
/**
* If you wrap your `getServerSideProps` with {@link WithPageAuthRequired} your props object will be augmented with
* the user property, which will be the {@link User} object.
*
* ```js
* // pages/profile.js
* import { auth0 } from "@/lib/auth0";
*
* export default function Profile({ user }) {
* return <div>Hello {user.name}</div>;
* }
*
* export const getServerSideProps = auth0.withPageAuthRequired();
* ```
*/
export type GetServerSidePropsResultWithSession<P = any> = GetServerSidePropsResult<P & {
user: User;
}>;
/**
* A page route that has been augmented with {@link WithPageAuthRequired}.
*/
export type PageRoute<P, Q extends ParsedUrlQuery = ParsedUrlQuery> = (ctx: GetServerSidePropsContext<Q>) => Promise<GetServerSidePropsResultWithSession<P>>;
/**
* Objects containing the route parameters and search parameters of the page.
*/
export type AppRouterPageRouteOpts = {
params?: Promise<Record<string, string | string[]>>;
searchParams?: Promise<{
[key: string]: string | string[] | undefined;
}>;
};
/**
* An app route that has been augmented with {@link WithPageAuthRequired}.
* Returns unknown to avoid React dependency while maintaining type safety.
*/
export type AppRouterPageRoute = (obj: AppRouterPageRouteOpts) => Promise<unknown>;
/**
* If you have a custom returnTo url you should specify it in `returnTo`.
*
* You can pass in your own `getServerSideProps` method, the props returned from this will be
* merged with the user props. You can also access the user session data by calling `getSession`
* inside of this method. For example:
*
* ```js
* // pages/protected-page.js
* import { auth0 } from "@/lib/auth0";
*
* export default function ProtectedPage({ user, customProp }) {
* return <div>Protected content</div>;
* }
*
* export const getServerSideProps = auth0.withPageAuthRequired({
* // returnTo: '/unauthorized',
* async getServerSideProps(ctx) {
* // access the user session if needed
* // const session = await auth0.getSession(ctx.req);
* return {
* props: {
* // customProp: 'bar',
* }
* };
* }
* });
* ```
*/
export type WithPageAuthRequiredPageRouterOptions<P extends {
[key: string]: any;
} = {
[key: string]: any;
}, Q extends ParsedUrlQuery = ParsedUrlQuery> = {
getServerSideProps?: GetServerSideProps<P, Q>;
returnTo?: string;
};
/**
* Wrap your `getServerSideProps` with this method to make sure the user is authenticated before
* visiting the page.
*
* ```js
* // pages/protected-page.js
* import { auth0 } from "@/lib/auth0";
*
* export default function ProtectedPage() {
* return <div>Protected content</div>;
* }
*
* export const getServerSideProps = auth0.withPageAuthRequired();
* ```
*
* If the user visits `/protected-page` without a valid session, it will redirect the user to the
* login page. Then they will be returned to `/protected-page` after login.
*/
export type WithPageAuthRequiredPageRouter = <P extends {
[key: string]: any;
} = {
[key: string]: any;
}, Q extends ParsedUrlQuery = ParsedUrlQuery>(opts?: WithPageAuthRequiredPageRouterOptions<P, Q>) => PageRoute<P, Q>;
/**
* Specify the URL to `returnTo` - this is important in app router pages because the server component
* won't know the URL of the page.
*/
export type WithPageAuthRequiredAppRouterOptions = {
returnTo?: string | ((obj: AppRouterPageRouteOpts) => Promise<string> | string);
};
/**
* Wrap your Server Component with this method to make sure the user is authenticated before
* visiting the page.
*
* ```js
* // app/protected-page/page.js
* import { auth0 } from "@/lib/auth0";
*
* const ProtectedPage = auth0.withPageAuthRequired(async function ProtectedPage() {
* return <div>Protected content</div>;
* }, { returnTo: '/protected-page' });
*
* export default ProtectedPage;
* ```
*
* If the user visits `/protected-page` without a valid session, it will redirect the user to the
* login page.
*
* Note: Server Components are not aware of the req or the url of the page. So if you want the user to return to the
* page after login, you must specify the `returnTo` option.
*
* You can specify a function to `returnTo` that accepts the `params` (A Promise that resolves to
* an object containing the dynamic route parameters) and `searchParams` (A Promise that resolves to an
* object containing the search parameters of the current URL)
* argument from the page, to preserve dynamic routes and search params.
*
* ```js
* // app/protected-page/[slug]/page.js
* import { AppRouterPageRouteOpts } from '@auth0/nextjs-auth0/server';
* import { auth0 } from "@/lib/auth0";
*
* const ProtectedPage = auth0.withPageAuthRequired(async function ProtectedPage({
* params, searchParams
* }: AppRouterPageRouteOpts) {
* const slug = (await params)?.slug as string;
* return <div>Protected content for {slug}</div>;
* }, {
* returnTo({ params }) {
* return `/protected-page/${(await params)?.slug}`;
* }
* });
*
* export default ProtectedPage;
* ```
*/
export type WithPageAuthRequiredAppRouter = (fn: AppRouterPageRoute, opts?: WithPageAuthRequiredAppRouterOptions) => AppRouterPageRoute;
/**
* Protects Page router pages {@link WithPageAuthRequiredPageRouter} or
* App router pages {@link WithPageAuthRequiredAppRouter}
*/
export type WithPageAuthRequired = WithPageAuthRequiredPageRouter & WithPageAuthRequiredAppRouter;
export declare const appRouteHandlerFactory: (client: Auth0Client, config: {
loginUrl: string;
}) => WithPageAuthRequiredAppRouter;
export declare const pageRouteHandlerFactory: (client: Auth0Client, config: {
loginUrl: string;
}) => WithPageAuthRequiredPageRouter;