{
    "componentChunkName": "component---src-pages-blog-markdown-remark-fields-slug-js",
    "path": "/blog/supertokens-on-vercel",
    "result": {"data":{"markdownRemark":{"html":"<p>This comprehensive walkthrough covers integrating SuperTokens authentication into a Next.js project hosted on Vercel, including local\nsetup, API route configuration, serverless deployment considerations, and complete authentication flow implementation.</p>\n<h2 id=\"why-use-supertokens-on-vercel\" style=\"position:relative;\"><a href=\"#why-use-supertokens-on-vercel\" aria-label=\"why use supertokens on vercel 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><strong>Why Use SuperTokens on Vercel?</strong></h2>\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/8e9565761146547f3e087972a815cdec/d2f5c/Supertokens.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: 40.50632911392405%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABw0lEQVQoz22R227TQBRFLUHisWd8m7HH1zg4tEl6SRu1VSmItgLStERNQVRcPqz/uxBG8IB4WNJ52UvnnO2cdRmvpznnizm74xG1ienShL0q75nWBW2RY9MUrTVplmHSlDzPMcZgM0tZljw9PbFer3GWTcK0iGjTiCoOeZGEHGQRJzbmVWM5HVcclIZJXVHVDUlqUZEhiA0yiJBKIaUkyzKiKMKZpAFNIkkDH6N8mlCymygOteJ62vFmPuFip+Fssc/i6Ji22yXUOSqxyFDjSYUQHoPBANd1cbJQogOfQPooT2B8jzYOmFnN4807vm9WbD9csb1bcb/5yGp9RzuZYfIGFaf4KsTzfXzf63GU7yF9D0+I3zx/xnJvxqf1iuuTAx5v3vLj/j3fHm55fNjwsN3y+ctXjk/O+9NVGDN0XbTOmLzcx+klnocQol9ZuC6BJxhZw2FXcj4ruVyMuFpOuDydc3F6xHw+p6xHJMaigojhcIi1OYeLJY74VygEQrgkUlAkiq5ImDaGvbFl2uaMbMK4spRFgdYGpVSf+VVMHEf/Ebqin2MxQAeScVXQNSU7bc24Log8l0YH5JkmiYK/7/qT/wkyVtDYmWgGSQAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"Supertokens\"\n        title=\"Supertokens\"\n        src=\"/static/8e9565761146547f3e087972a815cdec/f058b/Supertokens.png\"\n        srcset=\"/static/8e9565761146547f3e087972a815cdec/c26ae/Supertokens.png 158w,\n/static/8e9565761146547f3e087972a815cdec/6bdcf/Supertokens.png 315w,\n/static/8e9565761146547f3e087972a815cdec/f058b/Supertokens.png 630w,\n/static/8e9565761146547f3e087972a815cdec/40601/Supertokens.png 945w,\n/static/8e9565761146547f3e087972a815cdec/78612/Supertokens.png 1260w,\n/static/8e9565761146547f3e087972a815cdec/d2f5c/Supertokens.png 1363w\"\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>SuperTokens paired with Vercel creates a powerful authentication solution that balances developer experience with production-grade\nsecurity.</p>\n<ul>\n<li><strong>Free-tier friendly and open-source</strong> makes SuperTokens accessible for projects at any scale. Vercel provides one production URL per app and one unique inspect URL per deployment, and SuperTokens works seamlessly with this dynamic URL structure. The open-source nature ensures transparency and eliminates vendor lock-in concerns while providing enterprise-grade authentication capabilities.</li>\n<li><strong>Native Next.js API route integration</strong> means SuperTokens functions as a standard Next.js serverless API without requiring separate backend infrastructure. The authentication logic runs within Next.js API routes, simplifying deployment and reducing operational complexity compared to managing separate authentication services.</li>\n<li><strong>Comprehensive authentication features</strong> include multi-tenancy support, passwordless authentication, social login integration, email/password authentication, and custom authentication flows. Organizations can start with basic authentication and progressively add capabilities as requirements evolve.</li>\n<li><strong>Built-in security features</strong> provide protection against common attack vectors, including token theft detection, CSRF protection, session hijacking prevention, and secure cookie handling. These security mechanisms work automatically without requiring manual security implementation or maintenance.</li>\n</ul>\n<h2 id=\"prerequisites\" style=\"position:relative;\"><a href=\"#prerequisites\" aria-label=\"prerequisites 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><strong>Prerequisites</strong></h2>\n<p>Before beginning implementation, ensure the following tools and accounts are available:</p>\n<p><strong>Development environment requirements:</strong></p>\n<ul>\n<li>Node.js (version 14 or later recommended)</li>\n<li>Code editor (Visual Studio Code recommended)</li>\n<li>Basic familiarity with React and Next.js concepts</li>\n</ul>\n<p><strong>Deployment requirements:</strong></p>\n<ul>\n<li>GitHub account for code repository hosting</li>\n<li>Vercel account (free tier sufficient for getting started)</li>\n<li>SuperTokens Core instance (self-hosted or managed service)</li>\n</ul>\n<p><strong>Configuration preparation:</strong></p>\n<ul>\n<li>Environment variable management for development and production</li>\n<li>Understanding of API routes in Next.js</li>\n<li>Basic knowledge of authentication concepts</li>\n</ul>\n<h2 id=\"step-1----bootstrap-a-nextjs-project\" style=\"position:relative;\"><a href=\"#step-1----bootstrap-a-nextjs-project\" aria-label=\"step 1    bootstrap a 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><strong>Step 1 — Bootstrap a Next.js Project</strong></h2>\n<p>Create a new Next.js project or use an existing application as the foundation for SuperTokens integration:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"23028412836805034000\"\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@latest supertokens-vercel-demo                                                                                      \n cd supertokens-vercel-demo                                            `, `23028412836805034000`)\"\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=\"js\"><pre class=\"language-js\"><code class=\"language-js\"> npx create<span class=\"token operator\">-</span>next<span class=\"token operator\">-</span>app@latest supertokens<span class=\"token operator\">-</span>vercel<span class=\"token operator\">-</span>demo                                                                                      \n cd supertokens<span class=\"token operator\">-</span>vercel<span class=\"token operator\">-</span>demo                                            </code></pre></div>\n<p>The Next.js CLI prompts for configuration options. For SuperTokens\ncompatibility, select the following:</p>\n<ul>\n<li>TypeScript: Yes (recommended for type safety)</li>\n<li>ESLint: Yes</li>\n<li>Tailwind CSS: Optional (based on styling preferences)</li>\n<li>App Router: Yes (modern Next.js routing approach)</li>\n</ul>\n<p><strong>Install SuperTokens SDKs</strong> for both backend and frontend integration:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"92657949446699710000\"\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 install supertokens-node supertokens-auth-react`, `92657949446699710000`)\"\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=\"js\"><pre class=\"language-js\"><code class=\"language-js\">  npm install supertokens<span class=\"token operator\">-</span>node supertokens<span class=\"token operator\">-</span>auth<span class=\"token operator\">-</span>react</code></pre></div>\n<p>These packages provide the core authentication functionality:</p>\n<ul>\n<li><code class=\"language-text\">supertokens-node</code>: Backend SDK for API routes and session management</li>\n<li><code class=\"language-text\">supertokens-auth-react</code>: Frontend components and React integration</li>\n</ul>\n<h2 id=\"step-2----set-up-supertokens-backend\" style=\"position:relative;\"><a href=\"#step-2----set-up-supertokens-backend\" aria-label=\"step 2    set up supertokens backend 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><strong>Step 2 — Set Up SuperTokens Backend</strong></h2>\n<p>Create the authentication API route handler that processes all SuperTokens backend operations.</p>\n<p><strong>For App Router (Next.js 13+)</strong>, create <code class=\"language-text\">src/app/api/auth/[[...path]]/route.ts</code>:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"50458935970364170000\"\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(`// src/app/api/auth/[[...path]]/route.ts\nimport { getAppDirRequestHandler } from &quot;supertokens-node/nextjs&quot;;\nimport { NextRequest } from &quot;next/server&quot;;\nimport { ensureSuperTokensInit } from &quot;@/app/config/backend&quot;;\n\n\nensureSuperTokensInit();\n\n\nconst handleCall = getAppDirRequestHandler();\n\n\nexport async function GET(req: NextRequest) {\n  const res = await handleCall(req);\n  if (!res.headers.has(&quot;Cache-Control&quot;)) {\n    res.headers.set(\n      &quot;Cache-Control&quot;,\n      &quot;no-cache, no-store, max-age=0, must-revalidate&quot;\n    );\n  }\n  return res;\n}\nexport const POST = handleCall;\nexport const PUT = handleCall;\nexport const DELETE = handleCall;\nexport const PATCH = handleCall;\nexport const HEAD = handleCall;\n`, `50458935970364170000`)\"\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=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// src/app/api/auth/[[...path]]/route.ts</span>\n<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> <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\">\"@/app/config/backend\"</span><span class=\"token punctuation\">;</span>\n\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\n<span class=\"token keyword\">const</span> handleCall <span class=\"token operator\">=</span> <span class=\"token function\">getAppDirRequestHandler</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\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><span class=\"token parameter\"><span class=\"token literal-property property\">req</span><span class=\"token operator\">:</span> NextRequest</span><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>req<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    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><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<span class=\"token keyword\">export</span> <span class=\"token keyword\">const</span> <span class=\"token constant\">POST</span> <span class=\"token operator\">=</span> handleCall<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">const</span> <span class=\"token constant\">PUT</span> <span class=\"token operator\">=</span> handleCall<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">const</span> <span class=\"token constant\">DELETE</span> <span class=\"token operator\">=</span> handleCall<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">const</span> <span class=\"token constant\">PATCH</span> <span class=\"token operator\">=</span> handleCall<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">const</span> <span class=\"token constant\">HEAD</span> <span class=\"token operator\">=</span> handleCall<span class=\"token punctuation\">;</span>\n</code></pre></div>\n<p>This file acts as a proxy route — it passes all authentication requests to the SuperTokens backend handler.</p>\n<p>By mapping all HTTP methods (GET, POST, etc.) to <code class=\"language-text\">handleCall</code>, we ensure every auth-related request is handled correctly.</p>\n<p><strong>Create backend configuration</strong> at <code class=\"language-text\">src/app/config/backend.ts</code>:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"80730374283274080000\"\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(`// src/app/config/backend.ts\n\n\nimport SuperTokens from &quot;supertokens-node&quot;;\nimport EmailPassword from &quot;supertokens-node/recipe/emailpassword&quot;;\nimport Session from &quot;supertokens-node/recipe/session&quot;;\nimport { TypeInput } from &quot;supertokens-node/types&quot;;\n\n\nexport const backendConfig = (): TypeInput => {\n  const apiDomain = process.env.VERCEL_URL\n    ? \\`https://\\${process.env.VERCEL_URL}\\`\n    : process.env.NEXT_PUBLIC_API_DOMAIN || &quot;http://localhost:3000&quot;;\n\n\n  const websiteDomain = process.env.VERCEL_URL\n    ? \\`https://\\${process.env.VERCEL_URL}\\`\n    : process.env.NEXT_PUBLIC_WEBSITE_DOMAIN || &quot;http://localhost:3000&quot;;\n\n\n  return {\n    appInfo: {\n      appName: &quot;SuperTokens Vercel Demo&quot;,\n      apiDomain,\n      websiteDomain,\n      apiBasePath: &quot;/api/auth&quot;,\n      websiteBasePath: &quot;/auth&quot;,\n    },\n    supertokens: {\n      connectionURI:\n        process.env.SUPERTOKENS_CONNECTION_URI || &quot;https://try.supertokens.io&quot;,\n      apiKey: process.env.SUPERTOKENS_API_KEY,\n    },\n    recipeList: [\n      EmailPassword.init(),\n      Session.init({\n        cookieSameSite: &quot;lax&quot;,\n        cookieSecure: process.env.NODE_ENV === &quot;production&quot;,\n      }),\n    ],\n  };\n};\n\n\nexport function ensureSuperTokensInit() {\n  try {\n    SuperTokens.init(backendConfig());\n  } catch (err: unknown) {\n    const msg = String((err as Error).message || &quot;&quot;);\n    if (!/already initiali/i.test(msg)) {\n      throw err;\n    }\n  }\n}`, `80730374283274080000`)\"\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=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// src/app/config/backend.ts</span>\n\n\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<span class=\"token keyword\">import</span> EmailPassword <span class=\"token keyword\">from</span> <span class=\"token string\">\"supertokens-node/recipe/emailpassword\"</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\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> <span class=\"token parameter\">TypeInput</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> apiDomain <span class=\"token operator\">=</span> process<span class=\"token punctuation\">.</span>env<span class=\"token punctuation\">.</span><span class=\"token constant\">VERCEL_URL</span>\n    <span class=\"token operator\">?</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">https://</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>process<span class=\"token punctuation\">.</span>env<span class=\"token punctuation\">.</span><span class=\"token constant\">VERCEL_URL</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span>\n    <span class=\"token operator\">:</span> process<span class=\"token punctuation\">.</span>env<span class=\"token punctuation\">.</span><span class=\"token constant\">NEXT_PUBLIC_API_DOMAIN</span> <span class=\"token operator\">||</span> <span class=\"token string\">\"http://localhost:3000\"</span><span class=\"token punctuation\">;</span>\n\n\n  <span class=\"token keyword\">const</span> websiteDomain <span class=\"token operator\">=</span> process<span class=\"token punctuation\">.</span>env<span class=\"token punctuation\">.</span><span class=\"token constant\">VERCEL_URL</span>\n    <span class=\"token operator\">?</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">https://</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>process<span class=\"token punctuation\">.</span>env<span class=\"token punctuation\">.</span><span class=\"token constant\">VERCEL_URL</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span>\n    <span class=\"token operator\">:</span> process<span class=\"token punctuation\">.</span>env<span class=\"token punctuation\">.</span><span class=\"token constant\">NEXT_PUBLIC_WEBSITE_DOMAIN</span> <span class=\"token operator\">||</span> <span class=\"token string\">\"http://localhost:3000\"</span><span class=\"token punctuation\">;</span>\n\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token literal-property property\">appInfo</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token literal-property property\">appName</span><span class=\"token operator\">:</span> <span class=\"token string\">\"SuperTokens Vercel Demo\"</span><span class=\"token punctuation\">,</span>\n      apiDomain<span class=\"token punctuation\">,</span>\n      websiteDomain<span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">apiBasePath</span><span class=\"token operator\">:</span> <span class=\"token string\">\"/api/auth\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">websiteBasePath</span><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>\n    <span class=\"token literal-property property\">supertokens</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token literal-property property\">connectionURI</span><span class=\"token operator\">:</span>\n        process<span class=\"token punctuation\">.</span>env<span class=\"token punctuation\">.</span><span class=\"token constant\">SUPERTOKENS_CONNECTION_URI</span> <span class=\"token operator\">||</span> <span class=\"token string\">\"https://try.supertokens.io\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">apiKey</span><span class=\"token operator\">:</span> process<span class=\"token punctuation\">.</span>env<span class=\"token punctuation\">.</span><span class=\"token constant\">SUPERTOKENS_API_KEY</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token literal-property property\">recipeList</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n      EmailPassword<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      Session<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 literal-property property\">cookieSameSite</span><span class=\"token operator\">:</span> <span class=\"token string\">\"lax\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token literal-property property\">cookieSecure</span><span class=\"token operator\">:</span> process<span class=\"token punctuation\">.</span>env<span class=\"token punctuation\">.</span><span class=\"token constant\">NODE_ENV</span> <span class=\"token operator\">===</span> <span class=\"token string\">\"production\"</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 punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n\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\">try</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  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span>err<span class=\"token operator\">:</span> unknown<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> msg <span class=\"token operator\">=</span> <span class=\"token function\">String</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>err <span class=\"token keyword\">as</span> Error<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>message <span class=\"token operator\">||</span> <span class=\"token string\">\"\"</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><span class=\"token regex\"><span class=\"token regex-delimiter\">/</span><span class=\"token regex-source language-regex\">already initiali</span><span class=\"token regex-delimiter\">/</span><span class=\"token regex-flags\">i</span></span><span class=\"token punctuation\">.</span><span class=\"token function\">test</span><span class=\"token punctuation\">(</span>msg<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</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>This configuration initializes SuperTokens with email/password authentication and session management. The <code class=\"language-text\">appInfo</code> object uses environment variables for dynamic URL configuration essential for Vercel deployments.</p>\n<h2 id=\"step-3----create-supertokens-frontend-wrapper\" style=\"position:relative;\"><a href=\"#step-3----create-supertokens-frontend-wrapper\" aria-label=\"step 3    create supertokens frontend wrapper 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><strong>Step 3 — Create SuperTokens Frontend Wrapper</strong></h2>\n<p>Frontend integration connects React components with SuperTokens authentication backend.</p>\n<p><strong>Configure frontend</strong> at <code class=\"language-text\">src/app/config/frontend.ts</code>:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"11448959390809477000\"\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(`// src/app/config/frontend.ts\nimport EmailPasswordReact from &quot;supertokens-auth-react/recipe/emailpassword&quot;;\nimport SessionReact from &quot;supertokens-auth-react/recipe/session&quot;;\n\n\nexport const frontendConfig = () => {\n  return {\n    appInfo: {\n      appName: &quot;SuperTokens Vercel Demo&quot;,\n      apiDomain: process.env.NEXT_PUBLIC_API_DOMAIN || &quot;http://localhost:3000&quot;,\n      websiteDomain: process.env.NEXT_PUBLIC_WEBSITE_DOMAIN || &quot;http://localhost:3000&quot;,\n      apiBasePath: &quot;/api/auth&quot;,\n      websiteBasePath: &quot;/auth&quot;,\n    },\n    recipeList: [\n      EmailPasswordReact.init(),\n      SessionReact.init(),\n    ],\n  };\n};`, `11448959390809477000`)\"\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=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// src/app/config/frontend.ts</span>\n<span class=\"token keyword\">import</span> EmailPasswordReact <span class=\"token keyword\">from</span> <span class=\"token string\">\"supertokens-auth-react/recipe/emailpassword\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> SessionReact <span class=\"token keyword\">from</span> <span class=\"token string\">\"supertokens-auth-react/recipe/session\"</span><span class=\"token punctuation\">;</span>\n\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">frontendConfig</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\">return</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token literal-property property\">appInfo</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token literal-property property\">appName</span><span class=\"token operator\">:</span> <span class=\"token string\">\"SuperTokens Vercel Demo\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">apiDomain</span><span class=\"token operator\">:</span> process<span class=\"token punctuation\">.</span>env<span class=\"token punctuation\">.</span><span class=\"token constant\">NEXT_PUBLIC_API_DOMAIN</span> <span class=\"token operator\">||</span> <span class=\"token string\">\"http://localhost:3000\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">websiteDomain</span><span class=\"token operator\">:</span> process<span class=\"token punctuation\">.</span>env<span class=\"token punctuation\">.</span><span class=\"token constant\">NEXT_PUBLIC_WEBSITE_DOMAIN</span> <span class=\"token operator\">||</span> <span class=\"token string\">\"http://localhost:3000\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">apiBasePath</span><span class=\"token operator\">:</span> <span class=\"token string\">\"/api/auth\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">websiteBasePath</span><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>\n    <span class=\"token literal-property property\">recipeList</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n      EmailPasswordReact<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      SessionReact<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></code></pre></div>\n<p><strong>Wrap application</strong> in <code class=\"language-text\">src/app/layout.tsx</code>:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"94149769976833620000\"\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(`// src/app/layout.tsx\n&quot;use client&quot;;\nimport React from &quot;react&quot;;\nimport SuperTokensReact from &quot;supertokens-auth-react&quot;;\nimport { SuperTokensWrapper } from &quot;supertokens-auth-react&quot;;\nimport { frontendConfig } from &quot;./config/frontend&quot;;\n\n\nif (\n  typeof window !== &quot;undefined&quot; &&\n  !(globalThis as unknown as { __supertokens_initialized: boolean })\n    .__supertokens_initialized\n) {\n  SuperTokensReact.init(frontendConfig());\n  (\n    globalThis as unknown as { __supertokens_initialized: boolean }\n  ).__supertokens_initialized = true;\n}\n\n\nexport default function RootLayout({\n  children,\n}: {\n  children: React.ReactNode;\n}) {\n  return (\n    <html lang=&quot;en&quot;>\n      <body>\n        <SuperTokensWrapper>{children}</SuperTokensWrapper>\n      </body>\n    </html>\n  );\n}`, `94149769976833620000`)\"\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=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// src/app/layout.tsx</span>\n<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> 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> 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> <span class=\"token punctuation\">{</span> frontendConfig <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"./config/frontend\"</span><span class=\"token punctuation\">;</span>\n\n\n<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>\n  <span class=\"token keyword\">typeof</span> window <span class=\"token operator\">!==</span> <span class=\"token string\">\"undefined\"</span> <span class=\"token operator\">&amp;&amp;</span>\n  <span class=\"token operator\">!</span><span class=\"token punctuation\">(</span>globalThis <span class=\"token keyword\">as</span> unknown <span class=\"token keyword\">as</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">__supertokens_initialized</span><span class=\"token operator\">:</span> boolean <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span>__supertokens_initialized\n<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</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    globalThis <span class=\"token keyword\">as</span> unknown <span class=\"token keyword\">as</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">__supertokens_initialized</span><span class=\"token operator\">:</span> boolean <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>__supertokens_initialized <span class=\"token operator\">=</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\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 parameter\"><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  <span class=\"token literal-property property\">children</span><span class=\"token operator\">:</span> React<span class=\"token punctuation\">.</span>ReactNode<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></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 operator\">&lt;</span>html lang<span class=\"token operator\">=</span><span class=\"token string\">\"en\"</span><span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>body<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>SuperTokensWrapper<span class=\"token operator\">></span><span class=\"token punctuation\">{</span>children<span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>SuperTokensWrapper<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>body<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>html<span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p><strong>Add authentication routing component</strong> at <code class=\"language-text\">src/app/auth/page.tsx</code>:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"17121586558361512000\"\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\n\nimport React, { useEffect, useState } from &quot;react&quot;;\nimport &quot;@/app/config/supertokens-init&quot;;\nimport { AuthPage } from &quot;supertokens-auth-react/ui&quot;;\nimport { EmailPasswordPreBuiltUI } from &quot;supertokens-auth-react/recipe/emailpassword/prebuiltui&quot;;\n\n\nexport const dynamic = &quot;force-dynamic&quot;;\n\n\nexport default function AuthPageWrapper() {\n  const [ready, setReady] = useState(false);\n\n\n  useEffect(() => {\n    setReady(true);\n  }, []);\n\n\n  if (!ready) return null;\n\n\n  return <AuthPage preBuiltUIList={[EmailPasswordPreBuiltUI]} />;\n}`, `17121586558361512000`)\"\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=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token string\">\"use client\"</span><span class=\"token punctuation\">;</span>\n\n\n<span class=\"token keyword\">import</span> React<span class=\"token punctuation\">,</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 string\">\"@/app/config/supertokens-init\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> AuthPage <span class=\"token punctuation\">}</span> <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> EmailPasswordPreBuiltUI <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"supertokens-auth-react/recipe/emailpassword/prebuiltui\"</span><span class=\"token punctuation\">;</span>\n\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">const</span> dynamic <span class=\"token operator\">=</span> <span class=\"token string\">\"force-dynamic\"</span><span class=\"token punctuation\">;</span>\n\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">function</span> <span class=\"token function\">AuthPageWrapper</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>ready<span class=\"token punctuation\">,</span> setReady<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\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 function\">setReady</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><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>ready<span class=\"token punctuation\">)</span> <span class=\"token keyword\">return</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>\n\n\n  <span class=\"token keyword\">return</span> <span class=\"token operator\">&lt;</span>AuthPage preBuiltUIList<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">[</span>EmailPasswordPreBuiltUI<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>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>This component renders SuperTokens pre-built authentication UI, including login, signup, password reset, and email verification flows.</p>\n<p><strong>Protected Route Example</strong></p>\n<p><strong>File: <code class=\"language-text\">src/app/protected/page.tsx</code></strong></p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"81965315855192050000\"\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(`//src/app/protected/page.tsx\n&quot;use client&quot;;\nimport { useEffect, useState } from &quot;react&quot;;\nimport Session from &quot;supertokens-auth-react/recipe/session&quot;;\n\n\nexport default function ProtectedPage() {\n  const [userId, setUserId] = useState<string | null>(null);\n\n\n  useEffect(() => {\n    const check = async () => {\n      try {\n        const s = await Session.getAccessTokenPayloadSecurely();\n        // If session exists, getUserId from accessToken payload or call protected API.\n        setUserId(s?.sub || &quot;signed-in&quot;);\n      } catch {\n        setUserId(null);\n      }\n    };\n    check();\n  }, []);\n\n\n  if (userId === null)\n    return (\n      <div>\n        Not signed in. Go to <a href=&quot;/auth&quot;>/auth</a>\n      </div>\n    );\n  return <div>Signed in. userId: {String(userId)}</div>;\n}`, `81965315855192050000`)\"\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=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">//src/app/protected/page.tsx</span>\n<span class=\"token string\">\"use client\"</span><span class=\"token punctuation\">;</span>\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> Session <span class=\"token keyword\">from</span> <span class=\"token string\">\"supertokens-auth-react/recipe/session\"</span><span class=\"token punctuation\">;</span>\n\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">function</span> <span class=\"token function\">ProtectedPage</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>userId<span class=\"token punctuation\">,</span> setUserId<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> useState<span class=\"token operator\">&lt;</span>string <span class=\"token operator\">|</span> <span class=\"token keyword\">null</span><span class=\"token operator\">></span><span class=\"token punctuation\">(</span><span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\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\">const</span> <span class=\"token function-variable function\">check</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\">try</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">const</span> s <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> Session<span class=\"token punctuation\">.</span><span class=\"token function\">getAccessTokenPayloadSecurely</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token comment\">// If session exists, getUserId from accessToken payload or call protected API.</span>\n        <span class=\"token function\">setUserId</span><span class=\"token punctuation\">(</span>s<span class=\"token operator\">?.</span>sub <span class=\"token operator\">||</span> <span class=\"token string\">\"signed-in\"</span><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>\n        <span class=\"token function\">setUserId</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">null</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 function\">check</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><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>userId <span class=\"token operator\">===</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n      <span class=\"token operator\">&lt;</span>div<span class=\"token operator\">></span>\n        Not signed <span class=\"token keyword\">in</span><span class=\"token punctuation\">.</span> Go to <span class=\"token operator\">&lt;</span>a href<span class=\"token operator\">=</span><span class=\"token string\">\"/auth\"</span><span class=\"token operator\">></span><span class=\"token operator\">/</span>auth<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>a<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">return</span> <span class=\"token operator\">&lt;</span>div<span class=\"token operator\">></span>Signed <span class=\"token keyword\">in</span><span class=\"token punctuation\">.</span> userId<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span><span class=\"token function\">String</span><span class=\"token punctuation\">(</span>userId<span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>This page checks if a valid session exists. If not signed in → redirects user to <code class=\"language-text\">/auth</code>.</p>\n<p>If signed in → displays their <code class=\"language-text\">userId</code> or token payload.</p>\n<p><strong>Initialize SuperTokens (Client Side)</strong></p>\n<p><strong>File: <code class=\"language-text\">src/app/config/supertokens-init.ts</code></strong></p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"27449664299834220000\"\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(`//src/app/config/supertokens-init.ts\n&quot;use client&quot;;\n\n\nimport SuperTokensReact from &quot;supertokens-auth-react&quot;;\nimport { frontendConfig } from &quot;./frontend&quot;;\n\n\nif (typeof window !== &quot;undefined&quot;) {\n  if (!SuperTokensReact.isRecipeInitialized(&quot;emailpassword&quot;)) {\n    SuperTokensReact.init(frontendConfig());\n  }\n}`, `27449664299834220000`)\"\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=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">//src/app/config/supertokens-init.ts</span>\n<span class=\"token string\">\"use client\"</span><span class=\"token punctuation\">;</span>\n\n\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> <span class=\"token keyword\">from</span> <span class=\"token string\">\"./frontend\"</span><span class=\"token punctuation\">;</span>\n\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\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>SuperTokensReact<span class=\"token punctuation\">.</span><span class=\"token function\">isRecipeInitialized</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"emailpassword\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</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<span class=\"token punctuation\">}</span></code></pre></div>\n<p>This lightweight script ensures SuperTokens is properly initialized when the app runs in the browser.</p>\n<p><strong>Home Page Links</strong></p>\n<p><strong>File: <code class=\"language-text\">src/app/page.tsx</code></strong></p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"7335561762471143000\"\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(`// src/app/page.tsx\nimport Link from &quot;next/link&quot;;\n\n\nexport default function Home() {\n  return (\n    <main style={{ padding: 24 }}>\n      <h1>SuperTokens Demo</h1>\n      <ul>\n        <li><Link href=&quot;/auth&quot;>Auth UI</Link></li>\n        <li><Link href=&quot;/protected&quot;>Protected (client)</Link></li>\n      </ul>\n    </main>\n  );\n}`, `7335561762471143000`)\"\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=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// src/app/page.tsx</span>\n<span class=\"token keyword\">import</span> Link <span class=\"token keyword\">from</span> <span class=\"token string\">\"next/link\"</span><span class=\"token punctuation\">;</span>\n\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 operator\">&lt;</span>main style<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">padding</span><span class=\"token operator\">:</span> <span class=\"token number\">24</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span><span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>h1<span class=\"token operator\">></span>SuperTokens Demo<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>h1<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>ul<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>li<span class=\"token operator\">></span><span class=\"token operator\">&lt;</span>Link href<span class=\"token operator\">=</span><span class=\"token string\">\"/auth\"</span><span class=\"token operator\">></span>Auth <span class=\"token constant\">UI</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Link<span class=\"token operator\">></span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>li<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>li<span class=\"token operator\">></span><span class=\"token operator\">&lt;</span>Link href<span class=\"token operator\">=</span><span class=\"token string\">\"/protected\"</span><span class=\"token operator\">></span><span class=\"token function\">Protected</span> <span class=\"token punctuation\">(</span>client<span class=\"token punctuation\">)</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Link<span class=\"token operator\">></span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>li<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>ul<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>main<span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"step-4----configure-environment-variables\" style=\"position:relative;\"><a href=\"#step-4----configure-environment-variables\" aria-label=\"step 4    configure environment variables 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><strong>Step 4 — Configure Environment Variables</strong></h2>\n<p>Vercel provides the VERCEL_URL environment variable to the backend, which points to the current URL that the app is deployed on. This enables SuperTokens to work across development, preview, and production environments.</p>\n<p><strong>Local development</strong> configuration in <code class=\"language-text\">.env.local</code>:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"48309089949535470000\"\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(`SUPERTOKENS_CONNECTION_URI=https://try.supertokens.io\nSUPERTOKENS_API_KEY=\nNEXT_PUBLIC_API_DOMAIN=http://localhost:3000\nNEXT_PUBLIC_WEBSITE_DOMAIN=http://localhost:3000`, `48309089949535470000`)\"\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=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token constant\">SUPERTOKENS_CONNECTION_URI</span><span class=\"token operator\">=</span>https<span class=\"token operator\">:</span><span class=\"token operator\">/</span><span class=\"token operator\">/</span><span class=\"token keyword\">try</span><span class=\"token punctuation\">.</span>supertokens<span class=\"token punctuation\">.</span>io\n<span class=\"token constant\">SUPERTOKENS_API_KEY</span><span class=\"token operator\">=</span>\n<span class=\"token constant\">NEXT_PUBLIC_API_DOMAIN</span><span class=\"token operator\">=</span>http<span class=\"token operator\">:</span><span class=\"token operator\">/</span><span class=\"token operator\">/</span>localhost<span class=\"token operator\">:</span><span class=\"token number\">3000</span>\n<span class=\"token constant\">NEXT_PUBLIC_WEBSITE_DOMAIN</span><span class=\"token operator\">=</span>http<span class=\"token operator\">:</span><span class=\"token operator\">/</span><span class=\"token operator\">/</span>localhost<span class=\"token operator\">:</span><span class=\"token number\">3000</span></code></pre></div>\n<p><strong>Production environment</strong> variables in the Vercel dashboard:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"44658972101609450000\"\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(`SUPERTOKENS_CONNECTION_URI=PRODUCTION_CONNECTION_URI\nSUPERTOKENS_API_KEY=your_production_api_key\nNEXT_PUBLIC_API_DOMAIN=https://your-app.vercel.app\nNEXT_PUBLIC_WEBSITE_DOMAIN=https://your-app.vercel.app`, `44658972101609450000`)\"\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=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token constant\">SUPERTOKENS_CONNECTION_URI</span><span class=\"token operator\">=</span><span class=\"token constant\">PRODUCTION_CONNECTION_URI</span>\n<span class=\"token constant\">SUPERTOKENS_API_KEY</span><span class=\"token operator\">=</span>your_production_api_key\n<span class=\"token constant\">NEXT_PUBLIC_API_DOMAIN</span><span class=\"token operator\">=</span>https<span class=\"token operator\">:</span><span class=\"token operator\">/</span><span class=\"token operator\">/</span>your<span class=\"token operator\">-</span>app<span class=\"token punctuation\">.</span>vercel<span class=\"token punctuation\">.</span>app\n<span class=\"token constant\">NEXT_PUBLIC_WEBSITE_DOMAIN</span><span class=\"token operator\">=</span>https<span class=\"token operator\">:</span><span class=\"token operator\">/</span><span class=\"token operator\">/</span>your<span class=\"token operator\">-</span>app<span class=\"token punctuation\">.</span>vercel<span class=\"token punctuation\">.</span>app</code></pre></div>\n<p>For managed SuperTokens hosting, replace the <code class=\"language-text\">SUPERTOKENS_CONNECTION_URI</code> with your dedicated instance URL. Self-hosted deployments require ensuring the SuperTokens Core service is publicly accessible via HTTPS.</p>\n<p><strong>Dynamic URL configuration</strong> for Vercel preview deployments requires using <code class=\"language-text\">process.env.VERCEL_URL</code> in backend configuration:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"80665204276891000000\"\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(`appInfo: {\n  apiDomain: process.env.VERCEL_URL\n    ? \\`https://\\${process.env.VERCEL_URL}\\`\n    : process.env.NEXT_PUBLIC_API_DOMAIN,\n  websiteDomain: process.env.VERCEL_URL\n    ? \\`https://\\${process.env.VERCEL_URL}\\`\n    : process.env.NEXT_PUBLIC_WEBSITE_DOMAIN,\n}`, `80665204276891000000`)\"\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=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token literal-property property\">appInfo</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token literal-property property\">apiDomain</span><span class=\"token operator\">:</span> process<span class=\"token punctuation\">.</span>env<span class=\"token punctuation\">.</span><span class=\"token constant\">VERCEL_URL</span>\n    <span class=\"token operator\">?</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">https://</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>process<span class=\"token punctuation\">.</span>env<span class=\"token punctuation\">.</span><span class=\"token constant\">VERCEL_URL</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span>\n    <span class=\"token operator\">:</span> process<span class=\"token punctuation\">.</span>env<span class=\"token punctuation\">.</span><span class=\"token constant\">NEXT_PUBLIC_API_DOMAIN</span><span class=\"token punctuation\">,</span>\n  <span class=\"token literal-property property\">websiteDomain</span><span class=\"token operator\">:</span> process<span class=\"token punctuation\">.</span>env<span class=\"token punctuation\">.</span><span class=\"token constant\">VERCEL_URL</span>\n    <span class=\"token operator\">?</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">https://</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>process<span class=\"token punctuation\">.</span>env<span class=\"token punctuation\">.</span><span class=\"token constant\">VERCEL_URL</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span>\n    <span class=\"token operator\">:</span> process<span class=\"token punctuation\">.</span>env<span class=\"token punctuation\">.</span><span class=\"token constant\">NEXT_PUBLIC_WEBSITE_DOMAIN</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"step-5----deploy-to-vercel\" style=\"position:relative;\"><a href=\"#step-5----deploy-to-vercel\" aria-label=\"step 5    deploy to vercel 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><strong>Step 5 — Deploy to Vercel</strong></h2>\n<p>Vercel deployment follows a straightforward process for Next.js applications with SuperTokens.</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/41bca8d11a8849d6eb98721702ac065d/c45c7/Vercel.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: 43.67088607594937%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABg0lEQVQoz6WRzWsTURTF571582Fikkk1TibOR+ardkircbCClBrULCIS6IcValdxUawgguLOnTtXrsSdGzf6T/5kZlMTLQguDueew73nPt7VPM/DNE0Mw8CyrJorXaHSFSul0DTtD0gpcRwH27aZzWbM5/PKX24SQtSNFa/Wq97vc7qu19D+tvk/sWwM45iyLMmyjNFoxPj2mCRJSNOU9fWcothgc2uLMAz+LbDTbpPEMVEYEUUReZ7XdeAHtY6iYY2O45x/04WBUqAJDdGwaQ2u0ctC+plPL7hCz72M22vSv9qk3VDI6ijiohdaFqLbRXh9VBajpQF3jvf5+vM7X358Y3o0YeC3uJG6FNcNtkOdkauIHYnbkDQNsRwoPB+5OUaWd5E799Gnj7D3ntBZHOK8f8rk7TZvjru8etBiUdqcFBYHicHMV0xcRdHRVwLzW8jdOfLhIfLxCfreC+TRKeL5GdrL19x7tsPn3Ut8umnyccPkQ2bybmhwFigWA8V07TzwFzlF3dB1r6xSAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"Vercel\"\n        title=\"Vercel\"\n        src=\"/static/41bca8d11a8849d6eb98721702ac065d/f058b/Vercel.png\"\n        srcset=\"/static/41bca8d11a8849d6eb98721702ac065d/c26ae/Vercel.png 158w,\n/static/41bca8d11a8849d6eb98721702ac065d/6bdcf/Vercel.png 315w,\n/static/41bca8d11a8849d6eb98721702ac065d/f058b/Vercel.png 630w,\n/static/41bca8d11a8849d6eb98721702ac065d/40601/Vercel.png 945w,\n/static/41bca8d11a8849d6eb98721702ac065d/78612/Vercel.png 1260w,\n/static/41bca8d11a8849d6eb98721702ac065d/c45c7/Vercel.png 1346w\"\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><strong>Prepare for deployment:</strong></p>\n<ol>\n<li>Commit all changes to your Git repository:</li>\n</ol>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"51548162063010914000\"\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(`git add .\ngit commit -m &quot;Add SuperTokens authentication&quot;\ngit push origin main`, `51548162063010914000`)\"\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=\"js\"><pre class=\"language-js\"><code class=\"language-js\">git add <span class=\"token punctuation\">.</span>\ngit commit <span class=\"token operator\">-</span>m <span class=\"token string\">\"Add SuperTokens authentication\"</span>\ngit push origin main</code></pre></div>\n<ol start=\"2\">\n<li>Navigate to the Vercel dashboard and import your repository</li>\n<li>Configure environment variables in Vercel project settings</li>\n<li>Deploy the application</li>\n</ol>\n<p><strong>Vercel automatically:</strong></p>\n<ul>\n<li>Detects the Next.js framework</li>\n<li>Installs dependencies</li>\n<li>Builds the application</li>\n<li>Deploys to serverless infrastructure</li>\n<li>Generates preview URLs for pull requests</li>\n</ul>\n<p><strong>Important deployment considerations:</strong></p>\n<ul>\n<li>This only works if the frontend and backend of your application have the same domain. If your backend is hosted separately, configure <code class=\"language-text\">apiDomain</code> to point to your backend server.</li>\n<li>Ensure CORS configuration allows requests from Vercel preview URLs</li>\n<li>Verify environment variables are set correctly in the Vercel dashboard</li>\n<li>Test authentication flows on the preview deployment before promoting to production</li>\n</ul>\n<h2 id=\"step-6----test-auth-flow\" style=\"position:relative;\"><a href=\"#step-6----test-auth-flow\" aria-label=\"step 6    test auth flow 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><strong>Step 6 — Test Auth Flow</strong></h2>\n<p>Verify authentication implementation works correctly across all flows.</p>\n<p><strong>Registration flow testing:</strong></p>\n<ol>\n<li>Navigate to the <code class=\"language-text\">/auth</code> route in your deployed application</li>\n<li>Click “Sign Up” and create a new account</li>\n<li>Verify email verification flow (if enabled)</li>\n<li>Confirm successful redirect after registration</li>\n</ol>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 465px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/9195de3b74df0646c794453168be9ec9/9ff85/Supertokens-demo.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: 49.36708860759494%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAIAAAA7N+mxAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAuElEQVQoz8XOuw6CMBQG4J5LWy9tIwGUSHDRxegDaDTRDeiABHn/ZzFodPC2Gb/pH87lF+IZEDMRwRUiUgeFEF1mRkTxHgAR3SJLqZR6jCqlAMQ3Umvvfd20viz2h2N9bqpTlRf5Zrf1pW/qujm369Xy+uXlEiI65+aLxWyWWWuCIJgkyTRNwzC0xo7jcZZlzhnxE8QY2DhU85FMJfYZNYG8lYS7j8uIMOhZQ7HhaMiR40Tjj3r+zQWF6g9kzBbAzAAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"Supertokens demo\"\n        title=\"Supertokens demo\"\n        src=\"/static/9195de3b74df0646c794453168be9ec9/9ff85/Supertokens-demo.png\"\n        srcset=\"/static/9195de3b74df0646c794453168be9ec9/c26ae/Supertokens-demo.png 158w,\n/static/9195de3b74df0646c794453168be9ec9/6bdcf/Supertokens-demo.png 315w,\n/static/9195de3b74df0646c794453168be9ec9/9ff85/Supertokens-demo.png 465w\"\n        sizes=\"(max-width: 465px) 100vw, 465px\"\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><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/b9a4e3726ec0358c022f6818377da5bb/be86f/Sign-in.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: 72.15189873417721%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABqklEQVQ4y6WT20oCURSGR/E5fAsP4AOEdBEdqaADEVQXddGtoEUYRdFpMmbuhYjMpCgi6AEqeojpJkERrVFnZu+ZP/YyTQp1oh8Wew57fXv9a+8tSZIEn88HMcZiMQgZhgHOORzHQaVSQT6fR6lUgmmasG2b/okQz4FAgHK9Xi+NUjswkUgQkDGGporFIp6envGqabSQkFioqXA43BkYj8dpkmlZsDmn6srlMnRdx4deQ0F3oBsOHMduQUOhUG9gw64Nxjgsy6IQVZvMBuMOWf0TUNgUSZ3UbtkVUGyCsFmr1ahvorr2sBgjF66B1WqVgKKHAkoQsv4FtSy3wMYua5qGQqHY6mfjiHDodY63sgiG97rtvkLTNGAYdbhRV2DzHOaubnB2nsX5RQ6Zyyvc3T/g9u4emWwO2dw1Ts8yeHx+obnBYLA3cHpuEQMjkxgen6FYWF7F/NIKBsemMDoxi77+IezuyzS3601JJpP4qyKRyG9g8yUajSKdTuMklYKiqpAP9nC4vQF5ZxPy1hqOttaROpahKCpURYGqqvD7/ZTr8Xi+gT8+/Cs+Abrt03EIGzJgAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"Sign in\"\n        title=\"Sign in\"\n        src=\"/static/b9a4e3726ec0358c022f6818377da5bb/f058b/Sign-in.png\"\n        srcset=\"/static/b9a4e3726ec0358c022f6818377da5bb/c26ae/Sign-in.png 158w,\n/static/b9a4e3726ec0358c022f6818377da5bb/6bdcf/Sign-in.png 315w,\n/static/b9a4e3726ec0358c022f6818377da5bb/f058b/Sign-in.png 630w,\n/static/b9a4e3726ec0358c022f6818377da5bb/be86f/Sign-in.png 662w\"\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><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 439px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/6f15477007d215ec381bbe2a25df8a19/e3b18/Signed-in.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: 11.39240506329114%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAACCAIAAADXZGvcAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAXklEQVQI1y2LWw6AIAwEvf8NkUhrS/BxAIG2AYU4P7s7yS5HSqtfmeN9XSFs53GmaRAAcUfEGKP3noiJyDkHADtzKaX3vqjIk7NOaq2qZmYiYmYqc+jP8CNGaa195xcFCnA4zUKR0QAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"Signed in \"\n        title=\"Signed in \"\n        src=\"/static/6f15477007d215ec381bbe2a25df8a19/e3b18/Signed-in.png\"\n        srcset=\"/static/6f15477007d215ec381bbe2a25df8a19/c26ae/Signed-in.png 158w,\n/static/6f15477007d215ec381bbe2a25df8a19/6bdcf/Signed-in.png 315w,\n/static/6f15477007d215ec381bbe2a25df8a19/e3b18/Signed-in.png 439w\"\n        sizes=\"(max-width: 439px) 100vw, 439px\"\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><strong>Session verification:</strong></p>\n<p>Protect API routes by verifying session tokens:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"47919955470354830000\"\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 { withSession } from &quot;supertokens-node/nextjs&quot;;\nimport { SessionContainer } from &quot;supertokens-node/recipe/session&quot;;\nimport { NextRequest, NextResponse } from &quot;next/server&quot;;\n\n\nexport async function GET(request: NextRequest) {\n  return withSession(\n    request,\n    async (session: SessionContainer | undefined) => {\n      if (!session) {\n        return NextResponse.json(\n          { error: &quot;Unauthorized&quot; },\n          { status: 401 }\n        );\n      }\n\n\n      const userId = session.getUserId();\n     \n      return NextResponse.json({\n        message: &quot;Protected data&quot;,\n        userId: userId,\n      });\n    }\n  );\n}`, `47919955470354830000`)\"\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=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><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\">\"supertokens-node/nextjs\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> SessionContainer <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> 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\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><span class=\"token parameter\"><span class=\"token literal-property property\">request</span><span class=\"token operator\">:</span> NextRequest</span><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>\n    request<span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token literal-property property\">session</span><span class=\"token operator\">:</span> SessionContainer <span class=\"token operator\">|</span> <span class=\"token keyword\">undefined</span></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><span class=\"token operator\">!</span>session<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>\n          <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">error</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Unauthorized\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n          <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">status</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>\n      <span class=\"token punctuation\">}</span>\n\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     \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        <span class=\"token literal-property property\">message</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Protected data\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token literal-property property\">userId</span><span class=\"token operator\">:</span> userId<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>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p><strong>Cookie and session persistence:</strong></p>\n<ul>\n<li>Verify session cookies are set with the correct security flags</li>\n<li>Test session persistence across page navigation</li>\n<li>Confirm that the logout functionality clears the session properly</li>\n<li>Validate that session refresh works without user interaction</li>\n</ul>\n<h2 id=\"optional-enable-social-or-passwordless-login\" style=\"position:relative;\"><a href=\"#optional-enable-social-or-passwordless-login\" aria-label=\"optional enable social or passwordless login 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><strong>Optional: Enable Social or Passwordless Login</strong></h2>\n<p>SuperTokens supports multiple authentication methods that can be added or combined according to specific requirements.</p>\n<p><strong>Social login integration</strong> with ThirdPartyEmailPassword:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"54472880911166220000\"\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 from &quot;supertokens-node/recipe/thirdpartyemailpassword&quot;;\nimport Google from &quot;supertokens-node/recipe/thirdpartyemailpassword/providers/google&quot;;\nimport Github from &quot;supertokens-node/recipe/thirdpartyemailpassword/providers/github&quot;;\n\n\nThirdPartyEmailPassword.init({\n  providers: [\n    Google({\n      clientId: process.env.GOOGLE_CLIENT_ID!,\n      clientSecret: process.env.GOOGLE_CLIENT_SECRET!,\n    }),\n    Github({\n      clientId: process.env.GITHUB_CLIENT_ID!,\n      clientSecret: process.env.GITHUB_CLIENT_SECRET!,\n    }),\n  ],\n});`, `54472880911166220000`)\"\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=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><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> Google <span class=\"token keyword\">from</span> <span class=\"token string\">\"supertokens-node/recipe/thirdpartyemailpassword/providers/google\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> Github <span class=\"token keyword\">from</span> <span class=\"token string\">\"supertokens-node/recipe/thirdpartyemailpassword/providers/github\"</span><span class=\"token punctuation\">;</span>\n\n\nThirdPartyEmailPassword<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 literal-property property\">providers</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n    <span class=\"token function\">Google</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n      <span class=\"token literal-property property\">clientId</span><span class=\"token operator\">:</span> process<span class=\"token punctuation\">.</span>env<span class=\"token punctuation\">.</span><span class=\"token constant\">GOOGLE_CLIENT_ID</span><span class=\"token operator\">!</span><span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">clientSecret</span><span class=\"token operator\">:</span> process<span class=\"token punctuation\">.</span>env<span class=\"token punctuation\">.</span><span class=\"token constant\">GOOGLE_CLIENT_SECRET</span><span class=\"token operator\">!</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 function\">Github</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n      <span class=\"token literal-property property\">clientId</span><span class=\"token operator\">:</span> process<span class=\"token punctuation\">.</span>env<span class=\"token punctuation\">.</span><span class=\"token constant\">GITHUB_CLIENT_ID</span><span class=\"token operator\">!</span><span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">clientSecret</span><span class=\"token operator\">:</span> process<span class=\"token punctuation\">.</span>env<span class=\"token punctuation\">.</span><span class=\"token constant\">GITHUB_CLIENT_SECRET</span><span class=\"token operator\">!</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 punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p><strong>Passwordless authentication</strong> with magic links or OTP:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"14791045524640301000\"\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 Passwordless from &quot;supertokens-node/recipe/passwordless&quot;;\n\n\nPasswordless.init({\n  contactMethod: &quot;EMAIL_OR_PHONE&quot;,\n  flowType: &quot;MAGIC_LINK&quot;,\n});`, `14791045524640301000`)\"\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=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">import</span> Passwordless <span class=\"token keyword\">from</span> <span class=\"token string\">\"supertokens-node/recipe/passwordless\"</span><span class=\"token punctuation\">;</span>\n\n\nPasswordless<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 literal-property property\">contactMethod</span><span class=\"token operator\">:</span> <span class=\"token string\">\"EMAIL_OR_PHONE\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token literal-property property\">flowType</span><span class=\"token operator\">:</span> <span class=\"token string\">\"MAGIC_LINK\"</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Frontend configuration requires updating recipe initialization to match backend configuration. SuperTokens automatically renders appropriate UI components based on enabled recipes.</p>\n<h2 id=\"supertokens-features-that-work-seamlessly-on-vercel\" style=\"position:relative;\"><a href=\"#supertokens-features-that-work-seamlessly-on-vercel\" aria-label=\"supertokens features that work seamlessly on vercel 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><strong>SuperTokens Features That Work Seamlessly on Vercel</strong></h2>\n<p>SuperTokens architecture aligns well with Vercel’s serverless platform, providing several advantages:</p>\n<ul>\n<li><strong>Serverless session verification</strong> operates efficiently within Vercel’s serverless functions, with minimal cold start overhead. Session validation requires only JWT verification or database lookup, completing within milliseconds even on cold starts.</li>\n<li><strong>Flexible session management</strong> supports both stateless JWT tokens and stateful database sessions. Stateless tokens eliminate database dependency for session verification, while stateful sessions provide immediate revocation capabilities essential for security-sensitive applications.</li>\n<li><strong>Multi-tenant authentication</strong> enables serving multiple customers from a single deployment with tenant-specific authentication configurations, branding, and user bases. This architecture works particularly well with Vercel’s edge network for global distribution.</li>\n<li><strong>Frontend UI theming</strong> provides complete customization of authentication interfaces without requiring custom component development. CSS variables and component overrides enable matching authentication UI to application design systems.</li>\n<li><strong>Type-safe claims and user roles</strong> integrate with TypeScript for compile-time type checking of user permissions and session claims, reducing runtime errors and improving developer experience.</li>\n</ul>\n<h2 id=\"limitations--workarounds\" style=\"position:relative;\"><a href=\"#limitations--workarounds\" aria-label=\"limitations  workarounds 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><strong>Limitations &#x26; Workarounds</strong></h2>\n<p>Understanding platform constraints helps avoid common implementation pitfalls.</p>\n<ul>\n<li><strong>Cold start latency</strong> affects serverless functions on Vercel’s free and hobby tiers. SuperTokens API routes experience slight latency during cold starts as the Node.js runtime initializes. Vercel Pro plans reduce cold start frequency through reserved capacity. For critical authentication endpoints, consider keeping functions warm through periodic health check requests.</li>\n<li><strong>Edge runtime compatibility</strong> remains limited. SuperTokens relies on Node.js APIs unsupported in Vercel’s edge runtime, requiring standard serverless API routes rather than edge functions. This limitation affects global latency for authentication operations but typically remains acceptable for most applications.</li>\n<li><strong>Self-hosted SuperTokens Core requirements</strong> mandate public HTTPS accessibility. Organizations self-hosting SuperTokens Core must expose the service to the internet or configure VPN connectivity between Vercel deployments and private networks. Managed SuperTokens hosting eliminates these networking concerns.</li>\n<li><strong>Preview deployment considerations</strong> require dynamic URL configuration to support Vercel’s unique preview URLs for each pull request. The <code class=\"language-text\">VERCEL_URL</code> environment variable enables this functionality but requires proper configuration in <code class=\"language-text\">appInfo</code>.</li>\n</ul>\n<h2 id=\"frequently-asked-questions\" style=\"position:relative;\"><a href=\"#frequently-asked-questions\" aria-label=\"frequently asked questions 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><strong>Frequently Asked Questions</strong></h2>\n<ul>\n<li><strong>Can I use the SuperTokens managed service on Vercel?</strong></li>\n</ul>\n<p>Yes, managed SuperTokens hosting works seamlessly with Vercel deployments. Point <code class=\"language-text\">SUPERTOKENS_CONNECTION_URI</code> to your managed instance URL and configure the API key. Managed hosting eliminates operational overhead while providing production-grade reliability and security.</p>\n<ul>\n<li><strong>Can I deploy to Vercel edge functions?</strong></li>\n</ul>\n<p>Not currently. SuperTokens requires Node.js APIs unavailable in Vercel’s edge runtime. Use standard serverless API routes, which provide sufficient performance for most authentication workloads while supporting SuperTokens functionality.</p>\n<ul>\n<li><strong>How do I handle custom domains?</strong></li>\n</ul>\n<p>Configure custom domains through Vercel dashboard, then update environment variables to reflect custom domain URLs. Ensure <code class=\"language-text\">apiDomain</code> and <code class=\"language-text\">websiteDomain</code> match your custom domain configuration.</p>\n<ul>\n<li><strong>What about database requirements?</strong></li>\n</ul>\n<p>SuperTokens Core handles user data storage internally. Applications using self-hosted Core need to configure database connectivity (PostgreSQL, MySQL, or MongoDB supported). Managed SuperTokens hosting includes database infrastructure.</p>\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><strong>Conclusion</strong></h2>\n<p>SuperTokens integrates naturally with Vercel’s developer-friendly environment, providing production-ready authentication that scales from prototype to enterprise deployment. The combination delivers secure, customizable authentication in minutes rather than weeks of custom development.</p>\n<p>Whether prototyping new features, launching minimum viable products, or scaling to millions of users, SuperTokens on Vercel provides authentication infrastructure that grows with application requirements. The open-source foundation ensures transparency and flexibility, while managed hosting options eliminate operational complexity for teams preferring convenience over infrastructure control.</p>\n<p>Start by deploying the example application, test authentication flows thoroughly, and progressively add features as requirements evolve. The modular architecture enables incremental adoption without requiring comprehensive upfront planning or migration efforts.</p>","frontmatter":{"date":"November 18, 2025","title":"Deploying SuperTokens on Vercel with Next.js","cover":"supertokens-on-vercel.png","author":"Mostafa Ibrahim","description":"Step-by-step guide to deploying SuperTokens authentication on Vercel with Next.js. Learn setup, environment config, API routes, and deployment tips."},"fields":{"slug":"/supertokens-on-vercel/"}},"site":{"siteMetadata":{"title":"SuperTokens Blog"}}},"pageContext":{"id":"3653ded7-57bb-5c43-bb99-c4308c78c77e","fields__slug":"/supertokens-on-vercel/","__params":{"fields__slug":"supertokens-on-vercel"}}},
    "staticQueryHashes": []}