UNPKG

@auth0/nextjs-auth0

Version:
165 lines (164 loc) 5.99 kB
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;