Require the deployment owner’s Zenith account before requests reach an app endpoint.
Use forward authentication to restrict an HTTP endpoint to the deployment owner’s Zenith account. Zenith checks access before forwarding requests to the app. If the app has its own login, configure that login separately.
Every path on a protected hostname requires Zenith authentication. Do not enable this setting on an endpoint that accepts public webhooks or unauthenticated API clients.
Add these entries to your existing manifest. Replace the service names and ports with your app’s values.Configure every endpoint separately. A labelled endpoint does not inherit protection from the primary endpoint, even when both reach the same service. A verified custom domain inherits the primary endpoint’s setting.Set forward_auth: false or omit the field to leave an endpoint without this check. web: false does not bypass forward authentication.
Test a hosted deployment. Development previews reject forward_auth: true, and local Docker Compose does not enforce Zenith authentication.
Open the protected URL while signed out.
Sign in with the deployment owner’s Zenith account.
Check the destination hostname and choose Open app.
Confirm that the app opens at the original URL.
Try a different Zenith account and confirm that access is denied.
Check every exposed hostname for an unprotected route to the same private data. Unauthenticated API requests and WebSocket upgrades receive a denial instead of an interactive login redirect.For app accounts and access by additional Zenith members, use Sign in with Zenith if your app supports OpenID Connect.See the forward authentication reference for request handling, session revocation, and endpoint interactions.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Zenith","description":"Use the Zenith CLI to prepare apps, test temporary deployments, and publish on Zenith Hosting.","colors":{"primary":"#5D45B6","light":"#8668DC","dark":"#9275DD"},"logo":{"light":"https://mintcdn.com/zenith-hosting/1Iaf63Z3n_Oc8RCE/assets/wordmark.svg?fit=max\u0026auto=format\u0026n=1Iaf63Z3n_Oc8RCE\u0026q=85\u0026s=4abfa32b5a206e2019e8095d5773d4b7","dark":"https://mintcdn.com/zenith-hosting/1Iaf63Z3n_Oc8RCE/assets/wordmark.svg?fit=max\u0026auto=format\u0026n=1Iaf63Z3n_Oc8RCE\u0026q=85\u0026s=4abfa32b5a206e2019e8095d5773d4b7","href":"https://zenith.hosting"},"favicon":"https://mintcdn.com/zenith-hosting/1Iaf63Z3n_Oc8RCE/favicon.svg?fit=max\u0026auto=format\u0026n=1Iaf63Z3n_Oc8RCE\u0026q=85\u0026s=603cf4507335ed184417c99e658f88d1","appearance":{"default":"system","strict":false},"background":{"color":{"light":"#FFFFFF","dark":"#111113"}},"navbar":{"links":[{"href":"https://github.com/zenith-hosting","label":"GitHub"}],"primary":{"type":"button","label":"Get started","href":"/content/quickstart"}},"footer":{"socials":{"github":"https://github.com/zenith-hosting"}},"styling":{"codeblocks":{"theme":{"light":"github-light-default","dark":"vitesse-black"}},"latex":false},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"markdown":{"instructions":["Start with https://docs.zenith.hosting/content/quickstart.md. Use NO_COLOR=1 for plain CLI output in non-interactive agent sessions. Run without a TTY and supply explicit template and publishing inputs; NO_COLOR does not bypass prompts or authorization.","For temporary deployments, read https://docs.zenith.hosting/content/up.md. For publishing and review, read https://docs.zenith.hosting/content/publish.md. A preview uploads local files; publishing uses a pinned public GitHub commit.","Before creating, changing, or approving zenith-compose.yml, read https://docs.zenith.hosting/llms.txt, then read https://docs.zenith.hosting/content/zenith-compose.md and the complete public schema at https://docs.zenith.hosting/content/zenith-compose-reference.md. Generate only documented fields and follow their validation and completion checks.","Before creating, changing, publishing, or verifying a container image for Zenith, read https://docs.zenith.hosting/content/containerise.md.","Treat these live Markdown pages as the source of truth instead of relying on memory or a copied Zenith Compose specification.","Do not push commits, submit an app, merge pull requests, publish container images, or change registry visibility unless the user explicitly authorizes that external action. Do not bypass browser OAuth, GitHub connection, or Developer Agreement acceptance."]},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"zenith-hosting","hasAudioNarration":false,"actualSubdomain":"zenith-hosting","customDomains":["docs.zenith.hosting"],"gitSource":{"type":"github","owner":"zenith-hosting","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"chroma":{"latestBuiltDeploymentHistoryId":"6ad9af8dbad04a2f7e31de03","collectionId":"ba094d68-8f8c-4b63-8c6a-845f4a965e85","liveDeploymentHistoryId":"6ad9af8dbad04a2f7e31de03","schemaVersion":"v3"},"entitlements":{"AI_CHAT":{"status":"DISABLED"},"WEB_MCP":{"status":"DISABLED"},"NARRATION":{"status":"DISABLED"}},"buildId":"6ad9af8dbad04a2f7e31de03","clientVersion":"0.0.4067","searchFilterCounts":[{"language":"default","tag":"App integrations","count":6},{"language":"default","tag":"App configuration","count":4},{"language":"default","tag":"CLI workflow","count":2},{"language":"default","tag":"Start here","count":2},{"language":"default","tag":"Sign in with Zenith","count":1},{"language":"default","tag":"zenith-compose.yml","count":1}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":"@font-face{font-family:\"Satoshi\";src:url(\"/assets/fonts/satoshi-400.woff2\") format(\"woff2\");font-style:normal;font-weight:400;font-display:swap}@font-face{font-family:\"Satoshi\";src:url(\"/assets/fonts/satoshi-500.woff2\") format(\"woff2\");font-style:normal;font-weight:500;font-display:swap}@font-face{font-family:\"Satoshi\";src:url(\"/assets/fonts/satoshi-700.woff2\") format(\"woff2\");font-style:normal;font-weight:700;font-display:swap}@font-face{font-family:\"Stack Sans Headline\";src:url(\"/assets/fonts/stack-sans-headline.woff2\") format(\"woff2\");font-style:normal;font-weight:200 700;font-display:swap}@font-face{font-family:\"Spline Sans Mono\";src:url(\"/assets/fonts/spline-sans-mono-latin.woff2\") format(\"woff2\");font-style:normal;font-weight:300 700;font-display:swap;unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6,\n U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122,\n U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}@font-face{font-family:\"Spline Sans Mono\";src:url(\"/assets/fonts/spline-sans-mono-latin-ext.woff2\") format(\"woff2\");font-style:normal;font-weight:300 700;font-display:swap;unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7,\n U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F,\n U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F,\n U+A720-A7FF}:root{--zenith-purple: oklch(0.48 0.17 288);--zenith-purple-bright: oklch(0.575 0.17 292);--zenith-purple-wash: oklch(0.94 0.024 293);--zenith-canvas: oklch(0.972 0.003 290);--zenith-surface: oklch(1 0 0);--zenith-field: oklch(0.98 0.003 290);--zenith-edge: oklch(0.918 0.004 290);--zenith-ink: oklch(0.145 0.008 290);--zenith-muted: oklch(0.505 0.008 290);--zenith-cta-bg: #5d45b6;--zenith-cta-ink: white}html.dark{--zenith-purple: oklch(0.745 0.135 292);--zenith-purple-bright: oklch(0.79 0.12 292);--zenith-purple-wash: oklch(0.275 0.055 292);--zenith-canvas: oklch(0.155 0.006 290);--zenith-surface: oklch(0.17 0.006 290);--zenith-field: oklch(0.215 0.008 290);--zenith-edge: oklch(0.285 0.01 290);--zenith-ink: oklch(0.945 0.008 290);--zenith-muted: oklch(0.715 0.012 290);--zenith-cta-bg: #694cbd;--zenith-cta-ink: white}html{color-scheme:light;background:var(--zenith-surface)}html.dark{color-scheme:dark}body{color:var(--zenith-ink);background:var(--zenith-surface);font-family:\"Satoshi\", ui-sans-serif, sans-serif;font-kerning:normal;font-optical-sizing:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}h1,h2,h3,h4,h5,h6,#page-title{color:var(--zenith-ink);font-family:\"Stack Sans Headline\", \"Satoshi\", ui-sans-serif, sans-serif;text-wrap:balance}code,pre,kbd,samp{font-family:\"Spline Sans Mono\", ui-monospace, monospace}::selection{background:color-mix(in oklab, var(--zenith-purple-bright) 22%, transparent)}#navbar-transition{border-color:var(--zenith-edge);background:color-mix(in oklab, var(--zenith-surface) 94%, transparent)}#navbar .nav-logo img{width:auto;height:2rem}html.dark a[href=\"https://zenith.hosting\"] img{filter:brightness(1.65) saturate(0.78)}#search-bar-entry{border-radius:0.75rem;background:var(--zenith-field);box-shadow:0 0 0 1px var(--zenith-edge)}#sidebar,#sidebar-content{border-right:1px solid var(--zenith-edge);background:var(--zenith-surface)}#sidebar a[aria-current=\"page\"]{color:var(--zenith-purple);background:color-mix(in oklab, var(--zenith-purple-wash) 60%, var(--zenith-surface))}#content-container{color:var(--zenith-ink)}#content-container p,#content-container li,#content-container td{line-height:1.55}#content-container a:not([class]){color:var(--zenith-purple)}#content-container :not(pre)>code{border-color:var(--zenith-edge);background:var(--zenith-field)}#topbar-cta-button a>span:first-child{border-radius:0.75rem;background:var(--zenith-cta-bg)!important}#topbar-cta-button a>div,#topbar-cta-button a>div span,#topbar-cta-button a>div svg{color:var(--zenith-cta-ink)!important}#footer{border-color:var(--zenith-edge)}html.dark #content-container{color:var(--zenith-ink)}html.dark #content-container p,html.dark #content-container li,html.dark #content-container td,html.dark #content-container th{color:color-mix(in oklab, var(--zenith-ink) 88%, var(--zenith-muted))}html.dark #content-container hr,html.dark #content-container table,html.dark #content-container th,html.dark #content-container td{border-color:var(--zenith-edge)}#footer a[href*=\"utm_campaign=poweredBy\"]{display:none!important}body>div[role=\"status\"][aria-live=\"polite\"].fixed.z-999{display:none!important}@media (prefers-reduced-motion: no-preference){html{scroll-behavior:smooth}}"}],"page":{"pagePath":"content/forward-authentication","slug":"/content/forward-authentication","pageMetadata":{"title":"Protect an app with forward authentication","sidebarTitle":"Forward authentication","description":"Require the deployment owner's Zenith account before requests reach an app endpoint.","href":"/content/forward-authentication"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Require the deployment owner’s Zenith account before requests reach an app endpoint.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,blockquote:`blockquote`,code:`code`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,..._provideComponents(),...props.components},{CodeBlock,Heading,Visibility,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Visibility)_missingMdxReference(`Visibility`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`Use forward authentication to restrict an HTTP endpoint to the deployment owner’s Zenith account. Zenith checks access before forwarding requests to the app. If the app has its own login, configure that login separately.`}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`Every path on a protected hostname requires Zenith authentication. Do not enable this setting on an endpoint that accepts public webhooks or unauthenticated API clients.`})}),`\n`,_jsx(Heading,{level:`2`,id:`protect-an-endpoint`,children:`Protect an endpoint`}),`\n`,_jsxs(_components.p,{children:[`Add `,_jsx(_components.code,{children:`forward_auth: true`}),` to each `,_jsx(_components.code,{children:`x-zenith.expose`}),` entry that needs protection:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`11`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default vitesse-black`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#000`,color:`#1f2328`,\"--shiki-dark\":`#dbd7cacc`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`11`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#B8A965`},children:`x-zenith`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#444444`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#B8A965`},children:` expose`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#444444`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#444444`},children:` -`}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#B8A965`},children:` service`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#444444`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#C98A7D`},children:` app`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#B8A965`},children:` port`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#444444`},children:`:`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4C9A91`},children:` 3000`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#B8A965`},children:` web`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#444444`},children:`:`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4D9375`},children:` true`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#B8A965`},children:` forward_auth`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#444444`},children:`:`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4D9375`},children:` true`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#444444`},children:` -`}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#B8A965`},children:` service`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#444444`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#C98A7D`},children:` admin`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#B8A965`},children:` port`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#444444`},children:`:`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4C9A91`},children:` 3001`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#B8A965`},children:` label`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#444444`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#C98A7D`},children:` admin`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#B8A965`},children:` web`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#444444`},children:`:`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4D9375`},children:` true`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#B8A965`},children:` forward_auth`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#444444`},children:`:`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4D9375`},children:` true`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Add these entries to your existing manifest. Replace the service names and ports with your app’s values.`}),`\n`,_jsx(_components.p,{children:`Configure every endpoint separately. A labelled endpoint does not inherit protection from the primary endpoint, even when both reach the same service. A verified custom domain inherits the primary endpoint’s setting.`}),`\n`,_jsxs(_components.p,{children:[`Set `,_jsx(_components.code,{children:`forward_auth: false`}),` or omit the field to leave an endpoint without this check. `,_jsx(_components.code,{children:`web: false`}),` does not bypass forward authentication.`]}),`\n`,_jsx(Heading,{level:`2`,id:`check-access-in-a-browser`,children:`Check access in a browser`}),`\n`,_jsxs(_components.p,{children:[`Test a hosted deployment. Development previews reject `,_jsx(_components.code,{children:`forward_auth: true`}),`, and local Docker Compose does not enforce Zenith authentication.`]}),`\n`,_jsx(Visibility,{for:`humans`,children:_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`Open the protected URL while signed out.`}),`\n`,_jsx(_components.li,{children:`Sign in with the deployment owner’s Zenith account.`}),`\n`,_jsxs(_components.li,{children:[`Check the destination hostname and choose `,_jsx(_components.strong,{children:`Open app`}),`.`]}),`\n`,_jsx(_components.li,{children:`Confirm that the app opens at the original URL.`}),`\n`,_jsx(_components.li,{children:`Try a different Zenith account and confirm that access is denied.`}),`\n`]})}),`\n`,_jsx(Visibility,{for:`agents`,children:_jsxs(_components.blockquote,{children:[`\n`,_jsx(_components.p,{children:`Verify anonymous redirection, owner sign-in, explicit destination confirmation, and denial for another account. Do not treat a login page as evidence that the app is healthy.`}),`\n`]})}),`\n`,_jsx(_components.p,{children:`Check every exposed hostname for an unprotected route to the same private data. Unauthenticated API requests and WebSocket upgrades receive a denial instead of an interactive login redirect.`}),`\n`,_jsxs(_components.p,{children:[`For app accounts and access by additional Zenith members, use `,_jsx(_components.a,{href:`/content/sign-in-with-zenith`,children:`Sign in with Zenith`}),` if your app supports OpenID Connect.`]}),`\n`,_jsxs(_components.p,{children:[`See the `,_jsx(_components.a,{href:`/content/zenith-compose-reference#forward-authentication`,children:`forward authentication reference`}),` for request handling, session revocation, and endpoint interactions.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"codeStyling":{"theme":{"light":"github-light-default","dark":"vitesse-black"}},"config":{},"pageMetadata":{"title":"Protect an app with forward authentication","sidebarTitle":"Forward authentication","description":"Require the deployment owner's Zenith account before requests reach an app endpoint.","href":"/content/forward-authentication"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Protect an endpoint","slug":"protect-an-endpoint","depth":2,"children":[]},{"title":"Check access in a browser","slug":"check-access-in-a-browser","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"zenith-hosting","siteName":"Zenith","title":"Protect an app with forward authentication - Zenith","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-22T06:39:12.317Z","originalFileLocation":"content/forward-authentication.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Require the deployment owner\u0026#x27;s Zenith account before requests reach an app endpoint.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Zenith\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/zenith-hosting/15Dl96z5TYB9iHUH/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/zenith-hosting/15Dl96z5TYB9iHUH/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/zenith-hosting/15Dl96z5TYB9iHUH/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/zenith-hosting/15Dl96z5TYB9iHUH/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/zenith-hosting/15Dl96z5TYB9iHUH/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/zenith-hosting/15Dl96z5TYB9iHUH/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/zenith-hosting/15Dl96z5TYB9iHUH/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/zenith-hosting/15Dl96z5TYB9iHUH/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/zenith-hosting/15Dl96z5TYB9iHUH/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Protect an app with forward authentication - Zenith\">\u003cmeta data-mint-head property=\"og:description\" content=\"Require the deployment owner\u0026#x27;s Zenith account before requests reach an app endpoint.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Zenith\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.zenith.hosting/content/forward-authentication\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://zenith-hosting.mintlify.app/_mintlify/api/og/v2?division=App+integrations\u0026amp;title=Protect+an+app+with+forward+authentication\u0026amp;description=Require+the+deployment+owner%27s+Zenith+account+before+requests+reach+an+app+endpoint.\u0026amp;theme=bea2dd65243df29746aefac5\u0026amp;signature=5df19cebc8735d0b6bf3202e3b8a23143a92c0be5a391ce07349f9ee7230ebd8\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Protect an app with forward authentication - Zenith\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Require the deployment owner\u0026#x27;s Zenith account before requests reach an app endpoint.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://zenith-hosting.mintlify.app/_mintlify/api/og/v2?division=App+integrations\u0026amp;title=Protect+an+app+with+forward+authentication\u0026amp;description=Require+the+deployment+owner%27s+Zenith+account+before+requests+reach+an+app+endpoint.\u0026amp;theme=bea2dd65243df29746aefac5\u0026amp;signature=5df19cebc8735d0b6bf3202e3b8a23143a92c0be5a391ce07349f9ee7230ebd8\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/zenith-hosting/15Dl96z5TYB9iHUH/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Zenith\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#5D45B6\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.zenith.hosting/content/forward-authentication\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/content/forward-authentication.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.zenith.hosting/#organization\",\"name\":\"Zenith\",\"url\":\"https://docs.zenith.hosting\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/zenith-hosting/1Iaf63Z3n_Oc8RCE/assets/wordmark.svg?fit=max\u0026auto=format\u0026n=1Iaf63Z3n_Oc8RCE\u0026q=85\u0026s=4abfa32b5a206e2019e8095d5773d4b7\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.zenith.hosting#website\",\"name\":\"Zenith\",\"url\":\"https://docs.zenith.hosting\",\"publisher\":{\"@id\":\"https://docs.zenith.hosting/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.zenith.hosting/content/forward-authentication#webpage\",\"url\":\"https://docs.zenith.hosting/content/forward-authentication\",\"name\":\"Protect an app with forward authentication\",\"description\":\"Require the deployment owner's Zenith account before requests reach an app endpoint.\",\"dateModified\":\"2026-10-22T06:39:12.317Z\",\"isPartOf\":{\"@id\":\"https://docs.zenith.hosting#website\"},\"breadcrumb\":{\"@id\":\"https://docs.zenith.hosting/content/forward-authentication#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.zenith.hosting/content/forward-authentication#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"App integrations\",\"item\":\"https://docs.zenith.hosting/content/smtp-email\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Protect an app with forward authentication\",\"item\":\"https://docs.zenith.hosting/content/forward-authentication\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.zenith.hosting/content/forward-authentication#article\",\"headline\":\"Protect an app with forward authentication\",\"name\":\"Protect an app with forward authentication\",\"description\":\"Require the deployment owner's Zenith account before requests reach an app endpoint.\",\"url\":\"https://docs.zenith.hosting/content/forward-authentication\",\"mainEntityOfPage\":{\"@id\":\"https://docs.zenith.hosting/content/forward-authentication#webpage\"},\"dateModified\":\"2026-10-22T06:39:12.317Z\",\"publisher\":{\"@id\":\"https://docs.zenith.hosting/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.zenith.hosting#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Zenith\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Zenith","nav":{"global":null,"pages":[{"group":"Start here","pages":[{"title":"Build, test, and publish with Zenith","mode":"wide","href":"/index"},{"title":"Get started with the CLI","sidebarTitle":"Quickstart","href":"/content/quickstart"}]},{"group":"CLI workflow","pages":[{"title":"Test with zenith up","sidebarTitle":"Temporary deployments","href":"/content/up"},{"title":"Publish with zenith publish","sidebarTitle":"Publish your app","href":"/content/publish"}]},{"group":"App configuration","pages":[{"title":"Prepare your container","href":"/content/containerise"},{"group":"zenith-compose.yml","root":{"title":"Create a zenith-compose.yml","href":"/content/zenith-compose"},"pages":[{"title":"zenith-compose.yml reference","sidebarTitle":"Reference","href":"/content/zenith-compose-reference"}]},{"title":"Configure environment variables and secrets","sidebarTitle":"Environment variables and secrets","href":"/content/environment-variables"},{"title":"Mount static configuration files","sidebarTitle":"Static configuration files","href":"/content/static-configuration"}]},{"group":"App integrations","pages":[{"title":"Send email with SMTP","sidebarTitle":"SMTP email","href":"/content/smtp-email"},{"group":"Sign in with Zenith","root":{"title":"Add Sign in with Zenith","sidebarTitle":"Sign in with Zenith","href":"/content/sign-in-with-zenith"},"pages":[{"title":"Sign in with Zenith reference","sidebarTitle":"Reference","description":"Compose fields, credentials, protocol limits, and access rules for Zenith OpenID Connect.","href":"/content/sign-in-with-zenith-reference"}]},{"title":"Protect an app with forward authentication","sidebarTitle":"Forward authentication","href":"/content/forward-authentication"},{"title":"Configure public URLs and domains","sidebarTitle":"Public URLs and domains","description":"Expose HTTP endpoints and configure app base URLs, allowed hosts, and verified custom domains.","href":"/content/public-urls"},{"title":"Store app data and expose files","sidebarTitle":"Persistent storage and files","href":"/content/persistent-storage"},{"title":"Expose configuration files","href":"/content/configuration-files"}]}]},"basePath":"","title":"Protect an app with forward authentication - Zenith","buildId":"dpl_9VVk5y1P8k1ATeJguVngy9Q3cmbD","deploymentId":"dpl_9VVk5y1P8k1ATeJguVngy9Q3cmbD","dynamics":[],"chunks":[]}