The example code below describes how to add authentication to a Next.js app.
New ProjectThe easiest way to get started is to clone the example app and follow the instructions in README.md. You can try out a live demo at https://next-auth-example.vercel.app/
Existing Project Install NextAuthinfo
If you are using TypeScript, NextAuth.js comes with its types definitions within the package. To learn more about TypeScript for next-auth
, check out the TypeScript documentation
To add NextAuth.js to a project create a file called [...nextauth].js
in pages/api/auth
. This contains the dynamic route handler for NextAuth.js which will also contain all of your global NextAuth.js configurations.
If you're using Next.js 13.2 or above with the new App Router (app/
), you can initialize the configuration using the new Route Handlers by following our guide.
pages/api/auth/[...nextauth].js
import NextAuth from "next-auth"import GithubProvider from "next-auth/providers/github"export const authOptions = { providers: [ GithubProvider({ clientId: process.env.GITHUB_ID, clientSecret: process.env.GITHUB_SECRET, }), ],}export default NextAuth(authOptions)
All requests to /api/auth/*
(signIn
, callback
, signOut
, etc.) will automatically be handled by NextAuth.js.
Further Reading:
To be able to use useSession
first you'll need to expose the session context, <SessionProvider />
, at the top level of your application:
pages/_app.jsx
import { SessionProvider } from "next-auth/react"export default function App({ Component, pageProps: { session, ...pageProps },}) { return ( <SessionProvider session={session}> <Component {...pageProps} /> </SessionProvider> )}
Instances of useSession
will then have access to the session data and status. The <SessionProvider />
also takes care of keeping the session updated and synced between browser tabs and windows.
tip
Check out the client documentation to see how you can improve the user experience and page performance by using the NextAuth.js client. If you are using the Next.js App Router, please note that <SessionProvider />
requires a client component and therefore cannot be put inside the root layout. For more details, check out the Next.js documentation.
The useSession()
React Hook in the NextAuth.js client is the easiest way to check if someone is signed in.
components/login-btn.jsx
import { useSession, signIn, signOut } from "next-auth/react"export default function Component() { const { data: session } = useSession() if (session) { return ( <> Signed in as {session.user.email} <br /> <button onClick={() => signOut()}>Sign out</button> </> ) } return ( <> Not signed in <br /> <button onClick={() => signIn()}>Sign in</button> </> )}
You can use the useSession
hook from anywhere in your application (e.g. in a header component).
To protect an API Route, you can use the getServerSession()
method.
pages/api/restricted.js
import { getServerSession } from "next-auth/next"import { authOptions } from "./auth/[...nextauth]"export default async (req, res) => { const session = await getServerSession(req, res, authOptions) if (session) { res.send({ content: "This is protected content. You can access this content because you are signed in.", }) } else { res.send({ error: "You must be signed in to view the protected content on this page.", }) }}
Extensibility Using NextAuth.js Callbacks
NextAuth.js allows you to hook into various parts of the authentication flow via our built-in callbacks.
For example, to pass a value from the sign-in to the frontend, client-side, you can use a combination of the session
and jwt
callback like so:
pages/api/auth/[...nextauth].js
...
callbacks: {
async jwt({ token, account }) {
if (account) {
token.accessToken = account.access_token
}
return token
},
async session({ session, token, user }) {
session.accessToken = token.accessToken
return session
}
}
...
Now whenever you call getSession
or useSession
, the data object which is returned will include the accessToken
value.
components/accessToken.jsx
import { useSession, signIn, signOut } from "next-auth/react"export default function Component() { const { data } = useSession() const { accessToken } = data return <div>Access Token: {accessToken}</div>}
Configuring callback URL (OAuth only)
If you are using an OAuth provider either through one of our built-in providers or through a custom provider, you'll need to configure a callback URL in your provider's settings. Each provider has a "Configuration" section that should give you pointers on how to do that.
Follow these steps to learn how to integrate with an OAuth provider.
Deploying to productionWhen deploying your site set the NEXTAUTH_URL
environment variable to the canonical URL of the website.
NEXTAUTH_URL=https://example.com
tip
In production, this needs to be set as an environment variable on the service you use to deploy your app.
To set environment variables on Vercel, you can use the dashboard or the vercel env pull
command.
For more information please check out our deployment page.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4