From 65197ad11c6ed96899e36c33ec28c0ddb9255a28 Mon Sep 17 00:00:00 2001 From: Duc Nguyen Date: Thu, 13 Aug 2026 17:53:17 +0700 Subject: [PATCH] feat(auth): add native SAML 2.0 SSO integration Add SAML 2.0 as a second SSO protocol alongside OIDC under a unified authMode/ssoType model. SP flows via @node-saml/node-saml: AuthnRequest generation, ACS POST assertion handling, SP metadata export, and admin config test endpoint. Replay-protected via saml_state cookie (httpOnly, SameSite=Lax) matched against InResponseTo; wantAssertionsSigned enforced. - src/lib/auth/saml.js: SAML instance builder, X.509 cert formatter, claim pickers - 4 routes under src/app/api/auth/saml/: start, acs, metadata, test - settingsRepo: ssoType + saml* defaults; login/status routes dispatch by type - profile page: SSO protocol switcher, IdP metadata XML + cert uploaders - login page: dynamic SAML sign-in button; Header: SAML user badge --- docs/images/saml-admin-dashboard.png | Bin 0 -> 105225 bytes docs/images/saml-login-screen.png | Bin 0 -> 15754 bytes package.json | 1 + src/app/(dashboard)/dashboard/profile/page.js | 812 ++++++++++++++---- src/app/api/auth/login/route.js | 11 +- src/app/api/auth/saml/acs/route.js | 69 ++ src/app/api/auth/saml/metadata/route.js | 25 + src/app/api/auth/saml/start/route.js | 32 + src/app/api/auth/saml/test/route.js | 72 ++ src/app/api/auth/status/route.js | 27 +- src/app/login/page.js | 40 +- src/dashboardGuard.js | 1 + src/lib/auth/saml.js | 268 ++++++ src/lib/db/repos/settingsRepo.js | 9 +- src/shared/components/Header.js | 11 +- tests/auth/saml.test.js | 40 + tests/unit/saml.test.js | 144 ++++ 17 files changed, 1396 insertions(+), 166 deletions(-) create mode 100644 docs/images/saml-admin-dashboard.png create mode 100644 docs/images/saml-login-screen.png create mode 100644 src/app/api/auth/saml/acs/route.js create mode 100644 src/app/api/auth/saml/metadata/route.js create mode 100644 src/app/api/auth/saml/start/route.js create mode 100644 src/app/api/auth/saml/test/route.js create mode 100644 src/lib/auth/saml.js create mode 100644 tests/auth/saml.test.js create mode 100644 tests/unit/saml.test.js diff --git a/docs/images/saml-admin-dashboard.png b/docs/images/saml-admin-dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..53d0466e9108ece0a8f8ca285a0956c614b7451e GIT binary patch literal 105225 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�oA z%*JENFKwBkZ)z=1A>1snIyS@`)!6Mm z3E1ApB7Q$d;)^3=${dX`9*=Z(Xza_ep;SQm#-f$p@>{Qpm)EPemUD#3c)^w2^{{8g zPPZjrb|2msMCcpH^aWH+uye1dOg_rOsS^~f*rGP^(4jgc8ld6RJnU8D{S{qwWted> z^<-P5bFuPrUUAPL!`lPYq85?J#5ie2vX2_zD|vCd;@?esc?c}PWbA6U>!#)l%@R7G zf6NDRt{M9opg&XODw{8~H(${i9y<_YV#L+5*Z$MX7|$l-^&y!+^x_iMQBKv0;KaTR zHQ`NOyd(e_O%+;{A1{lo4m^av!pPT?fi%{=Vw#Pn#NL4~+mjYJ7Z*X*#q%Aq@G#KY znkPO@m-GJmDCCj5R)n2n)+uJEi^#cG(B)@UlS?O_MKeGx?ywoJD{O5SXL|F|ZsRK} zjdW4--m4>C}bln1}P?HNgOixoQf=yPd%S(CGBFlx1=q8KFNn^5AxJ6 z7JCcxarx`Ri_&}N)2~f#8VE+K z{AHs=<;G|s6OsaaT9V*S@Xc}H!tVK}Lj0DGzVPih3vgz$y53~{o)&5a_?D25xcw?j zC=D<;j_Ie;tq_~TPO?>Ghlnr@!|`Lso7{tXmLx-wCx*<#(Lk$aSW=oSqnF?;Uk}H9 zMIh4Io-8HZc#4LK^Mi;`jIC`a&7sYW@NIXpL_w7H^$}ALSWGfcDs1+z^5~qV+?#q10loj>+*wp@CQo| zhC?6KR1!UCv@@(>U*itGVqvg130S2)*4RE`v!eITzPJog7_bk6crWO zroEw7*ubwA_%tPAOt~`uz~MM4Y1=K0^Y!uUyW=H5Gl!3W^eeBY-8k8&DcUclA5>MC z?8g&mjdPcm3~_LcUq3OVBDT$=r1i?Ij;%qRcEux?+RrX<|tHq_Cr_m?j%DRDaw{TdBY7&kc?ZOMJ$ zJ(N%KC725*A;MaBCw~Vfk#G^ah&)e+`67b5V|jpL&~&)%j8fC;tYSS7Ea4rQn3n~9 zd}v5eDqEvFzD(`$O1c(yAdH)je&=gV-ap!mMA?w z^y0k>2lDS?AH0`nHKRQklQgkbx(9c8R`fwC%yGhf{z9a)`b*AjyP)Cwj_SW*i@012 zUQNDn<536h?%a}QGQT$|9Dls)mrSMt-LDl()**c7N?@smcm8=VC?4ee@yFvN3GV24 z9G`b$9Ej5hAT~x4wL$KxuBr^Kj9?3B8oXt z^f!Kn2F$?}@6955cJxT*6Ad%v64=_Od)JndQoUqj(^MvZV!>bZm30+LaNRbe%%82I zjRf{jB7EeFGqfgGUP!HHh*vf|(ldVi;W^$jxU(-x%E!Agj;Er?`kEaZr)ue0)S_IN z&b%Cv32&sUU&`>%fR)uHKe z{*lEd2Cv>Xhb_JrqYf+c$|Df=1z9_h7OmPtV zJj>$YC%pCI={Fmb0)1Rfjk;yfy4qUBb_v@5AU@*>l5MX|q0K{!J<<6c?^|O}7n+iP zuM#p@E_(nOHMczCas2o0l#x0zVn2@Z#{NAs)ccz*$X$d}VesMKm#-veNEKtUndUR( z|1Kr)y<|ci*R$Zo`SJ8I{9mW}&<|FBpuli76y*`=%LKdc_Yl^2KD=y+r;NX2x=mv= z`B80Tg%RiG)0Z+bGQ0y{!T)C5KpJ?$e57FBY&a@at7q`+q)??LgPZR^<5NUoBpM1i zVV+1}+{df{Onso)(Ve9I{7|a2vaxX{85vp11HwZz z?z6mqvMIS2=S@@jXXWu~ky*l#ntYv;fc3M>wWvp>Znq726 zpRuTWzu!1|OcIU4KOkReF-8e9Zum51Bn>*saFc2fs>keOyFtO_ph;Px^)XJWP@73; zZu8w35y#8`Gj|L-*Vx2oF^@Ir9Ks$6fnPNrxxUu%@bIV<0-esec=XvLK{Y%WhH1lf zgh)kNUfb=4B)*{5c#1^8l=T0+^*6;9=LEWBTD{!?k-Me&v5-LPfwX(}uRM|-182En zRCoiNzZ@z)_ovnP^+V48|6GpXvtxxBr_0%?FZ%I>?s|vU_WVY*DbM9>$ev-I-yz)p zEwAqB$|KRv$N$y+SfrD6y&Wa;50D~4`js?sPS}5qC?AQA`dmy=xvKotW*VdmE=s>b z^jG^8C6L;WDCOHo`D-u$Bx2<$*+uhDrTp*wR2`c^p1%y;knrnX;9Jpu(8=|kOAi@N pvG`|BcYqiwuIE2%y0~{1uop0>STAojd-u| getLocaleFromCookie()); const [langOpen, setLangOpen] = useState(false); const [shutdownOpen, setShutdownOpen] = useState(false); const [isShuttingDown, setIsShuttingDown] = useState(false); @@ -46,8 +46,31 @@ export default function ProfilePage() { const [oidcLoading, setOidcLoading] = useState(false); const [oidcTestLoading, setOidcTestLoading] = useState(false); const [oidcTestStatus, setOidcTestStatus] = useState({ type: "", message: "" }); - const [oidcRedirectUri, setOidcRedirectUri] = useState("/api/auth/oidc/callback"); const [oidcExpanded, setOidcExpanded] = useState(false); + + const origin = typeof window !== "undefined" ? window.location.origin : ""; + const oidcRedirectUri = origin ? `${origin}/api/auth/oidc/callback` : "/api/auth/oidc/callback"; + const samlAcsUrl = origin ? `${origin}/api/auth/saml/acs` : "/api/auth/saml/acs"; + const samlMetadataUrl = origin ? `${origin}/api/auth/saml/metadata` : "/api/auth/saml/metadata"; + + // SAML State + const [ssoTypeTab, setSsoTypeTab] = useState("saml"); + const [samlForm, setSamlForm] = useState({ + samlEntryPoint: "", + samlIssuer: "urn:9router:sp", + samlCert: "", + samlLoginLabel: "Sign in with SAML SSO", + samlAttributeEmail: "email", + samlAttributeName: "name", + }); + const [samlStatus, setSamlStatus] = useState({ type: "", message: "" }); + const [samlLoading, setSamlLoading] = useState(false); + const [samlTestLoading, setSamlTestLoading] = useState(false); + const [samlTestStatus, setSamlTestStatus] = useState({ type: "", message: "" }); + const [showSamlGuide, setShowSamlGuide] = useState(false); + const idpMetadataFileRef = useRef(null); + const certFileRef = useRef(null); + const importFileRef = useRef(null); const [proxyForm, setProxyForm] = useState({ outboundProxyEnabled: false, @@ -58,10 +81,6 @@ export default function ProfilePage() { const [proxyLoading, setProxyLoading] = useState(false); const [proxyTestLoading, setProxyTestLoading] = useState(false); - useEffect(() => { - setLocale(getLocaleFromCookie()); - }, [langOpen]); - useEffect(() => { fetch("/api/settings") .then((res) => res.json()) @@ -75,7 +94,23 @@ export default function ProfilePage() { oidcLoginLabel: data?.oidcLoginLabel || "Sign in with OIDC", }); setOidcClientSecret(""); - if (data?.authMode === "oidc" || data?.authMode === "both") setOidcExpanded(true); + setSsoTypeTab(data?.ssoType || "saml"); + setSamlForm({ + samlEntryPoint: data?.samlEntryPoint || "", + samlIssuer: data?.samlIssuer || "urn:9router:sp", + samlCert: data?.samlCert || "", + samlLoginLabel: data?.samlLoginLabel || "Sign in with SAML SSO", + samlAttributeEmail: data?.samlAttributeEmail || "email", + samlAttributeName: data?.samlAttributeName || "name", + }); + if ( + data?.authMode === "sso" || + data?.authMode === "saml" || + data?.authMode === "oidc" || + data?.authMode === "both" + ) { + setOidcExpanded(true); + } setProxyForm({ outboundProxyEnabled: data?.outboundProxyEnabled === true, outboundProxyUrl: data?.outboundProxyUrl || "", @@ -89,12 +124,6 @@ export default function ProfilePage() { }); }, []); - useEffect(() => { - if (typeof window !== "undefined") { - setOidcRedirectUri(`${window.location.origin}/api/auth/oidc/callback`); - } - }, []); - const updateOutboundProxy = async (e) => { e.preventDefault(); if (settings.outboundProxyEnabled !== true) return; @@ -331,6 +360,7 @@ export default function ProfilePage() { try { const payload = { authMode, + ssoType: "oidc", oidcIssuerUrl: issuerUrl, oidcClientId: clientId, oidcScopes: scopes || "openid profile email", @@ -445,6 +475,159 @@ export default function ProfilePage() { } }; + const updateSamlForm = (field, value) => { + setSamlForm((prev) => ({ ...prev, [field]: value })); + }; + + const handleIdpMetadataUpload = (event) => { + const file = event.target.files?.[0]; + if (idpMetadataFileRef.current) idpMetadataFileRef.current.value = ""; + if (!file) return; + + const reader = new FileReader(); + reader.onload = (e) => { + try { + const xmlText = e.target?.result || ""; + const parser = new DOMParser(); + const doc = parser.parseFromString(xmlText, "text/xml"); + const parserError = doc.querySelector("parsererror"); + if (parserError) { + setSamlStatus({ type: "error", message: "Unable to parse valid SAML IdP metadata from XML file" }); + return; + } + + const entityID = doc.documentElement.getAttribute("entityID") || ""; + const ssoNodes = Array.from(doc.querySelectorAll("SingleSignOnService, *|SingleSignOnService")); + let ssoUrl = ""; + for (const node of ssoNodes) { + const binding = node.getAttribute("Binding") || ""; + const location = node.getAttribute("Location") || ""; + if (location) { + ssoUrl = location; + if (binding.includes("HTTP-Redirect")) break; + } + } + + const certNodes = Array.from(doc.querySelectorAll("X509Certificate, *|X509Certificate")); + let certStr = ""; + if (certNodes.length > 0) { + certStr = certNodes[0].textContent.trim(); + } + + setSamlForm((prev) => ({ + ...prev, + samlEntryPoint: ssoUrl || prev.samlEntryPoint, + samlIssuer: prev.samlIssuer || "urn:9router:sp", + samlCert: certStr || prev.samlCert, + })); + + setSamlStatus({ + type: "success", + message: `IdP Metadata imported! (SSO URL: ${ssoUrl ? "found" : "not found"}, EntityID: ${entityID ? "found" : "not found"}, Cert: ${certStr ? "found" : "not found"})`, + }); + } catch (err) { + setSamlStatus({ type: "error", message: "Error reading IdP Metadata XML file" }); + } + }; + reader.readAsText(file); + }; + + const handleCertFileUpload = (event) => { + const file = event.target.files?.[0]; + if (certFileRef.current) certFileRef.current.value = ""; + if (!file) return; + + const reader = new FileReader(); + reader.onload = (e) => { + const text = e.target?.result || ""; + setSamlForm((prev) => ({ ...prev, samlCert: text.trim() })); + setSamlStatus({ type: "success", message: "Certificate file loaded into configuration." }); + }; + reader.readAsText(file); + }; + + const saveSamlSettings = async (targetAuthMode = oidcForm.authMode || "password") => { + setSamlLoading(true); + setSamlStatus({ type: "", message: "" }); + setSamlTestStatus({ type: "", message: "" }); + + try { + const payload = { + authMode: targetAuthMode, + ssoType: "saml", + samlEntryPoint: samlForm.samlEntryPoint.trim(), + samlIssuer: samlForm.samlIssuer.trim() || "urn:9router:sp", + samlCert: samlForm.samlCert.trim(), + samlLoginLabel: samlForm.samlLoginLabel.trim() || "Sign in with SAML SSO", + samlAttributeEmail: samlForm.samlAttributeEmail.trim() || "email", + samlAttributeName: samlForm.samlAttributeName.trim() || "name", + }; + + const res = await fetch("/api/settings", { + method: "PATCH", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(payload), + }); + + const data = await res.json(); + if (res.ok) { + setSettings((prev) => ({ ...prev, ...data })); + setSamlForm({ + samlEntryPoint: data?.samlEntryPoint || payload.samlEntryPoint, + samlIssuer: data?.samlIssuer || payload.samlIssuer, + samlCert: data?.samlCert || payload.samlCert, + samlLoginLabel: data?.samlLoginLabel || payload.samlLoginLabel, + samlAttributeEmail: data?.samlAttributeEmail || payload.samlAttributeEmail, + samlAttributeName: data?.samlAttributeName || payload.samlAttributeName, + }); + setSamlStatus({ + type: "success", + message: + targetAuthMode === "sso" || targetAuthMode === "saml" + ? "SAML SSO login enabled" + : targetAuthMode === "both" + ? "Password and SAML SSO login enabled" + : "SAML 2.0 settings saved", + }); + } else { + setSamlStatus({ type: "error", message: data.error || "Failed to save SAML settings" }); + } + } catch { + setSamlStatus({ type: "error", message: "An error occurred while saving SAML settings" }); + } finally { + setSamlLoading(false); + } + }; + + const testSamlConnection = async () => { + setSamlTestLoading(true); + setSamlStatus({ type: "", message: "" }); + setSamlTestStatus({ type: "", message: "" }); + + try { + const res = await fetch("/api/auth/saml/test", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + samlEntryPoint: samlForm.samlEntryPoint.trim(), + samlIssuer: samlForm.samlIssuer.trim(), + samlCert: samlForm.samlCert.trim(), + }), + }); + + const data = await res.json(); + if (res.ok && data.ok) { + setSamlTestStatus({ type: "success", message: data.message || "SAML configuration verified!" }); + } else { + setSamlTestStatus({ type: "error", message: data.error || "SAML configuration test failed" }); + } + } catch { + setSamlTestStatus({ type: "error", message: "An error occurred while testing SAML configuration" }); + } finally { + setSamlTestLoading(false); + } + }; + const updateObservabilityEnabled = async (enabled) => { try { const res = await fetch("/api/settings", { @@ -752,7 +935,7 @@ export default function ProfilePage() { - {/* OIDC */} + {/* Single Sign-On (SSO) */} {oidcExpanded && ( -
-

- Use Authentik or any OIDC provider to sign in to the dashboard. You can enable password-only, OIDC-only, or both for the dashboard; model API access still uses API keys. -

+
+

+ Configure enterprise Single Sign-On (SSO) for dashboard access using SAML 2.0 or OIDC. +

-
- -
- {[ - { - value: "password", - title: "Password only", - desc: "Keep the legacy password login.", - }, - { - value: "oidc", - title: "OIDC only", - desc: "Require OIDC for dashboard access.", - }, - { - value: "both", - title: "Both", - desc: "Allow either password or OIDC.", - }, - ].map((option) => { - const active = oidcForm.authMode === option.value; - return ( + {/* SSO Protocol Switcher Tabs */} +
+ +
+ + +
+
+ + {/* Auth Mode selection */} +
+ +
+ {[ + { + value: "password", + title: "Password only", + desc: "Keep legacy password login.", + }, + { + value: "sso", + title: `${ssoTypeTab === "saml" ? "SAML" : "OIDC"} only`, + desc: "Require SSO for dashboard access.", + }, + { + value: "both", + title: "Both", + desc: "Allow password or SSO login.", + }, + ].map((option) => { + const currentMode = oidcForm.authMode; + const active = + option.value === "password" + ? currentMode === "password" + : option.value === "sso" + ? currentMode === "sso" || currentMode === "saml" || currentMode === "oidc" + : currentMode === "both"; + return ( + + ); + })} +
+
+ + {ssoTypeTab === "saml" ? ( + /* SAML Configuration Panel */ +
+ {/* IdP Setup Guidelines Banner & Collapsible Drawer */} +
- ); - })} -
+ + {showSamlGuide && ( +
+
+

🔑 Required Service Provider (SP) Values for your IdP Setup:

+
    +
  • + Assertion Consumer Service (ACS) URL:{" "} + {samlAcsUrl} +
  • +
  • + SP Entity ID / Audience URI:{" "} + {samlForm.samlIssuer || "urn:9router:sp"} +
  • +
  • + NameID Format:{" "} + EmailAddress or Unspecified +
  • +
+
+ +
+
+

+ ☁️ AWS IAM Identity Center +

+
    +
  1. Applications → Add application → Select Add custom SAML 2.0 application.
  2. +
  3. Set Application ACS URL to {samlAcsUrl}.
  4. +
  5. Set Application SAML audience to {samlForm.samlIssuer || "urn:9router:sp"}.
  6. +
  7. Under Attribute mappings, map Subject or email to ${`{user:email}`}.
  8. +
  9. Download IAM Identity Center SAML metadata XML file and use 1-Click Import below!
  10. +
+
+ +
+

+ 🔷 Microsoft Entra ID (Azure AD) +

+
    +
  1. Enterprise Applications → New applicationCreate your own application.
  2. +
  3. Select Single sign-onSAML.
  4. +
  5. Identifier (Entity ID): {samlForm.samlIssuer || "urn:9router:sp"}
  6. +
  7. Reply URL (ACS): {samlAcsUrl}
  8. +
  9. Download Federation Metadata XML and import or copy X.509 Certificate.
  10. +
+
+ +
+

+ 🟢 Okta / Auth0 +

+
    +
  1. Applications → Create App Integration → Select SAML 2.0.
  2. +
  3. Single Sign-On URL: {samlAcsUrl}
  4. +
  5. Audience URI (SP Entity ID): {samlForm.samlIssuer || "urn:9router:sp"}
  6. +
  7. Name ID format: EmailAddress.
  8. +
  9. Download Identity Provider metadata XML or copy the X.509 cert.
  10. +
+
+ +
+

+ 🛡️ Keycloak / Authentik +

+
    +
  1. Clients → Create client → Select SAML.
  2. +
  3. Client ID: {samlForm.samlIssuer || "urn:9router:sp"}
  4. +
  5. Master SAML Processing URL: {samlAcsUrl}
  6. +
  7. Export SAML Descriptor XML or copy IDP Certificate PEM.
  8. +
+
+
+
+ )} +
+ + {/* Quick Import Card */} +
+
+

1-Click IdP Metadata XML Import

+

Auto-fill SSO URL, Issuer & Cert from XML metadata

+
+ + +
+ +
+
+ + updateSamlForm("samlEntryPoint", e.target.value)} + disabled={loading || samlLoading} + /> +
+ +
+ + updateSamlForm("samlIssuer", e.target.value)} + disabled={loading || samlLoading} + /> +
+ +
+
+ + + +
+