{
    "componentChunkName": "component---src-pages-blog-markdown-remark-fields-slug-js",
    "path": "/blog/adding-login-to-your-nextjs-app-using-the-app-directory-and-supertokens",
    "result": {"data":{"markdownRemark":{"html":"<h2 id=\"understanding-nextjs\" style=\"position:relative;\"><a href=\"#understanding-nextjs\" aria-label=\"understanding nextjs permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Understanding Next.js</h2>\n<p>Next.js, a powerful React framework has rapidly gained popularity due to its versatility and ability to build both static and dynamic web applications.</p>\n<p>Featuring server-side rendering (SSR) and static site generation (SSG) capabilities, Next.js makes creating and deploying websites easy with its tight integration with Vercel.</p>\n<p>This article will cover how Next.js handles rendering and authentication, discuss some authentication strategies, and how to implement an authentication solution in Next.js.</p>\n<h2 id=\"authentication-in-nextjs\" style=\"position:relative;\"><a href=\"#authentication-in-nextjs\" aria-label=\"authentication in nextjs permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Authentication in Next.js</h2>\n<p>While the concept of authentication and its strategies are the same for all JavaScript frameworks, including Nextjs, what sets Nextjs and other frameworks like it apart are the patterns available for preventing unauthenticated users from accessing protected routes, commonly referred to as authentication patterns.</p>\n<p>To understand what authentication means for Nextjs, you must first understand how Nextjs renders things.</p>\n<p><strong>With Nextjs, three types of rendering are available: client-side rendering, server-side rendering, and static site generation.</strong></p>\n<ul>\n<li>\n<p>CSR: With client side rendering, a minimal HTML file and the bundled JavaScript code are sent to the browser. The JavaScript is then executed in the browser to render the page.</p>\n</li>\n<li>\n<p>SSR: With server-side rendering, as the name implies the full HTML for the page content is rendered on the server upon a user’s request and is then sent to the browser.</p>\n</li>\n<li>\n<p>SSG: In static site generations the HTML for each page is generated at build time and sent to the browsers at the user’s request.</p>\n</li>\n</ul>\n<h2 id=\"authentication-vs-authorization-in-nextjs\" style=\"position:relative;\"><a href=\"#authentication-vs-authorization-in-nextjs\" aria-label=\"authentication vs authorization in nextjs permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Authentication vs. Authorization in Next.js</h2>\n<p>Authentication and authorization are two crucial concepts in application security, but they serve two distinct purposes:</p>\n<p>Authentication: Process that verifies the identity of a user, answering the question “Who are you?”. Authentication typically involves logging in with credentials (like username and password), or through a third-party service (like Google, Facebook, GitHub…).</p>\n<p>Once authenticated, the user is recognized by the app, allowing access to resources tied to their account.</p>\n<p>Authorization: Once the user is authenticated, authorization determines what they are allowed to do (comparable to permissions), answering the question “What action can you perform?”.</p>\n<p>Authorization involves checking whether the authenticated user has the necessary permissions to access specific resources or perform certain actions. For example, an authenticated user might be authorized to view their profile, but not authorized to access the admin dashboard.</p>\n<p>You can learn more about the differences between the two in our <a href=\"https://supertokens.com/blog/authentication-vs-authorization\" target=\"_blank\" rel=\"nofollow\">blog</a>.</p>\n<h2 id=\"nextjs-authentication-stratergies\" style=\"position:relative;\"><a href=\"#nextjs-authentication-stratergies\" aria-label=\"nextjs authentication stratergies permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Nextjs Authentication Stratergies</h2>\n<p>There are two common authentication stratergies when preventing unauthenticated users from accessing proctected routes in Nextjs. These included static generation and server-side authentication and server-side authentication. It is important to choose the a stratergy that suits your application and requirements.</p>\n<h3 id=\"static-generation-pattern\" style=\"position:relative;\"><a href=\"#static-generation-pattern\" aria-label=\"static generation pattern permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Static generation pattern</h3>\n<p>In Next.js, when a page doesn’t contain blocking functions such as <code class=\"language-text\">getStaticProps</code> and <code class=\"language-text\">getInitialProps</code>, it is automatically prerendered to static HTML. Based on this, for the static generation pattern, when a page is requested, a loading state that has been statically generated is first served, followed by an attempt to fetch a user’s data in the client.</p>\n<p>If successful, the requested page is displayed. Otherwise, the user is redirected to the login page and will see errors explaining why the check failed.</p>\n<p>This pattern has the disadvantage of displaying secure content to an unauthenticated user.</p>\n<h3 id=\"server-side-pattern\" style=\"position:relative;\"><a href=\"#server-side-pattern\" aria-label=\"server side pattern permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Server-side pattern</h3>\n<p>In this pattern, when the browser requests a server-side rendered page, a request is sent to the backend API to get a user session. If successful, the server pre-renders the requested page on the server and sends it to the browser; otherwise, the user is redirected to the login page.</p>\n<p>Unlike the static generation pattern, with this pattern, there will be no flash of unauthenticated content (FOUC) or a need to use a loading indicator.</p>\n<p>One disadvantage is that the rendering will be blocked until the backend API responds. This is because getServerSideProps is blocking until the request resolves.</p>\n<h2 id=\"setting-up-nextjs-authentication-with-supertokens\" style=\"position:relative;\"><a href=\"#setting-up-nextjs-authentication-with-supertokens\" aria-label=\"setting up nextjs authentication with supertokens permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Setting up Next.js Authentication with SuperTokens</h2>\n<h2 id=\"recommended-use-create-supertokens-app\" style=\"position:relative;\"><a href=\"#recommended-use-create-supertokens-app\" aria-label=\"recommended use create supertokens app permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>(Recommended) Use <code class=\"language-text\">create-supertokens-app</code></h2>\n<p><code class=\"language-text\">create-supertokens-app</code> is a command line tool created by the SuperTokens team that lets you create new projects with SuperTokens already integrated. This is the fastest way to get started with SuperTokens. To use this tool, run the following command:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"62473297387127610000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`npx create-supertokens-app@latest`, `62473297387127610000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">npx create-supertokens-app@latest</code></pre></div>\n<p>The tool will prompt you for your tech stack, you can choose between the app directory and the pages directory.</p>\n<p>The rest of this article is relevant only if you are adding SuperTokens to your app manually and if you have not used the tool mentioned above. If you used <code class=\"language-text\">create-supertokens-app</code>, the setup is already complete and you can continue building the rest of the application. To know details about Next.js integration with SuperTokens, refer to their <a href=\"https://supertokens.com/docs\" target=\"_blank\" rel=\"nofollow\">official documentation</a></p>\n<h2 id=\"manually-setting-up-the-nextjs-project\" style=\"position:relative;\"><a href=\"#manually-setting-up-the-nextjs-project\" aria-label=\"manually setting up the nextjs project permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Manually Setting up the Next.js project</h2>\n<p>Run the following command:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"72120001318813660000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`npx create-next-app <PROJECT_NAME>`, `72120001318813660000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">npx create-next-app <span class=\"token operator\">&lt;</span>PROJECT_NAME<span class=\"token operator\">></span></code></pre></div>\n<p><code class=\"language-text\">create-next-app</code> will prompt you to select details about your project, for the sake of this example we are:</p>\n<ul>\n<li>Using Typescript</li>\n<li>Using ESLint</li>\n<li><strong>Not</strong> using Tailwind CSS</li>\n<li><strong>Not</strong> using the <code class=\"language-text\">src/</code> directory</li>\n<li>Using the App router</li>\n<li><strong>Not</strong> using import aliases</li>\n</ul>\n<p>After the tool has finished, you should have a basic Next.js app setup. You can run the project with <code class=\"language-text\">npm run dev</code>.</p>\n<h2 id=\"installing-and-setting-up-supertokens\" style=\"position:relative;\"><a href=\"#installing-and-setting-up-supertokens\" aria-label=\"installing and setting up supertokens permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Installing and setting up SuperTokens</h2>\n<p>Install <code class=\"language-text\">supertokens-auth-react</code> and <code class=\"language-text\">supertokens-node</code> as node dependencies:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"65043884599648210000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`npm i supertokens-node supertokens-auth-react`, `65043884599648210000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">npm</span> i supertokens-node supertokens-auth-react</code></pre></div>\n<p>In this example, we are going to be using the Social login + email password recipe of SuperTokens.</p>\n<h3 id=\"step-1-initialise-supertokens-for-our-apis\" style=\"position:relative;\"><a href=\"#step-1-initialise-supertokens-for-our-apis\" aria-label=\"step 1 initialise supertokens for our apis permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Step 1: Initialise SuperTokens for our APIs</h3>\n<p>SuperTokens’ node SDK provides a set of APIs that we can use for logging in our users and managing their sessions. We will follow the <a href=\"https://supertokens.com/docs/thirdpartyemailpassword/pre-built-ui/setup/backend\" target=\"_blank\" rel=\"nofollow\">quick setup guide</a> to initialise the backend SDK. Create a <code class=\"language-text\">/app/config/appinfo.ts</code> file and add the following code to it:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"60558182240651570000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`export const appInfo = {\n    appName: 'SuperTokens Next.js demo app',\n    apiDomain: 'http://localhost:3000',\n    websiteDomain: 'http://localhost:3000',\n    apiBasePath: '/api/auth',\n    websiteBasePath: '/auth',\n};`, `60558182240651570000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"ts\"><pre class=\"language-ts\"><code class=\"language-ts\"><span class=\"token keyword\">export</span> <span class=\"token keyword\">const</span> appInfo <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n    appName<span class=\"token operator\">:</span> <span class=\"token string\">'SuperTokens Next.js demo app'</span><span class=\"token punctuation\">,</span>\n    apiDomain<span class=\"token operator\">:</span> <span class=\"token string\">'http://localhost:3000'</span><span class=\"token punctuation\">,</span>\n    websiteDomain<span class=\"token operator\">:</span> <span class=\"token string\">'http://localhost:3000'</span><span class=\"token punctuation\">,</span>\n    apiBasePath<span class=\"token operator\">:</span> <span class=\"token string\">'/api/auth'</span><span class=\"token punctuation\">,</span>\n    websiteBasePath<span class=\"token operator\">:</span> <span class=\"token string\">'/auth'</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<ul>\n<li><code class=\"language-text\">apiDomain</code> tells SuperTokens where the APIs are exposed from</li>\n<li><code class=\"language-text\">websiteDomain</code> is the base URL of the frontend</li>\n<li><code class=\"language-text\">apiBasePath</code> is the path at which the backend SDK exposes all its APIs</li>\n<li><code class=\"language-text\">websiteBasePath</code> is the path where the frontend SDK will add its routes</li>\n</ul>\n<p>Because Next.js serves both the frontend and backend on the same base URL, it is important to make sure that the <code class=\"language-text\">apiBasePath</code> and <code class=\"language-text\">websiteBasePath</code> are not the same.</p>\n<p>Create a <code class=\"language-text\">/app/config/backend.ts</code> file and add the following code to it:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"64200193894501360000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import SuperTokens from &quot;supertokens-node&quot;;\nimport ThirdPartyEmailPassword from &quot;supertokens-node/recipe/thirdpartyemailpassword&quot;;\nimport Session from &quot;supertokens-node/recipe/session&quot;;\nimport { TypeInput } from &quot;supertokens-node/types&quot;;\nimport { appInfo } from &quot;./appinfo&quot;;\n\nexport const backendConfig = (): TypeInput => {\n    return {\n        appInfo,\n        supertokens: {\n            connectionURI: &quot;https://try.supertokens.io&quot;,\n        },\n        recipeList: [\n            ThirdPartyEmailPassword.init({\n                /**\n                 * These are development credentials provided by SuperTokens, make sure\n                 * to use your own credentials when you deploy to production.\n                 */\n                providers: [\n                    {\n                        config: {\n                            thirdPartyId: &quot;google&quot;,\n                            clients: [{\n                                clientId: &quot;1060725074195-kmeum4crr01uirfl2op9kd5acmi9jutn.apps.googleusercontent.com&quot;,\n                                clientSecret: &quot;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&quot;\n                            }]\n                        }\n                    }, \n                    {\n                        config: {\n                            thirdPartyId: &quot;github&quot;,\n                            clients: [{\n                                clientId: &quot;467101b197249757c71f&quot;,\n                                clientSecret: &quot;e97051221f4b6426e8fe8d51486396703012f5bd&quot;\n                            }]\n                        }\n                    }, \n                    {\n                        config: {\n                            thirdPartyId: &quot;apple&quot;,\n                            clients: [{\n                                clientId: &quot;4398792-io.supertokens.example.service&quot;,\n                                additionalConfig: {\n                                    keyId: &quot;7M48Y4RYDL&quot;,\n                                    privateKey:\n                                        &quot;-----BEGIN PRIVATE KEY-----\\nMIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQgu8gXs+XYkqXD6Ala9Sf/iJXzhbwcoG5dMh1OonpdJUmgCgYIKoZIzj0DAQehRANCAASfrvlFbFCYqn3I2zeknYXLwtH30JuOKestDbSfZYxZNMqhF/OzdZFTV0zc5u5s3eN+oCWbnvl0hM+9IW0UlkdA\\n-----END PRIVATE KEY-----&quot;,\n                                    teamId: &quot;YWQCXGJRJL&quot;,\n                                }\n                            }]\n                        }\n                    },\n                ],\n            }),\n            Session.init(),\n        ],\n    };\n}\n\nlet initialized = false;\nexport function ensureSuperTokensInit() {\n  if (!initialized) {\n    SuperTokens.init(backendConfig());\n    initialized = true;\n  }\n}`, `64200193894501360000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"ts\"><pre class=\"language-ts\"><code class=\"language-ts\"><span class=\"token keyword\">import</span> SuperTokens <span class=\"token keyword\">from</span> <span class=\"token string\">\"supertokens-node\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> ThirdPartyEmailPassword <span class=\"token keyword\">from</span> <span class=\"token string\">\"supertokens-node/recipe/thirdpartyemailpassword\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> Session <span class=\"token keyword\">from</span> <span class=\"token string\">\"supertokens-node/recipe/session\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> TypeInput <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"supertokens-node/types\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> appInfo <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"./appinfo\"</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">const</span> backendConfig <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> TypeInput <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span>\n        appInfo<span class=\"token punctuation\">,</span>\n        supertokens<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n            connectionURI<span class=\"token operator\">:</span> <span class=\"token string\">\"https://try.supertokens.io\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n        recipeList<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n            ThirdPartyEmailPassword<span class=\"token punctuation\">.</span><span class=\"token function\">init</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n                <span class=\"token comment\">/**\n                 * These are development credentials provided by SuperTokens, make sure\n                 * to use your own credentials when you deploy to production.\n                 */</span>\n                providers<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n                    <span class=\"token punctuation\">{</span>\n                        config<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n                            thirdPartyId<span class=\"token operator\">:</span> <span class=\"token string\">\"google\"</span><span class=\"token punctuation\">,</span>\n                            clients<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">{</span>\n                                clientId<span class=\"token operator\">:</span> <span class=\"token string\">\"1060725074195-kmeum4crr01uirfl2op9kd5acmi9jutn.apps.googleusercontent.com\"</span><span class=\"token punctuation\">,</span>\n                                clientSecret<span class=\"token operator\">:</span> <span class=\"token string\">\"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\"</span>\n                            <span class=\"token punctuation\">}</span><span class=\"token punctuation\">]</span>\n                        <span class=\"token punctuation\">}</span>\n                    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> \n                    <span class=\"token punctuation\">{</span>\n                        config<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n                            thirdPartyId<span class=\"token operator\">:</span> <span class=\"token string\">\"github\"</span><span class=\"token punctuation\">,</span>\n                            clients<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">{</span>\n                                clientId<span class=\"token operator\">:</span> <span class=\"token string\">\"467101b197249757c71f\"</span><span class=\"token punctuation\">,</span>\n                                clientSecret<span class=\"token operator\">:</span> <span class=\"token string\">\"e97051221f4b6426e8fe8d51486396703012f5bd\"</span>\n                            <span class=\"token punctuation\">}</span><span class=\"token punctuation\">]</span>\n                        <span class=\"token punctuation\">}</span>\n                    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> \n                    <span class=\"token punctuation\">{</span>\n                        config<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n                            thirdPartyId<span class=\"token operator\">:</span> <span class=\"token string\">\"apple\"</span><span class=\"token punctuation\">,</span>\n                            clients<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">{</span>\n                                clientId<span class=\"token operator\">:</span> <span class=\"token string\">\"4398792-io.supertokens.example.service\"</span><span class=\"token punctuation\">,</span>\n                                additionalConfig<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n                                    keyId<span class=\"token operator\">:</span> <span class=\"token string\">\"7M48Y4RYDL\"</span><span class=\"token punctuation\">,</span>\n                                    privateKey<span class=\"token operator\">:</span>\n                                        <span class=\"token string\">\"-----BEGIN PRIVATE KEY-----\\nMIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQgu8gXs+XYkqXD6Ala9Sf/iJXzhbwcoG5dMh1OonpdJUmgCgYIKoZIzj0DAQehRANCAASfrvlFbFCYqn3I2zeknYXLwtH30JuOKestDbSfZYxZNMqhF/OzdZFTV0zc5u5s3eN+oCWbnvl0hM+9IW0UlkdA\\n-----END PRIVATE KEY-----\"</span><span class=\"token punctuation\">,</span>\n                                    teamId<span class=\"token operator\">:</span> <span class=\"token string\">\"YWQCXGJRJL\"</span><span class=\"token punctuation\">,</span>\n                                <span class=\"token punctuation\">}</span>\n                            <span class=\"token punctuation\">}</span><span class=\"token punctuation\">]</span>\n                        <span class=\"token punctuation\">}</span>\n                    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n                <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n            <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n            Session<span class=\"token punctuation\">.</span><span class=\"token function\">init</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n        <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">let</span> initialized <span class=\"token operator\">=</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">function</span> <span class=\"token function\">ensureSuperTokensInit</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>initialized<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    SuperTokens<span class=\"token punctuation\">.</span><span class=\"token function\">init</span><span class=\"token punctuation\">(</span><span class=\"token function\">backendConfig</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    initialized <span class=\"token operator\">=</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>The <code class=\"language-text\">ThirdPartyEmailPassword</code> recipe adds email password and social login to our project and the <code class=\"language-text\">Session</code> recipe adds the functionality of managing users sessions and refreshing their sessions.</p>\n<p>In our APIs we will use <code class=\"language-text\">ensureSuperTokensInit</code> to make sure SuperTokens is initialised before we use any functionality from the SDK.</p>\n<p>Also modify the <code class=\"language-text\">dev</code> script in the <code class=\"language-text\">package.json</code> to:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"74740785362397380000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`{\n    &quot;scripts&quot;: {\n        &quot;dev&quot;: &quot;next dev -p 3000&quot;,\n    },\n}`, `74740785362397380000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\n    <span class=\"token property\">\"scripts\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token property\">\"dev\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"next dev -p 3000\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>We do this because in this example we want the project to run on port <code class=\"language-text\">3000</code>, if you want to keep the default port or use another port you can modify this script. Keep in mind that if you use a different port, you also need to modify the <code class=\"language-text\">apiDomain</code> and <code class=\"language-text\">websiteDomain</code> values inside the <code class=\"language-text\">/app/config/backend.ts</code> file.</p>\n<h3 id=\"step-2-adding-supertokens-api-routes\" style=\"position:relative;\"><a href=\"#step-2-adding-supertokens-api-routes\" aria-label=\"step 2 adding supertokens api routes permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Step 2: Adding SuperTokens’ API routes</h3>\n<p>The SuperTokens backend SDKs expose a set of API routes that we can use in our project, this makes it easier to add login to our app because we don’t have to build this logic ourselves.</p>\n<p>Start by creating a new file <code class=\"language-text\">/app/api/auth/[...path]/route.ts</code>. Adding <code class=\"language-text\">[...path]</code> as a folder makes sure that the <code class=\"language-text\">route.ts</code> file is called for all network calls made to the <code class=\"language-text\">/auth/*</code> paths. Add the following content to the <code class=\"language-text\">route.ts</code> file:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"85677322761570520000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import { getAppDirRequestHandler } from 'supertokens-node/nextjs';\nimport { NextRequest, NextResponse } from 'next/server';\nimport { ensureSuperTokensInit } from '../../../config/backend';\n\nensureSuperTokensInit();\n\nconst handleCall = getAppDirRequestHandler(NextResponse);\n\nexport async function GET(request: NextRequest) {\n  const res = await handleCall(request);\n  if (!res.headers.has('Cache-Control')) {\n    // This is needed for production deployments with Vercel\n    res.headers.set(\n      'Cache-Control',\n      'no-cache, no-store, max-age=0, must-revalidate'\n    )\n  }\n  return res;\n}\n\nexport async function POST(request: NextRequest) {\n  return handleCall(request);\n}\n\nexport async function DELETE(request: NextRequest) {\n  return handleCall(request);\n}\n\nexport async function PUT(request: NextRequest) {\n  return handleCall(request);\n}\n\nexport async function PATCH(request: NextRequest) {\n  return handleCall(request);\n}\n\nexport async function HEAD(request: NextRequest) {\n  return handleCall(request);\n}`, `85677322761570520000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"ts\"><pre class=\"language-ts\"><code class=\"language-ts\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> getAppDirRequestHandler <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'supertokens-node/nextjs'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> NextRequest<span class=\"token punctuation\">,</span> NextResponse <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'next/server'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> ensureSuperTokensInit <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'../../../config/backend'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token function\">ensureSuperTokensInit</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> handleCall <span class=\"token operator\">=</span> <span class=\"token function\">getAppDirRequestHandler</span><span class=\"token punctuation\">(</span>NextResponse<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token constant\">GET</span><span class=\"token punctuation\">(</span>request<span class=\"token operator\">:</span> NextRequest<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> res <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">handleCall</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>res<span class=\"token punctuation\">.</span>headers<span class=\"token punctuation\">.</span><span class=\"token function\">has</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Cache-Control'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// This is needed for production deployments with Vercel</span>\n    res<span class=\"token punctuation\">.</span>headers<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span>\n      <span class=\"token string\">'Cache-Control'</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string\">'no-cache, no-store, max-age=0, must-revalidate'</span>\n    <span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token keyword\">return</span> res<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token constant\">POST</span><span class=\"token punctuation\">(</span>request<span class=\"token operator\">:</span> NextRequest<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token function\">handleCall</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token constant\">DELETE</span><span class=\"token punctuation\">(</span>request<span class=\"token operator\">:</span> NextRequest<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token function\">handleCall</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token constant\">PUT</span><span class=\"token punctuation\">(</span>request<span class=\"token operator\">:</span> NextRequest<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token function\">handleCall</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token constant\">PATCH</span><span class=\"token punctuation\">(</span>request<span class=\"token operator\">:</span> NextRequest<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token function\">handleCall</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token constant\">HEAD</span><span class=\"token punctuation\">(</span>request<span class=\"token operator\">:</span> NextRequest<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token function\">handleCall</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>We call <code class=\"language-text\">ensureSuperTokensInit</code> to make sure SuperTokens is always initialised when any of the SuperTokens API routes are called. <code class=\"language-text\">getAppDirRequestHandler</code> is a helper function that the SuperTokens SDK provides, this adds request parsing, error handling etc so that we dont have to manually check for individual API results.</p>\n<p>And thats it, the SuperTokens backend SDK is setup. To verify that we have set it up correctly you can open <a href=\"http://localhost:3000/api/auth/signup/email/exists?email=somerandomemail@email.com\" target=\"_blank\" rel=\"nofollow\">http://localhost:3000/api/auth/signup/email/exists?email=somerandomemail@email.com</a> in your browser, if it is all working correctly you should see a response similar to:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"30665328098169820000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`{&quot;status&quot;:&quot;OK&quot;,&quot;exists&quot;:false}`, `30665328098169820000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token punctuation\">{</span><span class=\"token property\">\"status\"</span><span class=\"token operator\">:</span><span class=\"token string\">\"OK\"</span><span class=\"token punctuation\">,</span><span class=\"token property\">\"exists\"</span><span class=\"token operator\">:</span><span class=\"token boolean\">false</span><span class=\"token punctuation\">}</span></code></pre></div>\n<p>You can see the <a href=\"https://supertokens.com/docs/fdi\" target=\"_blank\" rel=\"nofollow\">full API spec</a> to know all the API routes that the SuperTokens backend SDKs expose.</p>\n<h3 id=\"step-3-adding-supertokens-to-the-frontend\" style=\"position:relative;\"><a href=\"#step-3-adding-supertokens-to-the-frontend\" aria-label=\"step 3 adding supertokens to the frontend permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Step 3: Adding SuperTokens to the frontend</h3>\n<p><code class=\"language-text\">supertokens-auth-react</code> provides a pre built UI that gets added as part of your project so that you dont have to build the login UI yourself. If you want to build your own UI you can use functions exposed by the SDK to interact with your APIs, either way you dont need to call the APIs exposed by the backend SDKs manually.</p>\n<p>The full set of steps for initialising SuperTokens with the pre-built UI can be found in the <a href=\"https://supertokens.com/docs/thirdpartyemailpassword/pre-built-ui/setup/frontend\" target=\"_blank\" rel=\"nofollow\">official frontend setup guide</a></p>\n<p>Create a <code class=\"language-text\">/app/config/frontend.ts</code> file and add the following code to it:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"65020968934146080000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import ThirdPartyEmailPassword, {\n    Google,\n    Github,\n    Apple,\n} from 'supertokens-auth-react/recipe/thirdpartyemailpassword';\nimport Session from 'supertokens-auth-react/recipe/session';\nimport { appInfo } from './appinfo';\nimport { useRouter } from 'next/navigation';\nimport { SuperTokensConfig } from 'supertokens-auth-react/lib/build/types';\n\nconst routerInfo: { router?: ReturnType<typeof useRouter>; pathName?: string } =\n  {};\n\nexport function setRouter(\n  router: ReturnType<typeof useRouter>,\n  pathName: string,\n) {\n  routerInfo.router = router;\n  routerInfo.pathName = pathName;\n}\n\nexport const frontendConfig = (): SuperTokensConfig => {\n    return {\n        appInfo,\n        recipeList: [\n            ThirdPartyEmailPassword.init({\n                signInAndUpFeature: {\n                    providers: [\n                        Google.init(),\n                        Github.init(),\n                        Apple.init(),\n                    ],\n                },\n            }),\n            Session.init(),\n        ],\n        windowHandler: (orig) => {\n            return {\n                ...orig,\n                location: {\n                    ...orig.location,\n                    getPathName: () => routerInfo.pathName!,\n                    assign: (url) => routerInfo.router!.push(url.toString()),\n                    setHref: (url) => routerInfo.router!.push(url.toString()),\n                },\n            };\n        },\n    };\n}`, `65020968934146080000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"ts\"><pre class=\"language-ts\"><code class=\"language-ts\"><span class=\"token keyword\">import</span> ThirdPartyEmailPassword<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n    Google<span class=\"token punctuation\">,</span>\n    Github<span class=\"token punctuation\">,</span>\n    Apple<span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'supertokens-auth-react/recipe/thirdpartyemailpassword'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> Session <span class=\"token keyword\">from</span> <span class=\"token string\">'supertokens-auth-react/recipe/session'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> appInfo <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'./appinfo'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> useRouter <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'next/navigation'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> SuperTokensConfig <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'supertokens-auth-react/lib/build/types'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> routerInfo<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> router<span class=\"token operator\">?</span><span class=\"token operator\">:</span> ReturnType<span class=\"token operator\">&lt;</span><span class=\"token keyword\">typeof</span> useRouter<span class=\"token operator\">></span><span class=\"token punctuation\">;</span> pathName<span class=\"token operator\">?</span><span class=\"token operator\">:</span> <span class=\"token builtin\">string</span> <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span>\n  <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">function</span> <span class=\"token function\">setRouter</span><span class=\"token punctuation\">(</span>\n  router<span class=\"token operator\">:</span> ReturnType<span class=\"token operator\">&lt;</span><span class=\"token keyword\">typeof</span> useRouter<span class=\"token operator\">></span><span class=\"token punctuation\">,</span>\n  pathName<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  routerInfo<span class=\"token punctuation\">.</span>router <span class=\"token operator\">=</span> router<span class=\"token punctuation\">;</span>\n  routerInfo<span class=\"token punctuation\">.</span>pathName <span class=\"token operator\">=</span> pathName<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">const</span> frontendConfig <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> SuperTokensConfig <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span>\n        appInfo<span class=\"token punctuation\">,</span>\n        recipeList<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n            ThirdPartyEmailPassword<span class=\"token punctuation\">.</span><span class=\"token function\">init</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n                signInAndUpFeature<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n                    providers<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n                        Google<span class=\"token punctuation\">.</span><span class=\"token function\">init</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n                        Github<span class=\"token punctuation\">.</span><span class=\"token function\">init</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n                        Apple<span class=\"token punctuation\">.</span><span class=\"token function\">init</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n                <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n            <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n            Session<span class=\"token punctuation\">.</span><span class=\"token function\">init</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n        <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n        <span class=\"token function-variable function\">windowHandler</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span>orig<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span>\n                <span class=\"token operator\">...</span>orig<span class=\"token punctuation\">,</span>\n                location<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n                    <span class=\"token operator\">...</span>orig<span class=\"token punctuation\">.</span>location<span class=\"token punctuation\">,</span>\n                    <span class=\"token function-variable function\">getPathName</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> routerInfo<span class=\"token punctuation\">.</span>pathName<span class=\"token operator\">!</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token function-variable function\">assign</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> routerInfo<span class=\"token punctuation\">.</span>router<span class=\"token operator\">!</span><span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">.</span><span class=\"token function\">toString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token function-variable function\">setHref</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> routerInfo<span class=\"token punctuation\">.</span>router<span class=\"token operator\">!</span><span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">.</span><span class=\"token function\">toString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n                <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n            <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Create a <code class=\"language-text\">/app/components/supertokensProvider.tsx</code> file and add the following contents to it:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"47470635988224250000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`'use client';\nimport React from 'react';\nimport { SuperTokensWrapper } from 'supertokens-auth-react';\nimport SuperTokensReact from 'supertokens-auth-react';\nimport { frontendConfig, setRouter } from '../config/frontend';\nimport { usePathname, useRouter } from 'next/navigation';\n\nif (typeof window !== 'undefined') {\n  // we only want to call this init function on the frontend, so we check typeof window !== 'undefined'\n  SuperTokensReact.init(frontendConfig());\n}\n\nexport const Providers: React.FC<React.PropsWithChildren<{}>> = ({\n  children,\n}) => {\n  setRouter(useRouter(), usePathname() || window.location.pathname);\n\n  return <SuperTokensWrapper>{children}</SuperTokensWrapper>;\n};`, `47470635988224250000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"tsx\"><pre class=\"language-tsx\"><code class=\"language-tsx\"><span class=\"token string\">'use client'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> React <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> SuperTokensWrapper <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'supertokens-auth-react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> SuperTokensReact <span class=\"token keyword\">from</span> <span class=\"token string\">'supertokens-auth-react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> frontendConfig<span class=\"token punctuation\">,</span> setRouter <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'../config/frontend'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> usePathname<span class=\"token punctuation\">,</span> useRouter <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'next/navigation'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">typeof</span> window <span class=\"token operator\">!==</span> <span class=\"token string\">'undefined'</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// we only want to call this init function on the frontend, so we check typeof window !== 'undefined'</span>\n  SuperTokensReact<span class=\"token punctuation\">.</span><span class=\"token function\">init</span><span class=\"token punctuation\">(</span><span class=\"token function\">frontendConfig</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">const</span> Providers<span class=\"token operator\">:</span> React<span class=\"token punctuation\">.</span><span class=\"token constant\">FC</span><span class=\"token operator\">&lt;</span>React<span class=\"token punctuation\">.</span>PropsWithChildren<span class=\"token operator\">&lt;</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token operator\">>></span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n  children<span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">setRouter</span><span class=\"token punctuation\">(</span><span class=\"token function\">useRouter</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token function\">usePathname</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">||</span> window<span class=\"token punctuation\">.</span>location<span class=\"token punctuation\">.</span>pathname<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">SuperTokensWrapper</span></span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">{</span>children<span class=\"token punctuation\">}</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">SuperTokensWrapper</span></span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>We check for <code class=\"language-text\">window</code> not being undefined because we only want to initialise the SuperTokens React SDK on the client side. The <code class=\"language-text\">SuperTokensWrapper</code> component adds some context to the rest of our application so that we can access the session from anywhere.</p>\n<p><code class=\"language-text\">SuperTokens</code> wrapper initialises a React context for sessions, because of this we make this component a client component by adding <code class=\"language-text\">'use client'</code> to the top of the file.</p>\n<p>Modify the <code class=\"language-text\">/app/layout.tsx</code> file:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"37954208201651230000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import './globals.css'\nimport type { Metadata } from 'next'\nimport { Inter } from 'next/font/google'\nimport { SuperTokensProvider } from './components/supertokensProvider'\n\nconst inter = Inter({ subsets: ['latin'] })\n\nexport const metadata: Metadata = {\n  title: 'Create Next App',\n  description: 'Generated by create next app',\n}\n\nexport default function RootLayout({\n  children,\n}: {\n  children: React.ReactNode\n}) {\n  return (\n    <html lang=&quot;en&quot;>\n      <SuperTokensProvider>\n        <body className={inter.className}>{children}</body>\n      </SuperTokensProvider>\n    </html>\n  )\n}`, `37954208201651230000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"tsx\"><pre class=\"language-tsx\"><code class=\"language-tsx\"><span class=\"token keyword\">import</span> <span class=\"token string\">'./globals.css'</span>\n<span class=\"token keyword\">import</span> <span class=\"token keyword\">type</span> <span class=\"token punctuation\">{</span> Metadata <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'next'</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Inter <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'next/font/google'</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> SuperTokensProvider <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'./components/supertokensProvider'</span>\n\n<span class=\"token keyword\">const</span> inter <span class=\"token operator\">=</span> <span class=\"token function\">Inter</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> subsets<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'latin'</span><span class=\"token punctuation\">]</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">const</span> metadata<span class=\"token operator\">:</span> Metadata <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  title<span class=\"token operator\">:</span> <span class=\"token string\">'Create Next App'</span><span class=\"token punctuation\">,</span>\n  description<span class=\"token operator\">:</span> <span class=\"token string\">'Generated by create next app'</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">function</span> <span class=\"token function\">RootLayout</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n  children<span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n  children<span class=\"token operator\">:</span> React<span class=\"token punctuation\">.</span>ReactNode\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>html</span> <span class=\"token attr-name\">lang</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>en<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">SuperTokensProvider</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>body</span> <span class=\"token attr-name\">className</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>inter<span class=\"token punctuation\">.</span>className<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">{</span>children<span class=\"token punctuation\">}</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>body</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">SuperTokensProvider</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>html</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"step-4-adding-supertokens-routes-to-our-frontend\" style=\"position:relative;\"><a href=\"#step-4-adding-supertokens-routes-to-our-frontend\" aria-label=\"step 4 adding supertokens routes to our frontend permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Step 4: Adding SuperTokens routes to our frontend</h3>\n<p>Create a new <code class=\"language-text\">/app/auth/[[...path]]/page.tsx</code> file. Adding <code class=\"language-text\">[[...path]]</code> as a folder makes sure that the <code class=\"language-text\">page.tsx</code> file is served for all <code class=\"language-text\">/auth/*</code> routes and also ensures that the <code class=\"language-text\">/auth</code> route itself also serves the <code class=\"language-text\">page.tsx</code> file. Add the following content to the <code class=\"language-text\">page.tsx</code> file</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"96023427578272280000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`'use client';\n\nimport { useEffect } from 'react';\nimport { redirectToAuth } from 'supertokens-auth-react';\nimport SuperTokens from 'supertokens-auth-react/ui';\nimport { ThirdPartyEmailPasswordPreBuiltUI } from 'supertokens-auth-react/recipe/thirdpartyemailpassword/prebuiltui';\n\nexport default function Auth() {\n  // if the user visits a page that is not handled by us (like /auth/random), then we redirect them back to the auth page.\n  useEffect(() => {\n    if (\n      SuperTokens.canHandleRoute([ThirdPartyEmailPasswordPreBuiltUI]) === false\n    ) {\n      redirectToAuth({ redirectBack: false });\n    }\n  }, []);\n\n  if (typeof window !== 'undefined') {\n    return SuperTokens.getRoutingComponent([ThirdPartyEmailPasswordPreBuiltUI]);\n  }\n\n  return null;\n}`, `96023427578272280000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"tsx\"><pre class=\"language-tsx\"><code class=\"language-tsx\"><span class=\"token string\">'use client'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> useEffect <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> redirectToAuth <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'supertokens-auth-react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> SuperTokens <span class=\"token keyword\">from</span> <span class=\"token string\">'supertokens-auth-react/ui'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> ThirdPartyEmailPasswordPreBuiltUI <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'supertokens-auth-react/recipe/thirdpartyemailpassword/prebuiltui'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">function</span> <span class=\"token function\">Auth</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// if the user visits a page that is not handled by us (like /auth/random), then we redirect them back to the auth page.</span>\n  <span class=\"token function\">useEffect</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>\n      SuperTokens<span class=\"token punctuation\">.</span><span class=\"token function\">canHandleRoute</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>ThirdPartyEmailPasswordPreBuiltUI<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">===</span> <span class=\"token boolean\">false</span>\n    <span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">redirectToAuth</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> redirectBack<span class=\"token operator\">:</span> <span class=\"token boolean\">false</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">typeof</span> window <span class=\"token operator\">!==</span> <span class=\"token string\">'undefined'</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> SuperTokens<span class=\"token punctuation\">.</span><span class=\"token function\">getRoutingComponent</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>ThirdPartyEmailPasswordPreBuiltUI<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p><code class=\"language-text\">SuperTokens.canHandleRoute</code> returns true if SuperTokens exposes a component for the current browser url and <code class=\"language-text\">ThirdPartyEmailPasswordPreBuiltUI</code> are all the pre built UI components that can handle a specific set of routes. In this file we check if the current page can be handled by the SuperTokens SDK and return the relevant component from SuperTokens using <code class=\"language-text\">SuperTokens.getRoutingComponent</code>.</p>\n<p>Now if you visit <code class=\"language-text\">http://localhost:3000/auth</code> in your browser, you can view the login page of our project and it should look like this:</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/043fc9a1ccd3c4b8ca239b3cbdfd68f7/ae953/default-login.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 81.64556962025317%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAAAsTAAALEwEAmpwYAAABaUlEQVQ4y6XUy0rDQBQG4PRGF4kv1Ifoq7RRtIViG92oq/YFXNWFaKFxUdxIV7rqQroTxYUtkqQ3SjIzzf2XjgiijTTxwE+GyTkfwwQiCIKAn8nn82i32+j1elBVla87nWuo3S76/T6KxSLvy2Qy2DD/G5QkCa7r4qtM08T3qlarvC+bzW4HiqIIXdf5MKMUtm2DshUsQvleqVSKD06nUz5sWSbm8zkPpYTvybKcHJzNZjyLxQKMsf+Da4QQwp+O4yQD1x9F0zRQSjkSBAHCMOR3mfiEhmHAdWxQYsHzXPieixWjyUHdmGDJfNghEADwAb7+BMsxQWkHE20Mf3SP1csd/PcBvNED2NMtgCXkvf34oD5+Rfh8A/Z4AWt4BTq8BBmcA/YbyrsxQUkUYTsuoqpSOYgH5nI51Go1nJ2eQFEU1BsNHNbrOD5S0Go1USgUeF86nd4O3CapVCrq3eaB9Z8kKn9gyU8YlQ9KwEX6dDpMcgAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"Login Page\"\n        title=\"Login Page\"\n        src=\"/static/043fc9a1ccd3c4b8ca239b3cbdfd68f7/f058b/default-login.png\"\n        srcset=\"/static/043fc9a1ccd3c4b8ca239b3cbdfd68f7/c26ae/default-login.png 158w,\n/static/043fc9a1ccd3c4b8ca239b3cbdfd68f7/6bdcf/default-login.png 315w,\n/static/043fc9a1ccd3c4b8ca239b3cbdfd68f7/f058b/default-login.png 630w,\n/static/043fc9a1ccd3c4b8ca239b3cbdfd68f7/40601/default-login.png 945w,\n/static/043fc9a1ccd3c4b8ca239b3cbdfd68f7/ae953/default-login.png 1132w\"\n        sizes=\"(max-width: 630px) 100vw, 630px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n  </a>\n    </span></p>\n<p>Does not look the best but at least it works, lets modify the default next app styling to make it look better!</p>\n<p>Modify <code class=\"language-text\">/app/globals.css</code>:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"71706976155458780000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`html {\n  height: 100%;\n}`, `71706976155458780000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"css\"><pre class=\"language-css\"><code class=\"language-css\"><span class=\"token selector\">html</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">height</span><span class=\"token punctuation\">:</span> 100%<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>For the sake of this example we cleared everything because we will not need the additional styles.</p>\n<p>The login page should not look like this:</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/455b353e7dca96fc49e31946fcc7cb78/ae953/default-login-styled.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 81.64556962025317%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAAAsTAAALEwEAmpwYAAABF0lEQVQ4y6WTy0rEQBBF5/+/w4Ug4gcIunLlSsnChdkEBMG8hvS7uvpK9UyGIEOcnhRcKlTfHKpS6R0WkVI65VnMjGEY4J07nUlt6V3Gbg0o4ZxD0zQY9hp8OL0eKKIQEIngPIGItwEllJrQdV2W9z7XNgEF1LYt+r4HEW0HWmuhlIIxJoOKgbMhhIBxHHNXM0DyrOIOmSO0mmC0ApEsJiAGD47xOmBkxs/eQtYgg8ajOI8cC4AytjwHA1s/w9VPiF+voOYFoX5E7D4zNCUuBPoJ/PGAUN3CVPdw1R3o/Qb8/VYIlCzf6FiT13wCaOErG3lxXzkSnLPQxkBpDZKl8GEpuAR4zrAW57z/3uU1XdTh35+8BCbAX3uL8H3RolqHAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"Styled Login Page\"\n        title=\"Styled Login Page\"\n        src=\"/static/455b353e7dca96fc49e31946fcc7cb78/f058b/default-login-styled.png\"\n        srcset=\"/static/455b353e7dca96fc49e31946fcc7cb78/c26ae/default-login-styled.png 158w,\n/static/455b353e7dca96fc49e31946fcc7cb78/6bdcf/default-login-styled.png 315w,\n/static/455b353e7dca96fc49e31946fcc7cb78/f058b/default-login-styled.png 630w,\n/static/455b353e7dca96fc49e31946fcc7cb78/40601/default-login-styled.png 945w,\n/static/455b353e7dca96fc49e31946fcc7cb78/ae953/default-login-styled.png 1132w\"\n        sizes=\"(max-width: 630px) 100vw, 630px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n  </a>\n    </span></p>\n<p>And thats it! The frontend SDK is now setup and the <code class=\"language-text\">/auth</code> routes are handled by SuperTokens.</p>\n<h2 id=\"building-our-home-page\" style=\"position:relative;\"><a href=\"#building-our-home-page\" aria-label=\"building our home page permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Building our home page</h2>\n<p>Lets start by clearing the default home page content and styles in <code class=\"language-text\">/app/page.tsx</code> and <code class=\"language-text\">/app/page.module.css</code></p>\n<p><code class=\"language-text\">/app/page.tsx</code></p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"62650381128087900000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import styles from './page.module.css'\n\nexport default function Home() {\n  return (\n    <main className={styles.main}>\n      Hello World\n    </main>\n  )\n}`, `62650381128087900000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"tsx\"><pre class=\"language-tsx\"><code class=\"language-tsx\"><span class=\"token keyword\">import</span> styles <span class=\"token keyword\">from</span> <span class=\"token string\">'./page.module.css'</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">function</span> <span class=\"token function\">Home</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>main</span> <span class=\"token attr-name\">className</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>styles<span class=\"token punctuation\">.</span>main<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      Hello World\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>main</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p><code class=\"language-text\">/app/page.module.css</code></p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"49637870904149750000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`.main {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  min-height: 100vh;\n}`, `49637870904149750000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"css\"><pre class=\"language-css\"><code class=\"language-css\"><span class=\"token selector\">.main</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">display</span><span class=\"token punctuation\">:</span> flex<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">flex-direction</span><span class=\"token punctuation\">:</span> column<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">align-items</span><span class=\"token punctuation\">:</span> center<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">justify-content</span><span class=\"token punctuation\">:</span> center<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">min-height</span><span class=\"token punctuation\">:</span> 100vh<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>In our project we want to do the following:</p>\n<ul>\n<li>Display the user’s <code class=\"language-text\">userId</code> and <code class=\"language-text\">email</code> on the home page</li>\n<li>Only allow users who are logged in to view the home page</li>\n<li>Redirect to the <code class=\"language-text\">/auth</code> route if the visitor is not logged in or their session has expired</li>\n</ul>\n<h3 id=\"protecting-your-frontend-routes\" style=\"position:relative;\"><a href=\"#protecting-your-frontend-routes\" aria-label=\"protecting your frontend routes permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Protecting your frontend routes</h3>\n<p>Start by creating a <code class=\"language-text\">/app/sessionUtils.ts</code> file and adding the following code to it:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"92299416066287290000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`\nimport { cookies, headers } from 'next/headers';\nimport { NextRequest, NextResponse } from 'next/server';\nimport Session, { SessionContainer, VerifySessionOptions } from &quot;supertokens-node/recipe/session&quot;;\nimport { ensureSuperTokensInit } from '../config/backend';\nimport { PreParsedRequest, CollectingResponse } from &quot;supertokens-node/framework/custom&quot;;\nimport { HTTPMethod } from &quot;supertokens-node/types&quot;;\n\nensureSuperTokensInit();\n\nexport async function getSSRSession(\n  req?: NextRequest,\n  options?: VerifySessionOptions\n): Promise<{\n  session: SessionContainer | undefined;\n  hasToken: boolean;\n  hasInvalidClaims: boolean;\n  baseResponse: CollectingResponse;\n  nextResponse?: NextResponse;\n}> {\n  const query = req !== undefined ? Object.fromEntries(new URL(req.url).searchParams.entries()) : {};\n  const parsedCookies: Record<string, string> = Object.fromEntries(\n      (req !== undefined ? req.cookies : cookies()).getAll().map((cookie) => [cookie.name, cookie.value])\n  );\n  let baseRequest = new PreParsedRequest({\n      method: req !== undefined ? (req.method as HTTPMethod) : &quot;get&quot;,\n      url: req !== undefined ? req.url : &quot;&quot;,\n      query: query,\n      headers: req !== undefined ? req.headers : headers(),\n      cookies: parsedCookies,\n      getFormBody: () => req!.formData(),\n      getJSONBody: () => req!.json(),\n  });\n\n  let baseResponse = new CollectingResponse();\n\n  try {\n      let session = await Session.getSession(baseRequest, baseResponse, options);\n      return {\n          session,\n          hasInvalidClaims: false,\n          hasToken: session !== undefined,\n          baseResponse,\n      };\n  } catch (err) {\n      if (Session.Error.isErrorFromSuperTokens(err)) {\n          return {\n              hasToken: err.type !== Session.Error.UNAUTHORISED,\n              hasInvalidClaims: err.type === Session.Error.INVALID_CLAIMS,\n              session: undefined,\n              baseResponse,\n              nextResponse: new NextResponse(&quot;Authentication required&quot;, {\n                  status: err.type === Session.Error.INVALID_CLAIMS ? 403 : 401,\n              }),\n          };\n      } else {\n          throw err;\n      }\n  }\n}`, `92299416066287290000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"ts\"><pre class=\"language-ts\"><code class=\"language-ts\">\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> cookies<span class=\"token punctuation\">,</span> headers <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'next/headers'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> NextRequest<span class=\"token punctuation\">,</span> NextResponse <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'next/server'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> Session<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> SessionContainer<span class=\"token punctuation\">,</span> VerifySessionOptions <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"supertokens-node/recipe/session\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> ensureSuperTokensInit <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'../config/backend'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> PreParsedRequest<span class=\"token punctuation\">,</span> CollectingResponse <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"supertokens-node/framework/custom\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> HTTPMethod <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"supertokens-node/types\"</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token function\">ensureSuperTokensInit</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">getSSRSession</span><span class=\"token punctuation\">(</span>\n  req<span class=\"token operator\">?</span><span class=\"token operator\">:</span> NextRequest<span class=\"token punctuation\">,</span>\n  options<span class=\"token operator\">?</span><span class=\"token operator\">:</span> VerifySessionOptions\n<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token builtin\">Promise</span><span class=\"token operator\">&lt;</span><span class=\"token punctuation\">{</span>\n  session<span class=\"token operator\">:</span> SessionContainer <span class=\"token operator\">|</span> <span class=\"token keyword\">undefined</span><span class=\"token punctuation\">;</span>\n  hasToken<span class=\"token operator\">:</span> <span class=\"token builtin\">boolean</span><span class=\"token punctuation\">;</span>\n  hasInvalidClaims<span class=\"token operator\">:</span> <span class=\"token builtin\">boolean</span><span class=\"token punctuation\">;</span>\n  baseResponse<span class=\"token operator\">:</span> CollectingResponse<span class=\"token punctuation\">;</span>\n  nextResponse<span class=\"token operator\">?</span><span class=\"token operator\">:</span> NextResponse<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> query <span class=\"token operator\">=</span> req <span class=\"token operator\">!==</span> <span class=\"token keyword\">undefined</span> <span class=\"token operator\">?</span> Object<span class=\"token punctuation\">.</span><span class=\"token function\">fromEntries</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\"><span class=\"token constant\">URL</span></span><span class=\"token punctuation\">(</span>req<span class=\"token punctuation\">.</span>url<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>searchParams<span class=\"token punctuation\">.</span><span class=\"token function\">entries</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">const</span> parsedCookies<span class=\"token operator\">:</span> Record<span class=\"token operator\">&lt;</span><span class=\"token builtin\">string</span><span class=\"token punctuation\">,</span> <span class=\"token builtin\">string</span><span class=\"token operator\">></span> <span class=\"token operator\">=</span> Object<span class=\"token punctuation\">.</span><span class=\"token function\">fromEntries</span><span class=\"token punctuation\">(</span>\n      <span class=\"token punctuation\">(</span>req <span class=\"token operator\">!==</span> <span class=\"token keyword\">undefined</span> <span class=\"token operator\">?</span> req<span class=\"token punctuation\">.</span>cookies <span class=\"token operator\">:</span> <span class=\"token function\">cookies</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">getAll</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>cookie<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">[</span>cookie<span class=\"token punctuation\">.</span>name<span class=\"token punctuation\">,</span> cookie<span class=\"token punctuation\">.</span>value<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">let</span> baseRequest <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">PreParsedRequest</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n      method<span class=\"token operator\">:</span> req <span class=\"token operator\">!==</span> <span class=\"token keyword\">undefined</span> <span class=\"token operator\">?</span> <span class=\"token punctuation\">(</span>req<span class=\"token punctuation\">.</span>method <span class=\"token keyword\">as</span> HTTPMethod<span class=\"token punctuation\">)</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"get\"</span><span class=\"token punctuation\">,</span>\n      url<span class=\"token operator\">:</span> req <span class=\"token operator\">!==</span> <span class=\"token keyword\">undefined</span> <span class=\"token operator\">?</span> req<span class=\"token punctuation\">.</span>url <span class=\"token operator\">:</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span>\n      query<span class=\"token operator\">:</span> query<span class=\"token punctuation\">,</span>\n      headers<span class=\"token operator\">:</span> req <span class=\"token operator\">!==</span> <span class=\"token keyword\">undefined</span> <span class=\"token operator\">?</span> req<span class=\"token punctuation\">.</span>headers <span class=\"token operator\">:</span> <span class=\"token function\">headers</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n      cookies<span class=\"token operator\">:</span> parsedCookies<span class=\"token punctuation\">,</span>\n      <span class=\"token function-variable function\">getFormBody</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> req<span class=\"token operator\">!</span><span class=\"token punctuation\">.</span><span class=\"token function\">formData</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n      <span class=\"token function-variable function\">getJSONBody</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> req<span class=\"token operator\">!</span><span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">let</span> baseResponse <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">CollectingResponse</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">let</span> session <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> Session<span class=\"token punctuation\">.</span><span class=\"token function\">getSession</span><span class=\"token punctuation\">(</span>baseRequest<span class=\"token punctuation\">,</span> baseResponse<span class=\"token punctuation\">,</span> options<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span>\n          session<span class=\"token punctuation\">,</span>\n          hasInvalidClaims<span class=\"token operator\">:</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">,</span>\n          hasToken<span class=\"token operator\">:</span> session <span class=\"token operator\">!==</span> <span class=\"token keyword\">undefined</span><span class=\"token punctuation\">,</span>\n          baseResponse<span class=\"token punctuation\">,</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span>err<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>Session<span class=\"token punctuation\">.</span>Error<span class=\"token punctuation\">.</span><span class=\"token function\">isErrorFromSuperTokens</span><span class=\"token punctuation\">(</span>err<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n          <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span>\n              hasToken<span class=\"token operator\">:</span> err<span class=\"token punctuation\">.</span>type <span class=\"token operator\">!==</span> Session<span class=\"token punctuation\">.</span>Error<span class=\"token punctuation\">.</span><span class=\"token constant\">UNAUTHORISED</span><span class=\"token punctuation\">,</span>\n              hasInvalidClaims<span class=\"token operator\">:</span> err<span class=\"token punctuation\">.</span>type <span class=\"token operator\">===</span> Session<span class=\"token punctuation\">.</span>Error<span class=\"token punctuation\">.</span><span class=\"token constant\">INVALID_CLAIMS</span><span class=\"token punctuation\">,</span>\n              session<span class=\"token operator\">:</span> <span class=\"token keyword\">undefined</span><span class=\"token punctuation\">,</span>\n              baseResponse<span class=\"token punctuation\">,</span>\n              nextResponse<span class=\"token operator\">:</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">NextResponse</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Authentication required\"</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n                  status<span class=\"token operator\">:</span> err<span class=\"token punctuation\">.</span>type <span class=\"token operator\">===</span> Session<span class=\"token punctuation\">.</span>Error<span class=\"token punctuation\">.</span><span class=\"token constant\">INVALID_CLAIMS</span> <span class=\"token operator\">?</span> <span class=\"token number\">403</span> <span class=\"token operator\">:</span> <span class=\"token number\">401</span><span class=\"token punctuation\">,</span>\n              <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n          <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n          <span class=\"token keyword\">throw</span> err<span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>To know more about what <code class=\"language-text\">getSSRSession</code> does visit the <a href=\"https://supertokens.com/docs/thirdpartyemailpassword/nextjs/app-directory/session-helpers\" target=\"_blank\" rel=\"nofollow\">official documentation</a></p>\n<p>Create a <code class=\"language-text\">/app/components/tryRefreshClientComponent.tsx</code> file and add the following code:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"50526429061344660000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`&quot;use client&quot;;\n\nimport { useEffect, useState } from &quot;react&quot;;\nimport { useRouter } from &quot;next/navigation&quot;;\nimport Session from &quot;supertokens-auth-react/recipe/session&quot;;\nimport SuperTokens from &quot;supertokens-auth-react&quot;;\n\nexport const TryRefreshComponent = () => {\n    const router = useRouter();\n    const [didError, setDidError] = useState(false);\n\n    useEffect(() => {\n        void Session.attemptRefreshingSession()\n            .then((hasSession) => {\n                if (hasSession) {\n                    router.refresh();\n                } else {\n                    SuperTokens.redirectToAuth();\n                }\n            })\n            .catch(() => {\n                setDidError(true);\n            });\n    }, []);\n\n    if (didError) {\n        return <div>Something went wrong, please reload the page</div>;\n    }\n\n    return <div>Loading...</div>;\n};`, `50526429061344660000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"tsx\"><pre class=\"language-tsx\"><code class=\"language-tsx\"><span class=\"token string\">\"use client\"</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> useEffect<span class=\"token punctuation\">,</span> useState <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"react\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> useRouter <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"next/navigation\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> Session <span class=\"token keyword\">from</span> <span class=\"token string\">\"supertokens-auth-react/recipe/session\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> SuperTokens <span class=\"token keyword\">from</span> <span class=\"token string\">\"supertokens-auth-react\"</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">TryRefreshComponent</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> router <span class=\"token operator\">=</span> <span class=\"token function\">useRouter</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>didError<span class=\"token punctuation\">,</span> setDidError<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token boolean\">false</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token function\">useEffect</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">void</span> Session<span class=\"token punctuation\">.</span><span class=\"token function\">attemptRefreshingSession</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>hasSession<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n                <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>hasSession<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                    router<span class=\"token punctuation\">.</span><span class=\"token function\">refresh</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n                <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n                    SuperTokens<span class=\"token punctuation\">.</span><span class=\"token function\">redirectToAuth</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n                <span class=\"token punctuation\">}</span>\n            <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">.</span><span class=\"token function\">catch</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n                <span class=\"token function\">setDidError</span><span class=\"token punctuation\">(</span><span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>didError<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">Something went wrong, please reload the page</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">return</span> <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">Loading...</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>This component will be used to refresh the session if the user’s current session has expired. We use <code class=\"language-text\">Session.attemptRefreshingSession</code> to call the refresh endpoint, if the request fails we redirect back to the login route using <code class=\"language-text\">SuperTokens.redirectToAuth</code>.</p>\n<p>Create a new <code class=\"language-text\">/app/components/userInformation.tsx</code> file:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"68800161648085600000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import { getSSRSession } from '../sessionUtils';\nimport { TryRefreshComponent } from './tryRefreshClientComponent';\nimport styles from '../../styles/Home.module.css';\nimport { redirect } from 'next/navigation'\n\nexport async function UserInformation() {\n  const { session, hasToken } = await getSSRSession();\n\n  if (!session) {\n    if (!hasToken) {\n      redirect('/auth');\n    }\n    return <TryRefreshComponent />;\n  }\n\n  return (\n    <p className={styles.description}>\n      Server side component got userId: {session.getUserId()}\n    </p>\n  );\n}`, `68800161648085600000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"tsx\"><pre class=\"language-tsx\"><code class=\"language-tsx\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> getSSRSession <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'../sessionUtils'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> TryRefreshComponent <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'./tryRefreshClientComponent'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> styles <span class=\"token keyword\">from</span> <span class=\"token string\">'../../styles/Home.module.css'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> redirect <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'next/navigation'</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">UserInformation</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> session<span class=\"token punctuation\">,</span> hasToken <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">getSSRSession</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>session<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>hasToken<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">redirect</span><span class=\"token punctuation\">(</span><span class=\"token string\">'/auth'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">return</span> <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">TryRefreshComponent</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>p</span> <span class=\"token attr-name\">className</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>styles<span class=\"token punctuation\">.</span>description<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      Server side component got userId: </span><span class=\"token punctuation\">{</span>session<span class=\"token punctuation\">.</span><span class=\"token function\">getUserId</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>p</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>UserInformation is a server side component. In this component we try to fetch session information using <code class=\"language-text\">getSSRSession</code> and if the user has a session we render the user id (we wll change this later). If the user does not have a session but a token exists we try to refresh the session, if no token exists then we redirect the user to the <code class=\"language-text\">/auth</code> route.</p>\n<p>Modify <code class=\"language-text\">/app/page.tsx</code></p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"71451682205102430000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import { UserInformation } from './components/userInformation'\nimport styles from './page.module.css'\n\nexport default function Home() {\n  return (\n    <main className={styles.main}>\n      <UserInformation />\n    </main>\n  )\n}`, `71451682205102430000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"tsx\"><pre class=\"language-tsx\"><code class=\"language-tsx\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> UserInformation <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'./components/userInformation'</span>\n<span class=\"token keyword\">import</span> styles <span class=\"token keyword\">from</span> <span class=\"token string\">'./page.module.css'</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">function</span> <span class=\"token function\">Home</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>main</span> <span class=\"token attr-name\">className</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>styles<span class=\"token punctuation\">.</span>main<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">UserInformation</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>main</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Now if you try to open <code class=\"language-text\">http://localhost:3000/</code> it will redirect you to <code class=\"language-text\">/auth</code> because we dont have a valid session. But if you sign in to the website it will redirect you to the home page which should look like this:</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/7dd3a5c37e188c60ba7995edd0d641a1/ae953/plain-home.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 81.64556962025317%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAUklEQVQ4y2P4T2XAMGog9Q389+8fSRivgdgUEALoehiQXUWuC5ENxTDw27dv/9+/fw/HHz58QOGD8Nu3b8H479+/2A2kupeRJaji5dGcMrgMBADSiPijFEELKAAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"Home Page\"\n        title=\"Home Page\"\n        src=\"/static/7dd3a5c37e188c60ba7995edd0d641a1/f058b/plain-home.png\"\n        srcset=\"/static/7dd3a5c37e188c60ba7995edd0d641a1/c26ae/plain-home.png 158w,\n/static/7dd3a5c37e188c60ba7995edd0d641a1/6bdcf/plain-home.png 315w,\n/static/7dd3a5c37e188c60ba7995edd0d641a1/f058b/plain-home.png 630w,\n/static/7dd3a5c37e188c60ba7995edd0d641a1/40601/plain-home.png 945w,\n/static/7dd3a5c37e188c60ba7995edd0d641a1/ae953/plain-home.png 1132w\"\n        sizes=\"(max-width: 630px) 100vw, 630px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n  </a>\n    </span></p>\n<h3 id=\"protecting-your-api-routes\" style=\"position:relative;\"><a href=\"#protecting-your-api-routes\" aria-label=\"protecting your api routes permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Protecting your API routes</h3>\n<p>To fetch the user’s email we need to make a network call. We need to make sure that only a user with an active session can fetch their information.</p>\n<p>Start by modifying <code class=\"language-text\">/app/sessionUtils.ts</code>:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"85705993959351370000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import { cookies, headers } from 'next/headers';\n\n// ...\n\nexport async function withSession(\n  request: NextRequest,\n  handler: (session: SessionContainer | undefined) => Promise<NextResponse>,\n  options?: VerifySessionOptions\n) {\n  let { session, nextResponse, baseResponse } = await getSSRSession(request, options);\n  if (nextResponse) {\n      return nextResponse;\n  }\n\n  let userResponse = await handler(session);\n\n  let didAddCookies = false;\n  let didAddHeaders = false;\n\n  for (const respCookie of baseResponse.cookies) {\n      didAddCookies = true;\n      userResponse.headers.append(\n          &quot;Set-Cookie&quot;,\n          serialize(respCookie.key, respCookie.value, {\n              domain: respCookie.domain,\n              expires: new Date(respCookie.expires),\n              httpOnly: respCookie.httpOnly,\n              path: respCookie.path,\n              sameSite: respCookie.sameSite,\n              secure: respCookie.secure,\n          })\n      );\n  }\n\n  baseResponse.headers.forEach((value, key) => {\n      didAddHeaders = true;\n      userResponse.headers.set(key, value);\n  });\n\n  if (didAddCookies || didAddHeaders) {\n      if (!userResponse.headers.has(&quot;Cache-Control&quot;)) {\n          // This is needed for production deployments with Vercel\n          userResponse.headers.set(&quot;Cache-Control&quot;, &quot;no-cache, no-store, max-age=0, must-revalidate&quot;);\n      }\n  }\n\n  return userResponse;\n}`, `85705993959351370000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"ts\"><pre class=\"language-ts\"><code class=\"language-ts\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> cookies<span class=\"token punctuation\">,</span> headers <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'next/headers'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// ...</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">withSession</span><span class=\"token punctuation\">(</span>\n  request<span class=\"token operator\">:</span> NextRequest<span class=\"token punctuation\">,</span>\n  <span class=\"token function-variable function\">handler</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span>session<span class=\"token operator\">:</span> SessionContainer <span class=\"token operator\">|</span> <span class=\"token keyword\">undefined</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token builtin\">Promise</span><span class=\"token operator\">&lt;</span>NextResponse<span class=\"token operator\">></span><span class=\"token punctuation\">,</span>\n  options<span class=\"token operator\">?</span><span class=\"token operator\">:</span> VerifySessionOptions\n<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> <span class=\"token punctuation\">{</span> session<span class=\"token punctuation\">,</span> nextResponse<span class=\"token punctuation\">,</span> baseResponse <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">getSSRSession</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">,</span> options<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>nextResponse<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">return</span> nextResponse<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">let</span> userResponse <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">handler</span><span class=\"token punctuation\">(</span>session<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">let</span> didAddCookies <span class=\"token operator\">=</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">let</span> didAddHeaders <span class=\"token operator\">=</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">const</span> respCookie <span class=\"token keyword\">of</span> baseResponse<span class=\"token punctuation\">.</span>cookies<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      didAddCookies <span class=\"token operator\">=</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">;</span>\n      userResponse<span class=\"token punctuation\">.</span>headers<span class=\"token punctuation\">.</span><span class=\"token function\">append</span><span class=\"token punctuation\">(</span>\n          <span class=\"token string\">\"Set-Cookie\"</span><span class=\"token punctuation\">,</span>\n          <span class=\"token function\">serialize</span><span class=\"token punctuation\">(</span>respCookie<span class=\"token punctuation\">.</span>key<span class=\"token punctuation\">,</span> respCookie<span class=\"token punctuation\">.</span>value<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n              domain<span class=\"token operator\">:</span> respCookie<span class=\"token punctuation\">.</span>domain<span class=\"token punctuation\">,</span>\n              expires<span class=\"token operator\">:</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Date</span><span class=\"token punctuation\">(</span>respCookie<span class=\"token punctuation\">.</span>expires<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n              httpOnly<span class=\"token operator\">:</span> respCookie<span class=\"token punctuation\">.</span>httpOnly<span class=\"token punctuation\">,</span>\n              path<span class=\"token operator\">:</span> respCookie<span class=\"token punctuation\">.</span>path<span class=\"token punctuation\">,</span>\n              sameSite<span class=\"token operator\">:</span> respCookie<span class=\"token punctuation\">.</span>sameSite<span class=\"token punctuation\">,</span>\n              secure<span class=\"token operator\">:</span> respCookie<span class=\"token punctuation\">.</span>secure<span class=\"token punctuation\">,</span>\n          <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  baseResponse<span class=\"token punctuation\">.</span>headers<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>value<span class=\"token punctuation\">,</span> key<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n      didAddHeaders <span class=\"token operator\">=</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">;</span>\n      userResponse<span class=\"token punctuation\">.</span>headers<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span>key<span class=\"token punctuation\">,</span> value<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>didAddCookies <span class=\"token operator\">||</span> didAddHeaders<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>userResponse<span class=\"token punctuation\">.</span>headers<span class=\"token punctuation\">.</span><span class=\"token function\">has</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Cache-Control\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n          <span class=\"token comment\">// This is needed for production deployments with Vercel</span>\n          userResponse<span class=\"token punctuation\">.</span>headers<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Cache-Control\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"no-cache, no-store, max-age=0, must-revalidate\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">return</span> userResponse<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>The <code class=\"language-text\">withSession</code> is a utility function we will use in all our APIs that require sessions, it will get the session if it exists and then call the handler function which will be our actual API logic. To know more about what this function does visit the <a href=\"https://supertokens.com/docs/thirdpartyemailpassword/nextjs/app-directory/session-helpers\" target=\"_blank\" rel=\"nofollow\">official documentation</a></p>\n<p>Lets create a new API route for fetching the user information, create a new file <code class=\"language-text\">/app/api/user/route.ts</code>:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"42762219951376500000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import { NextResponse, NextRequest } from 'next/server';\nimport { withSession } from '../../sessionUtils';\nimport SuperTokens from 'supertokens-node';\n\nexport function GET(request: NextRequest) {\n  return withSession(request, async (session) => {\n    if (!session) {\n      return new NextResponse('Authentication required', { status: 401 });\n    }\n\n    const userId = session.getUserId();\n    const user = await SuperTokens.getUser(userId);\n    \n    if (user === undefined) {\n        return NextResponse.json({\n            email: &quot;not found&quot;,\n        })\n    }\n\n    return NextResponse.json({\n      email: user.emails[0],\n    });\n  })\n}`, `42762219951376500000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"ts\"><pre class=\"language-ts\"><code class=\"language-ts\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> NextResponse<span class=\"token punctuation\">,</span> NextRequest <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'next/server'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> withSession <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'../../sessionUtils'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> SuperTokens <span class=\"token keyword\">from</span> <span class=\"token string\">'supertokens-node'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">function</span> <span class=\"token constant\">GET</span><span class=\"token punctuation\">(</span>request<span class=\"token operator\">:</span> NextRequest<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token function\">withSession</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">,</span> <span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span>session<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>session<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">NextResponse</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Authentication required'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> status<span class=\"token operator\">:</span> <span class=\"token number\">401</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">const</span> userId <span class=\"token operator\">=</span> session<span class=\"token punctuation\">.</span><span class=\"token function\">getUserId</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">const</span> user <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> SuperTokens<span class=\"token punctuation\">.</span><span class=\"token function\">getUser</span><span class=\"token punctuation\">(</span>userId<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    \n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>user <span class=\"token operator\">===</span> <span class=\"token keyword\">undefined</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> NextResponse<span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n            email<span class=\"token operator\">:</span> <span class=\"token string\">\"not found\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">return</span> NextResponse<span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n      email<span class=\"token operator\">:</span> user<span class=\"token punctuation\">.</span>emails<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>We are creating a GET API route for <code class=\"language-text\">/user</code>. This API calls <code class=\"language-text\">withSession</code> because we need an active session to be able to fetch the user’s information. If a session does not exist we return with status <code class=\"language-text\">401</code>.</p>\n<p>We use the session to get the user’s user id and then fetch the user information from SuperTokens.</p>\n<h3 id=\"making-network-requests-that-require-sessions\" style=\"position:relative;\"><a href=\"#making-network-requests-that-require-sessions\" aria-label=\"making network requests that require sessions permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Making network requests that require sessions</h3>\n<p>Now that we have session protection on our frontend route and API route, we need to actually make a network request to fetch the user’s email. Modify the <code class=\"language-text\">/app/components/userInformation.tsx</code> file:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"71477174801829800000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import { getSSRSession } from '../sessionUtils';\nimport { TryRefreshComponent } from './tryRefreshClientComponent';\nimport styles from '../page.module.css';\nimport { redirect } from 'next/navigation'\n\nexport async function UserInformation() {\n  const { session, hasToken } = await getSSRSession();\n\n  if (!session) {\n    if (!hasToken) {\n      redirect('/auth');\n    }\n    return <TryRefreshComponent />;\n  }\n\n  const userEmailResponse = await fetch('http://localhost:3000/api/user', {\n    headers: {\n      Authorization: 'Bearer ' + session.getAccessToken(),\n    },\n  });\n\n  let email = &quot;&quot;;\n\n  if (userEmailResponse.status !== 200) {\n    email = &quot;error with status &quot; + userEmailResponse.status;\n  } else {\n    email = (await userEmailResponse.json()).email;\n  }\n\n  return (\n    <p className={styles.description}>\n      Server side component got userId: {session.getUserId()}<br/>\n      Server side component got email: {email}\n    </p>\n  );\n}`, `71477174801829800000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"tsx\"><pre class=\"language-tsx\"><code class=\"language-tsx\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> getSSRSession <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'../sessionUtils'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> TryRefreshComponent <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'./tryRefreshClientComponent'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> styles <span class=\"token keyword\">from</span> <span class=\"token string\">'../page.module.css'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> redirect <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'next/navigation'</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">UserInformation</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> session<span class=\"token punctuation\">,</span> hasToken <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">getSSRSession</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>session<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>hasToken<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">redirect</span><span class=\"token punctuation\">(</span><span class=\"token string\">'/auth'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">return</span> <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">TryRefreshComponent</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">const</span> userEmailResponse <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span><span class=\"token string\">'http://localhost:3000/api/user'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n    headers<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n      Authorization<span class=\"token operator\">:</span> <span class=\"token string\">'Bearer '</span> <span class=\"token operator\">+</span> session<span class=\"token punctuation\">.</span><span class=\"token function\">getAccessToken</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">let</span> email <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>userEmailResponse<span class=\"token punctuation\">.</span>status <span class=\"token operator\">!==</span> <span class=\"token number\">200</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    email <span class=\"token operator\">=</span> <span class=\"token string\">\"error with status \"</span> <span class=\"token operator\">+</span> userEmailResponse<span class=\"token punctuation\">.</span>status<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n    email <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">await</span> userEmailResponse<span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>email<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>p</span> <span class=\"token attr-name\">className</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>styles<span class=\"token punctuation\">.</span>description<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      Server side component got userId: </span><span class=\"token punctuation\">{</span>session<span class=\"token punctuation\">.</span><span class=\"token function\">getUserId</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>br</span><span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n      Server side component got email: </span><span class=\"token punctuation\">{</span>email<span class=\"token punctuation\">}</span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>p</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>We use <code class=\"language-text\">session.getAccessToken()</code> to get the current access token of the user, we use this token to make a network request to our newly created API.</p>\n<p>Now if you open the home route in your browser you should see something similar to this:</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/501adf6e536b6fb5f0556d81ce415b3d/ae953/logged-in-home.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 81.64556962025317%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAcklEQVQ4y+1TQQoAIQjs/78svGY9wHJZoXAj2YKOCcOgg8OE5PhwuWt4xrDWyo13ofc/CfVwtmTVqE8TjlVKkfnLGmZCbZRS4hACe+8FANB7ROScs3CMUUx/DVsSIhLoRMtPtsTZ8tJRRnHnqvennDd8AKpW900Yym4uAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"Home Page With Email\"\n        title=\"Home Page With Email\"\n        src=\"/static/501adf6e536b6fb5f0556d81ce415b3d/f058b/logged-in-home.png\"\n        srcset=\"/static/501adf6e536b6fb5f0556d81ce415b3d/c26ae/logged-in-home.png 158w,\n/static/501adf6e536b6fb5f0556d81ce415b3d/6bdcf/logged-in-home.png 315w,\n/static/501adf6e536b6fb5f0556d81ce415b3d/f058b/logged-in-home.png 630w,\n/static/501adf6e536b6fb5f0556d81ce415b3d/40601/logged-in-home.png 945w,\n/static/501adf6e536b6fb5f0556d81ce415b3d/ae953/logged-in-home.png 1132w\"\n        sizes=\"(max-width: 630px) 100vw, 630px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n  </a>\n    </span></p>\n<h2 id=\"signing-users-out-of-the-application\" style=\"position:relative;\"><a href=\"#signing-users-out-of-the-application\" aria-label=\"signing users out of the application permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Signing users out of the application</h2>\n<p>We also need to provide a way for users to sign out, luckily SuperTokens provides a very easy way to do this. First lets add a sign out button to the home page, create a new <code class=\"language-text\">/app/components/signOut.tsx</code> file:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"32454532784849000000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`'use client'\n\nimport { useSessionContext } from &quot;supertokens-auth-react/recipe/session&quot;;\nimport { useRouter } from 'next/navigation'\nimport Session from &quot;supertokens-auth-react/recipe/session&quot;;\n\nexport const SignOut = () => {\n    const session = useSessionContext();\n    const router = useRouter();\n\n    if (session.loading === true) {\n        return null;\n    }\n\n    const signOut = async () => {\n        await Session.signOut();\n        router.refresh();\n    }\n\n    return <button onClick={signOut}>Sign out</button>\n}`, `32454532784849000000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"tsx\"><pre class=\"language-tsx\"><code class=\"language-tsx\"><span class=\"token string\">'use client'</span>\n\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> useSessionContext <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"supertokens-auth-react/recipe/session\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> useRouter <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'next/navigation'</span>\n<span class=\"token keyword\">import</span> Session <span class=\"token keyword\">from</span> <span class=\"token string\">\"supertokens-auth-react/recipe/session\"</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">SignOut</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> session <span class=\"token operator\">=</span> <span class=\"token function\">useSessionContext</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">const</span> router <span class=\"token operator\">=</span> <span class=\"token function\">useRouter</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>session<span class=\"token punctuation\">.</span>loading <span class=\"token operator\">===</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">signOut</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">await</span> Session<span class=\"token punctuation\">.</span><span class=\"token function\">signOut</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        router<span class=\"token punctuation\">.</span><span class=\"token function\">refresh</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">return</span> <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>button</span> <span class=\"token attr-name\">onClick</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>signOut<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">Sign out</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>button</span><span class=\"token punctuation\">></span></span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>This is a client component that will render a button to sign out if a session exists. We then use <code class=\"language-text\">Session.signOut()</code> to call the sign out API and then refresh the page. In this example we refresh the page because we want to demonstrate that the user would get redirected to the login page without a valid session, you can redirect to <code class=\"language-text\">/auth</code> directly if you prefer.</p>\n<p>Add the <code class=\"language-text\">SignOut</code> component to the home page:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"14769145852419596000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`return (\n    <div>\n        <div>\n            <p className={styles.description}>\n            Server side component got userId: {session.getUserId()}<br/>\n            Server side component got email: {email}\n            </p>\n        </div>\n        <SignOut/>\n    </div>\n);`, `14769145852419596000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"tsx\"><pre class=\"language-tsx\"><code class=\"language-tsx\"><span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n            </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>p</span> <span class=\"token attr-name\">className</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>styles<span class=\"token punctuation\">.</span>description<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n            Server side component got userId: </span><span class=\"token punctuation\">{</span>session<span class=\"token punctuation\">.</span><span class=\"token function\">getUserId</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>br</span><span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n            Server side component got email: </span><span class=\"token punctuation\">{</span>email<span class=\"token punctuation\">}</span><span class=\"token plain-text\">\n            </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>p</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">SignOut</span></span><span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2 id=\"conclusion\" style=\"position:relative;\"><a href=\"#conclusion\" aria-label=\"conclusion permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Conclusion</h2>\n<p>And thats it, our Next.js app has SuperTokens set up with frontend and api routes being exposed by the SDKs and we now have our custom API and frontend routes protected to require sessions.</p>\n<p>This example was just a basic use case for what you can do with SuperTokens, to know more or to learn how to use other features and recipes of SuperTokens visit their <a href=\"https://supertokens.com/docs\" target=\"_blank\" rel=\"nofollow\">official SuperTokens documentation</a>.</p>\n<p>To learn more about Next.js visit the <a href=\"https://nextjs.org/docs\" target=\"_blank\" rel=\"nofollow\">Next.js documentation</a></p>","frontmatter":{"date":"August 19, 2024","title":"Securing your Next.js with Authentication","cover":"adding-login-to-your-nextjs-app-using-the-app-directory-and-supertokens.png","author":"Dejan Lukic","description":"This blog explains how to setup email password and social login with SuperTokens in Next.js."},"fields":{"slug":"/adding-login-to-your-nextjs-app-using-the-app-directory-and-supertokens/"}},"site":{"siteMetadata":{"title":"SuperTokens Blog"}}},"pageContext":{"id":"4ba8268f-60e7-55fc-8617-a99933f12dcf","fields__slug":"/adding-login-to-your-nextjs-app-using-the-app-directory-and-supertokens/","__params":{"fields__slug":"adding-login-to-your-nextjs-app-using-the-app-directory-and-supertokens"}}},
    "staticQueryHashes": []}