feat(enterprise): add SAML 2.0 SSO with SP-initiated login

Implements SAML SSO using @node-saml/node-saml, gated behind
SAML_ENABLED env var and the saml_sso enterprise license feature.

- SAML env vars (entity ID, callback URL, IdP SSO URL, IdP cert,
  auto-create/auto-link users, default role, provider name,
  username/email attribute mapping) with validation in superRefine
- SAML plugin with three routes: metadata (GET), login (GET),
  and ACS callback (POST with form-urlencoded content type parser)
- Callback uses the shared external-auth resolver for user
  resolution (same pattern as OIDC: match/link/create/deny)
- Auth config endpoint exposes samlEnabled and samlProviderName
- Session loginMethod detection updated for SAML auth provider
- Frontend login page shows SAML SSO button when enabled
- i18n strings for SAML error messages across all 21 locales
This commit is contained in:
SnapOtter
2026-06-13 22:27:56 +08:00
parent 6920035f5a
commit 54132d1833
27 changed files with 383 additions and 13 deletions
+5
View File
@@ -2997,6 +2997,11 @@ export const ar: TranslationKeys = {
oidcUserNotAuthorized: "حسابك غير مصرح له بالوصول إلى هذا التطبيق. تواصل مع المسؤول.",
oidcUserLimitReached: "تم الوصول لحد المستخدمين. تواصل مع المسؤول.",
oidcGenericError: "خطأ في المصادقة. يرجى المحاولة مرة أخرى.",
samlAuthFailed: "SAML authentication failed. Please try again.",
samlUserNotAuthorized:
"Your account is not authorized to access this application. Contact your administrator.",
samlUserLimitReached: "User limit reached. Contact your administrator.",
methodSaml: "SAML",
passwordManagedByProvider: "يتم إدارة تغيير كلمة المرور بواسطة مزود الهوية الخاص بك.",
enterUsername: "أدخل اسم المستخدم",
enterPassword: "أدخل كلمة المرور",