@burdenoff/microfe-auth 2026.917.2 → 2026.1005.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/dist/auth/AuthRoot.d.ts +0 -1
  2. package/dist/auth/AuthRoot.js.map +1 -1
  3. package/dist/auth/AuthRoutes.d.ts +1 -1
  4. package/dist/auth/AuthRoutes.js.map +1 -1
  5. package/dist/auth/components/AuthIcons.d.ts +12 -13
  6. package/dist/auth/components/AuthIcons.js.map +1 -1
  7. package/dist/auth/components/AuthLayout.d.ts +1 -2
  8. package/dist/auth/components/AuthLayout.js.map +1 -1
  9. package/dist/auth/components/CaptchaV2.d.ts +1 -1
  10. package/dist/auth/components/CaptchaV2.js +2 -2
  11. package/dist/auth/components/CaptchaV2.js.map +1 -1
  12. package/dist/auth/components/ConfirmActionDialog.d.ts +1 -1
  13. package/dist/auth/components/ConfirmActionDialog.js.map +1 -1
  14. package/dist/auth/components/profile/UserProfileMenu.d.ts +1 -1
  15. package/dist/auth/components/profile/UserProfileMenu.js.map +1 -1
  16. package/dist/auth/components/workspace/WorkspaceSelector.d.ts +1 -2
  17. package/dist/auth/components/workspace/WorkspaceSelector.js.map +1 -1
  18. package/dist/auth/constants/permissions.js.map +1 -1
  19. package/dist/auth/hooks/useAccountOperations.d.ts +0 -1
  20. package/dist/auth/hooks/useAccountOperations.js.map +1 -1
  21. package/dist/auth/hooks/useActiveContextBootstrapMirror.js.map +1 -1
  22. package/dist/auth/hooks/useApiKeyOperations.d.ts +1 -2
  23. package/dist/auth/hooks/useAppOperations.d.ts +1 -2
  24. package/dist/auth/hooks/useAuthOperations.d.ts +0 -1
  25. package/dist/auth/hooks/useAuthOperations.js.map +1 -1
  26. package/dist/auth/hooks/useAuthPermissions.js.map +1 -1
  27. package/dist/auth/hooks/useCaptchaV3.js +1 -1
  28. package/dist/auth/hooks/useCaptchaV3.js.map +1 -1
  29. package/dist/auth/hooks/useContextSwitcherData.d.ts +1 -1
  30. package/dist/auth/hooks/useContextSwitcherData.js +356 -234
  31. package/dist/auth/hooks/useContextSwitcherData.js.map +1 -1
  32. package/dist/auth/hooks/useDelegationOperations.d.ts +0 -1
  33. package/dist/auth/hooks/useMfaOperations.d.ts +0 -1
  34. package/dist/auth/hooks/useMfaOperations.js.map +1 -1
  35. package/dist/auth/hooks/useMyWorkspaces.d.ts +0 -1
  36. package/dist/auth/hooks/useMyWorkspaces.js.map +1 -1
  37. package/dist/auth/hooks/useOAuthOperations.d.ts +0 -1
  38. package/dist/auth/hooks/useOAuthOperations.js +2 -2
  39. package/dist/auth/hooks/useOAuthOperations.js.map +1 -1
  40. package/dist/auth/hooks/usePasswordOperations.d.ts +0 -1
  41. package/dist/auth/hooks/usePasswordOperations.js.map +1 -1
  42. package/dist/auth/hooks/useSessionOperations.d.ts +0 -1
  43. package/dist/auth/hooks/useSessionOperations.js.map +1 -1
  44. package/dist/auth/hooks/useSignupCaptcha.js +1 -1
  45. package/dist/auth/hooks/useSignupCaptcha.js.map +1 -1
  46. package/dist/auth/hooks/useSsoOperations.d.ts +0 -1
  47. package/dist/auth/hooks/useSsoOperations.js.map +1 -1
  48. package/dist/auth/hooks/useTokenRefresh.js.map +1 -1
  49. package/dist/auth/hooks/useUserOperations.d.ts +0 -1
  50. package/dist/auth/hooks/useUserOperations.js.map +1 -1
  51. package/dist/auth/hooks/useWorkspaceOperations.d.ts +0 -1
  52. package/dist/auth/hooks/useWorkspaceOperations.js.map +1 -1
  53. package/dist/auth/hooks/useWorkspaceToken.js.map +1 -1
  54. package/dist/auth/pages/AuditLogPage.d.ts +1 -1
  55. package/dist/auth/pages/AuditLogPage.js.map +1 -1
  56. package/dist/auth/pages/EmailVerifyPage.d.ts +1 -1
  57. package/dist/auth/pages/EmailVerifyPage.js.map +1 -1
  58. package/dist/auth/pages/LoginPage.d.ts +1 -1
  59. package/dist/auth/pages/LoginPage.js.map +1 -1
  60. package/dist/auth/pages/MagicLinkPage.d.ts +1 -1
  61. package/dist/auth/pages/MagicLinkPage.js.map +1 -1
  62. package/dist/auth/pages/MfaSetupPage.d.ts +1 -1
  63. package/dist/auth/pages/MfaSetupPage.js +88 -88
  64. package/dist/auth/pages/MfaSetupPage.js.map +1 -1
  65. package/dist/auth/pages/MfaVerifyPage.d.ts +1 -1
  66. package/dist/auth/pages/MfaVerifyPage.js.map +1 -1
  67. package/dist/auth/pages/OAuthCallbackPage.d.ts +1 -1
  68. package/dist/auth/pages/OAuthCallbackPage.js.map +1 -1
  69. package/dist/auth/pages/PasswordResetPage.d.ts +1 -1
  70. package/dist/auth/pages/PasswordResetPage.js.map +1 -1
  71. package/dist/auth/pages/ReactivatePage.d.ts +1 -1
  72. package/dist/auth/pages/ReactivatePage.js.map +1 -1
  73. package/dist/auth/pages/RegisterPage.d.ts +1 -1
  74. package/dist/auth/pages/RegisterPage.js.map +1 -1
  75. package/dist/auth/pages/SSOClearPage.d.ts +1 -1
  76. package/dist/auth/pages/SSOClearPage.js.map +1 -1
  77. package/dist/auth/pages/SSODepositPage.d.ts +1 -1
  78. package/dist/auth/pages/SSODepositPage.js.map +1 -1
  79. package/dist/auth/pages/SSORelayCallbackPage.d.ts +1 -1
  80. package/dist/auth/pages/SSORelayCallbackPage.js.map +1 -1
  81. package/dist/auth/pages/SSORelayPage.d.ts +1 -1
  82. package/dist/auth/pages/SSORelayPage.js.map +1 -1
  83. package/dist/auth/pages/SecurityPage.d.ts +1 -1
  84. package/dist/auth/pages/SecurityPage.js.map +1 -1
  85. package/dist/auth/pages/SessionBridgePage.d.ts +1 -1
  86. package/dist/auth/pages/SessionBridgePage.js.map +1 -1
  87. package/dist/auth/pages/SessionsPage.d.ts +1 -1
  88. package/dist/auth/pages/SessionsPage.js.map +1 -1
  89. package/dist/auth/pages/SsoCallbackPage.d.ts +1 -1
  90. package/dist/auth/pages/SsoCallbackPage.js.map +1 -1
  91. package/dist/auth/pages/SsoConfigPage.d.ts +1 -1
  92. package/dist/auth/pages/SsoConfigPage.js.map +1 -1
  93. package/dist/auth/pages/SsoLoginPage.d.ts +1 -1
  94. package/dist/auth/pages/SsoLoginPage.js.map +1 -1
  95. package/dist/auth/pages/UserDetailsPage.d.ts +1 -1
  96. package/dist/auth/pages/UserDetailsPage.js.map +1 -1
  97. package/dist/auth/pages/UserProfilePage.d.ts +1 -1
  98. package/dist/auth/pages/UserProfilePage.js.map +1 -1
  99. package/dist/auth/pages/UsersPage.d.ts +1 -1
  100. package/dist/auth/pages/UsersPage.js.map +1 -1
  101. package/dist/auth/providers/AuthProvider.d.ts +0 -1
  102. package/dist/auth/providers/AuthProvider.js.map +1 -1
  103. package/dist/auth/providers/CaptchaProvider.d.ts +1 -2
  104. package/dist/auth/providers/CaptchaProvider.js +2 -2
  105. package/dist/auth/providers/CaptchaProvider.js.map +1 -1
  106. package/dist/auth/store/authStore.d.ts +0 -1
  107. package/dist/auth/store/authStore.js.map +1 -1
  108. package/dist/auth/types/index.d.ts +0 -1
  109. package/dist/auth/utils/captchaConfig.js.map +1 -1
  110. package/dist/auth/utils/formatters.js.map +1 -1
  111. package/dist/auth/utils/gatewayBaseUrls.js.map +1 -1
  112. package/dist/auth/utils/legalUrls.d.ts +1 -1
  113. package/dist/auth/utils/legalUrls.js.map +1 -1
  114. package/dist/auth/utils/redirect.js.map +1 -1
  115. package/dist/auth/utils/ssoOrigins.js +1 -1
  116. package/dist/auth/utils/ssoOrigins.js.map +1 -1
  117. package/dist/auth/utils/validation.d.ts +0 -1
  118. package/dist/auth/utils/validation.js.map +1 -1
  119. package/dist/dev/main.d.ts +0 -1
  120. package/dist/generated/global-operations.js.map +1 -1
  121. package/dist/generated/wspace-operations.js.map +1 -1
  122. package/dist/index.d.ts +0 -1
  123. package/dist/shared/hooks/useTr.js.map +1 -1
  124. package/dist/shared/types/index.d.ts +0 -1
  125. package/dist/translations/en.js.map +1 -1
  126. package/package.json +27 -20
  127. package/dist/_virtual/_rolldown/runtime.js +0 -13
  128. package/dist/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js +0 -70
  129. package/dist/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js.map +0 -1
  130. package/dist/node_modules/object-assign/index.js +0 -41
  131. package/dist/node_modules/object-assign/index.js.map +0 -1
  132. package/dist/node_modules/prop-types/checkPropTypes.js +0 -46
  133. package/dist/node_modules/prop-types/checkPropTypes.js.map +0 -1
  134. package/dist/node_modules/prop-types/factoryWithThrowingShims.js +0 -49
  135. package/dist/node_modules/prop-types/factoryWithThrowingShims.js.map +0 -1
  136. package/dist/node_modules/prop-types/factoryWithTypeCheckers.js +0 -272
  137. package/dist/node_modules/prop-types/factoryWithTypeCheckers.js.map +0 -1
  138. package/dist/node_modules/prop-types/index.js +0 -16
  139. package/dist/node_modules/prop-types/index.js.map +0 -1
  140. package/dist/node_modules/prop-types/lib/ReactPropTypesSecret.js +0 -10
  141. package/dist/node_modules/prop-types/lib/ReactPropTypesSecret.js.map +0 -1
  142. package/dist/node_modules/prop-types/lib/has.js +0 -10
  143. package/dist/node_modules/prop-types/lib/has.js.map +0 -1
  144. package/dist/node_modules/qrcode.react/lib/esm/index.js +0 -959
  145. package/dist/node_modules/qrcode.react/lib/esm/index.js.map +0 -1
  146. package/dist/node_modules/react-async-script/lib/esm/async-script-loader.js +0 -114
  147. package/dist/node_modules/react-async-script/lib/esm/async-script-loader.js.map +0 -1
  148. package/dist/node_modules/react-google-recaptcha/lib/esm/index.js +0 -8
  149. package/dist/node_modules/react-google-recaptcha/lib/esm/index.js.map +0 -1
  150. package/dist/node_modules/react-google-recaptcha/lib/esm/recaptcha-wrapper.js +0 -20
  151. package/dist/node_modules/react-google-recaptcha/lib/esm/recaptcha-wrapper.js.map +0 -1
  152. package/dist/node_modules/react-google-recaptcha/lib/esm/recaptcha.js +0 -148
  153. package/dist/node_modules/react-google-recaptcha/lib/esm/recaptcha.js.map +0 -1
  154. package/dist/node_modules/react-google-recaptcha-v3/dist/react-google-recaptcha-v3.esm.js +0 -445
  155. package/dist/node_modules/react-google-recaptcha-v3/dist/react-google-recaptcha-v3.esm.js.map +0 -1
  156. package/dist/node_modules/react-is/cjs/react-is.development.js +0 -84
  157. package/dist/node_modules/react-is/cjs/react-is.development.js.map +0 -1
  158. package/dist/node_modules/react-is/cjs/react-is.production.min.js +0 -64
  159. package/dist/node_modules/react-is/cjs/react-is.production.min.js.map +0 -1
  160. package/dist/node_modules/react-is/index.js +0 -12
  161. package/dist/node_modules/react-is/index.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"SsoCallbackPage.js","names":[],"sources":["../../../src/auth/pages/SsoCallbackPage.tsx"],"sourcesContent":["import { useEffect, useState, useRef } from \"react\";\nimport { useTr } from \"../../shared/hooks/useTr\";\nimport { useNavigate, useSearchParams } from \"react-router\";\nimport { useAuthStore } from \"../store/authStore\";\nimport { useSsoOperations } from \"../hooks/useSsoOperations\";\nimport { Button } from \"@burdenoff/fe-libs/button\";\nimport { SpinnerIcon, AlertIcon } from \"../components/AuthIcons\";\n\n/**\n * SSO Callback Page\n * Handles redirects from:\n * - SAML ACS server (with token/refreshToken in query params)\n * - OIDC Authorization Server (with code/state in query params)\n */\nexport function SsoCallbackPage() {\n const tr = useTr();\n\n const navigate = useNavigate();\n const [searchParams] = useSearchParams();\n const setAuthTokens = useAuthStore((state) => state.setAuthTokens);\n const setAuthenticated = useAuthStore((state) => state.setAuthenticated);\n const {\n exchangeOidcCode,\n validateOidcState,\n isExternalOidcCallback,\n handleExternalOidcCallback,\n } = useSsoOperations();\n\n const [error, setError] = useState<string | null>(null);\n const [status, setStatus] = useState<\"processing\" | \"success\" | \"error\">(\n \"processing\",\n );\n const [callbackType, setCallbackType] = useState<\"saml\" | \"oidc\" | \"unknown\">(\n \"unknown\",\n );\n const processedRef = useRef(false);\n const redirectTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n // Prevent double execution in React StrictMode\n if (processedRef.current) {\n return;\n }\n processedRef.current = true;\n\n const processCallback = async () => {\n try {\n // Check for error from either SSO provider\n const errorParam = searchParams.get(\"error\");\n const errorMessage =\n searchParams.get(\"message\") || searchParams.get(\"error_description\");\n\n if (errorParam) {\n throw new Error(\n errorMessage || `SSO authentication failed: ${errorParam}`,\n );\n }\n\n // Detect callback type based on query parameters\n const token = searchParams.get(\"token\");\n const code = searchParams.get(\"code\");\n const state = searchParams.get(\"state\");\n\n if (token) {\n // SAML callback - token already exchanged by ACS server\n setCallbackType(\"saml\");\n await handleSamlCallback(token);\n } else if (code) {\n // OIDC callback - need to exchange code for tokens\n setCallbackType(\"oidc\");\n await handleOidcCallback(code, state);\n } else {\n throw new Error(\n \"Invalid SSO callback. No token or authorization code received.\",\n );\n }\n } catch (err) {\n console.error(\"[SSO Callback] Error:\", err);\n setError(\n err instanceof Error ? err.message : \"Failed to process SSO response\",\n );\n setStatus(\"error\");\n }\n };\n\n /**\n * Handle SAML callback from ACS server\n * Token is already exchanged, just store and redirect\n * Also handles MFA if required\n */\n const handleSamlCallback = async (token: string) => {\n const refreshToken = searchParams.get(\"refreshToken\");\n const redirect = searchParams.get(\"redirect\");\n const requiresMFA = searchParams.get(\"requiresMFA\") === \"true\";\n const mfaChallengeId = searchParams.get(\"mfaChallengeId\");\n\n // Check if MFA is required\n if (requiresMFA && mfaChallengeId) {\n // Store partial auth state and MFA info\n sessionStorage.setItem(\"mfa_challenge_id\", mfaChallengeId);\n sessionStorage.setItem(\"mfa_pending_token\", token);\n sessionStorage.setItem(\"mfa_pending_refresh\", refreshToken || \"\");\n sessionStorage.setItem(\"mfa_redirect\", redirect || \"/dashboard\");\n\n // Redirect to MFA verification\n navigate(\"/auth/mfa-verify\", { replace: true });\n return;\n }\n\n // Store tokens\n setAuthTokens(token, refreshToken || \"\");\n setAuthenticated(true);\n\n setStatus(\"success\");\n\n // Redirect to the specified URL or default to dashboard\n redirectTimerRef.current = setTimeout(() => {\n const redirectUrl = redirect || \"/dashboard\";\n navigate(redirectUrl, { replace: true });\n }, 1500);\n };\n\n /**\n * Handle OIDC callback - exchange code for tokens\n */\n const handleOidcCallback = async (code: string, state: string | null) => {\n // Cache the OIDC redirect target — used in both the MFA branch and the\n // success branch, plus removed once at the end of the flow.\n const oidcRedirect = sessionStorage.getItem(\"oidc_redirect\");\n const isExternal = isExternalOidcCallback();\n\n // Check if this is an external OIDC flow (Azure AD, Google, etc.)\n if (isExternal) {\n if (!state) {\n throw new Error(\"State parameter is required for external OIDC flow\");\n }\n\n // Use the external OIDC handler\n const result = await handleExternalOidcCallback(code, state);\n\n if (!result.success) {\n throw new Error(\n result.error ||\n \"Failed to authenticate with external OIDC provider\",\n );\n }\n\n setStatus(\"success\");\n\n // Redirect after brief success message using the redirect path from result\n const redirectUrl = result.redirectPath || \"/dashboard\";\n redirectTimerRef.current = setTimeout(() => {\n navigate(redirectUrl, { replace: true });\n }, 1500);\n return;\n }\n\n // Internal OIDC flow (our auth service as provider)\n // Validate state to prevent CSRF\n if (state && !validateOidcState(state)) {\n throw new Error(\n \"Invalid state parameter. This may be a CSRF attack. Please try logging in again.\",\n );\n }\n\n // Get client configuration from session storage\n const clientId =\n sessionStorage.getItem(\"oidc_client_id\") || \"default-client\";\n const redirectUri = window.location.origin + \"/auth/sso/callback\";\n\n // Exchange code for tokens\n const result = await exchangeOidcCode(code, clientId, redirectUri);\n\n if (!result.success) {\n throw new Error(\n result.error || \"Failed to exchange authorization code\",\n );\n }\n\n // Check if MFA is required after OIDC authentication\n if (result.requiresMFA && result.mfaChallengeId) {\n // Store MFA challenge info for the verification page\n sessionStorage.setItem(\"mfa_challenge_id\", result.mfaChallengeId);\n sessionStorage.setItem(\"mfa_redirect\", oidcRedirect || \"/dashboard\");\n\n // Clean up OIDC session data\n sessionStorage.removeItem(\"oidc_redirect\");\n sessionStorage.removeItem(\"oidc_client_id\");\n\n // Redirect to MFA verification\n navigate(\"/auth/mfa-verify\", { replace: true });\n return;\n }\n\n setStatus(\"success\");\n\n // Get redirect URL from state or session storage\n const redirect = oidcRedirect || \"/dashboard\";\n sessionStorage.removeItem(\"oidc_redirect\");\n sessionStorage.removeItem(\"oidc_client_id\");\n\n // Redirect after brief success message\n redirectTimerRef.current = setTimeout(() => {\n navigate(redirect, { replace: true });\n }, 1500);\n };\n\n processCallback();\n const timerRefCapture = redirectTimerRef;\n return () => {\n if (timerRefCapture.current) {\n clearTimeout(timerRefCapture.current);\n timerRefCapture.current = null;\n }\n };\n }, [\n searchParams,\n navigate,\n setAuthTokens,\n setAuthenticated,\n exchangeOidcCode,\n validateOidcState,\n isExternalOidcCallback,\n handleExternalOidcCallback,\n ]);\n\n return (\n <div className=\"min-h-screen flex items-center justify-center bg-bg-canvas p-4\">\n <div className=\"w-full max-w-md\">\n <div className=\"bg-bg-surface rounded-2xl shadow-xl p-8 text-center\">\n {/* Logo */}\n <div className=\"mb-6\">\n <div className=\"auth-brand-badge mx-auto flex size-16 items-center justify-center rounded-xl\">\n <svg\n className=\"size-8 text-white\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z\"\n />\n </svg>\n </div>\n </div>\n\n {/* Processing State */}\n {status === \"processing\" && (\n <>\n <h1 className=\"text-2xl font-semibold text-text-primary mb-4\">\n {tr(\"auth.ssoCallback.completing\", \"Completing Sign In\")}\n </h1>\n <p className=\"text-text-secondary mb-6\">\n {callbackType === \"oidc\"\n ? tr(\n \"auth.ssoCallback.exchangingCode\",\n \"Exchanging authorization code for access tokens...\",\n )\n : callbackType === \"saml\"\n ? tr(\n \"auth.ssoCallback.validatingSaml\",\n \"Validating your SAML credentials...\",\n )\n : tr(\n \"auth.ssoCallback.validatingCreds\",\n \"Validating your credentials from your identity provider...\",\n )}\n </p>\n <div className=\"flex justify-center\">\n <SpinnerIcon className=\"size-10 text-text-link animate-spin\" />\n </div>\n </>\n )}\n\n {/* Success State */}\n {status === \"success\" && (\n <>\n <div className=\"size-16 mx-auto mb-4 rounded-full bg-status-success-bg-subtle flex items-center justify-center\">\n <svg\n className=\"size-8 text-status-success-text\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n </div>\n <h1 className=\"text-2xl font-semibold text-text-primary mb-4\">\n {tr(\"auth.ssoCallback.success\", \"Sign In Successful\")}\n </h1>\n <p className=\"text-text-secondary mb-6\">\n {callbackType === \"oidc\"\n ? tr(\n \"auth.ssoCallback.oidcComplete\",\n \"OIDC authentication complete. Redirecting...\",\n )\n : callbackType === \"saml\"\n ? tr(\n \"auth.ssoCallback.samlComplete\",\n \"SAML authentication complete. Redirecting...\",\n )\n : tr(\n \"auth.ssoCallback.authSuccess\",\n \"You have been authenticated successfully. Redirecting...\",\n )}\n </p>\n <div className=\"flex justify-center\">\n <SpinnerIcon className=\"size-6 text-status-success-text animate-spin\" />\n </div>\n </>\n )}\n\n {/* Error State */}\n {status === \"error\" && (\n <>\n <div className=\"size-16 mx-auto mb-4 rounded-full bg-status-error-bg-subtle flex items-center justify-center\">\n <AlertIcon className=\"size-8 text-status-error-text\" />\n </div>\n <h1 className=\"text-2xl font-semibold text-text-primary mb-4\">\n {tr(\"auth.ssoCallback.failed\", \"Sign In Failed\")}\n </h1>\n <p className=\"text-status-error-text mb-6 text-sm\">{error}</p>\n <div className=\"space-y-3\">\n <Button\n type=\"button\"\n onClick={() => navigate(\"/auth/sso/login\", { replace: true })}\n variant=\"default\"\n size=\"lg\"\n className=\"w-full font-semibold\"\n >\n {tr(\"auth.ssoCallback.tryAgain\", \"Try Again\")}\n </Button>\n <button\n type=\"button\"\n onClick={() => navigate(\"/auth/login\", { replace: true })}\n className=\"w-full px-6 py-3 rounded-xl border border-border-default text-text-primary font-medium hover:bg-bg-sunken transition-colors\"\n >\n {tr(\"auth.ssoCallback.backToLogin\", \"Back to Login\")}\n </button>\n </div>\n </>\n )}\n\n {/* SSO Type Badge */}\n {callbackType !== \"unknown\" && (\n <div className=\"mt-6\">\n <span\n className={`inline-flex items-center px-3 py-1 rounded-full text-xs font-medium ${\n callbackType === \"oidc\"\n ? \"bg-accent-purple-subtle text-accent-purple\"\n : \"bg-status-info-bg-subtle text-text-linkHover\"\n }`}\n >\n {callbackType === \"oidc\" ? \"OpenID Connect\" : \"SAML 2.0\"}\n </span>\n </div>\n )}\n\n {/* Help Text */}\n <div className=\"mt-8 pt-6 border-t border-border-subtle\">\n <p className=\"text-xs text-text-secondary\">\n {tr(\n \"auth.ssoCallback.helpText\",\n \"Having trouble? Contact your organization's IT administrator for assistance with SSO login.\",\n )}\n </p>\n </div>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"SsoCallbackPage.js","names":[],"sources":["../../../src/auth/pages/SsoCallbackPage.tsx"],"sourcesContent":["import { useEffect, useState, useRef } from \"react\";\nimport { useTr } from \"../../shared/hooks/useTr\";\nimport { useNavigate, useSearchParams } from \"react-router\";\nimport { useAuthStore } from \"../store/authStore\";\nimport { useSsoOperations } from \"../hooks/useSsoOperations\";\nimport { Button } from \"@burdenoff/fe-libs/button\";\nimport { SpinnerIcon, AlertIcon } from \"../components/AuthIcons\";\n\n/**\n * SSO Callback Page\n * Handles redirects from:\n * - SAML ACS server (with token/refreshToken in query params)\n * - OIDC Authorization Server (with code/state in query params)\n */\nexport function SsoCallbackPage() {\n const tr = useTr();\n\n const navigate = useNavigate();\n const [searchParams] = useSearchParams();\n const setAuthTokens = useAuthStore((state) => state.setAuthTokens);\n const setAuthenticated = useAuthStore((state) => state.setAuthenticated);\n const {\n exchangeOidcCode,\n validateOidcState,\n isExternalOidcCallback,\n handleExternalOidcCallback,\n } = useSsoOperations();\n\n const [error, setError] = useState<string | null>(null);\n const [status, setStatus] = useState<\"processing\" | \"success\" | \"error\">(\n \"processing\",\n );\n const [callbackType, setCallbackType] = useState<\"saml\" | \"oidc\" | \"unknown\">(\n \"unknown\",\n );\n const processedRef = useRef(false);\n const redirectTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n // Prevent double execution in React StrictMode\n if (processedRef.current) {\n return;\n }\n processedRef.current = true;\n\n const processCallback = async () => {\n try {\n // Check for error from either SSO provider\n const errorParam = searchParams.get(\"error\");\n const errorMessage =\n searchParams.get(\"message\") || searchParams.get(\"error_description\");\n\n if (errorParam) {\n throw new Error(\n errorMessage || `SSO authentication failed: ${errorParam}`,\n );\n }\n\n // Detect callback type based on query parameters\n const token = searchParams.get(\"token\");\n const code = searchParams.get(\"code\");\n const state = searchParams.get(\"state\");\n\n if (token) {\n // SAML callback - token already exchanged by ACS server\n setCallbackType(\"saml\");\n await handleSamlCallback(token);\n } else if (code) {\n // OIDC callback - need to exchange code for tokens\n setCallbackType(\"oidc\");\n await handleOidcCallback(code, state);\n } else {\n throw new Error(\n \"Invalid SSO callback. No token or authorization code received.\",\n );\n }\n } catch (err) {\n console.error(\"[SSO Callback] Error:\", err);\n setError(\n err instanceof Error ? err.message : \"Failed to process SSO response\",\n );\n setStatus(\"error\");\n }\n };\n\n /**\n * Handle SAML callback from ACS server\n * Token is already exchanged, just store and redirect\n * Also handles MFA if required\n */\n const handleSamlCallback = async (token: string) => {\n const refreshToken = searchParams.get(\"refreshToken\");\n const redirect = searchParams.get(\"redirect\");\n const requiresMFA = searchParams.get(\"requiresMFA\") === \"true\";\n const mfaChallengeId = searchParams.get(\"mfaChallengeId\");\n\n // Check if MFA is required\n if (requiresMFA && mfaChallengeId) {\n // Store partial auth state and MFA info\n sessionStorage.setItem(\"mfa_challenge_id\", mfaChallengeId);\n sessionStorage.setItem(\"mfa_pending_token\", token);\n sessionStorage.setItem(\"mfa_pending_refresh\", refreshToken || \"\");\n sessionStorage.setItem(\"mfa_redirect\", redirect || \"/dashboard\");\n\n // Redirect to MFA verification\n navigate(\"/auth/mfa-verify\", { replace: true });\n return;\n }\n\n // Store tokens\n setAuthTokens(token, refreshToken || \"\");\n setAuthenticated(true);\n\n setStatus(\"success\");\n\n // Redirect to the specified URL or default to dashboard\n redirectTimerRef.current = setTimeout(() => {\n const redirectUrl = redirect || \"/dashboard\";\n navigate(redirectUrl, { replace: true });\n }, 1500);\n };\n\n /**\n * Handle OIDC callback - exchange code for tokens\n */\n const handleOidcCallback = async (code: string, state: string | null) => {\n // Cache the OIDC redirect target — used in both the MFA branch and the\n // success branch, plus removed once at the end of the flow.\n const oidcRedirect = sessionStorage.getItem(\"oidc_redirect\");\n const isExternal = isExternalOidcCallback();\n\n // Check if this is an external OIDC flow (Azure AD, Google, etc.)\n if (isExternal) {\n if (!state) {\n throw new Error(\"State parameter is required for external OIDC flow\");\n }\n\n // Use the external OIDC handler\n const result = await handleExternalOidcCallback(code, state);\n\n if (!result.success) {\n throw new Error(\n result.error ||\n \"Failed to authenticate with external OIDC provider\",\n );\n }\n\n setStatus(\"success\");\n\n // Redirect after brief success message using the redirect path from result\n const redirectUrl = result.redirectPath || \"/dashboard\";\n redirectTimerRef.current = setTimeout(() => {\n navigate(redirectUrl, { replace: true });\n }, 1500);\n return;\n }\n\n // Internal OIDC flow (our auth service as provider)\n // Validate state to prevent CSRF\n if (state && !validateOidcState(state)) {\n throw new Error(\n \"Invalid state parameter. This may be a CSRF attack. Please try logging in again.\",\n );\n }\n\n // Get client configuration from session storage\n const clientId =\n sessionStorage.getItem(\"oidc_client_id\") || \"default-client\";\n const redirectUri = window.location.origin + \"/auth/sso/callback\";\n\n // Exchange code for tokens\n const result = await exchangeOidcCode(code, clientId, redirectUri);\n\n if (!result.success) {\n throw new Error(\n result.error || \"Failed to exchange authorization code\",\n );\n }\n\n // Check if MFA is required after OIDC authentication\n if (result.requiresMFA && result.mfaChallengeId) {\n // Store MFA challenge info for the verification page\n sessionStorage.setItem(\"mfa_challenge_id\", result.mfaChallengeId);\n sessionStorage.setItem(\"mfa_redirect\", oidcRedirect || \"/dashboard\");\n\n // Clean up OIDC session data\n sessionStorage.removeItem(\"oidc_redirect\");\n sessionStorage.removeItem(\"oidc_client_id\");\n\n // Redirect to MFA verification\n navigate(\"/auth/mfa-verify\", { replace: true });\n return;\n }\n\n setStatus(\"success\");\n\n // Get redirect URL from state or session storage\n const redirect = oidcRedirect || \"/dashboard\";\n sessionStorage.removeItem(\"oidc_redirect\");\n sessionStorage.removeItem(\"oidc_client_id\");\n\n // Redirect after brief success message\n redirectTimerRef.current = setTimeout(() => {\n navigate(redirect, { replace: true });\n }, 1500);\n };\n\n processCallback();\n const timerRefCapture = redirectTimerRef;\n return () => {\n if (timerRefCapture.current) {\n clearTimeout(timerRefCapture.current);\n timerRefCapture.current = null;\n }\n };\n }, [\n searchParams,\n navigate,\n setAuthTokens,\n setAuthenticated,\n exchangeOidcCode,\n validateOidcState,\n isExternalOidcCallback,\n handleExternalOidcCallback,\n ]);\n\n return (\n <div className=\"min-h-screen flex items-center justify-center bg-bg-canvas p-4\">\n <div className=\"w-full max-w-md\">\n <div className=\"bg-bg-surface rounded-2xl shadow-xl p-8 text-center\">\n {/* Logo */}\n <div className=\"mb-6\">\n <div className=\"auth-brand-badge mx-auto flex size-16 items-center justify-center rounded-xl\">\n <svg\n className=\"size-8 text-white\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z\"\n />\n </svg>\n </div>\n </div>\n\n {/* Processing State */}\n {status === \"processing\" && (\n <>\n <h1 className=\"text-2xl font-semibold text-text-primary mb-4\">\n {tr(\"auth.ssoCallback.completing\", \"Completing Sign In\")}\n </h1>\n <p className=\"text-text-secondary mb-6\">\n {callbackType === \"oidc\"\n ? tr(\n \"auth.ssoCallback.exchangingCode\",\n \"Exchanging authorization code for access tokens...\",\n )\n : callbackType === \"saml\"\n ? tr(\n \"auth.ssoCallback.validatingSaml\",\n \"Validating your SAML credentials...\",\n )\n : tr(\n \"auth.ssoCallback.validatingCreds\",\n \"Validating your credentials from your identity provider...\",\n )}\n </p>\n <div className=\"flex justify-center\">\n <SpinnerIcon className=\"size-10 text-text-link animate-spin\" />\n </div>\n </>\n )}\n\n {/* Success State */}\n {status === \"success\" && (\n <>\n <div className=\"size-16 mx-auto mb-4 rounded-full bg-status-success-bg-subtle flex items-center justify-center\">\n <svg\n className=\"size-8 text-status-success-text\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n </div>\n <h1 className=\"text-2xl font-semibold text-text-primary mb-4\">\n {tr(\"auth.ssoCallback.success\", \"Sign In Successful\")}\n </h1>\n <p className=\"text-text-secondary mb-6\">\n {callbackType === \"oidc\"\n ? tr(\n \"auth.ssoCallback.oidcComplete\",\n \"OIDC authentication complete. Redirecting...\",\n )\n : callbackType === \"saml\"\n ? tr(\n \"auth.ssoCallback.samlComplete\",\n \"SAML authentication complete. Redirecting...\",\n )\n : tr(\n \"auth.ssoCallback.authSuccess\",\n \"You have been authenticated successfully. Redirecting...\",\n )}\n </p>\n <div className=\"flex justify-center\">\n <SpinnerIcon className=\"size-6 text-status-success-text animate-spin\" />\n </div>\n </>\n )}\n\n {/* Error State */}\n {status === \"error\" && (\n <>\n <div className=\"size-16 mx-auto mb-4 rounded-full bg-status-error-bg-subtle flex items-center justify-center\">\n <AlertIcon className=\"size-8 text-status-error-text\" />\n </div>\n <h1 className=\"text-2xl font-semibold text-text-primary mb-4\">\n {tr(\"auth.ssoCallback.failed\", \"Sign In Failed\")}\n </h1>\n <p className=\"text-status-error-text mb-6 text-sm\">{error}</p>\n <div className=\"space-y-3\">\n <Button\n type=\"button\"\n onClick={() => navigate(\"/auth/sso/login\", { replace: true })}\n variant=\"default\"\n size=\"lg\"\n className=\"w-full font-semibold\"\n >\n {tr(\"auth.ssoCallback.tryAgain\", \"Try Again\")}\n </Button>\n <button\n type=\"button\"\n onClick={() => navigate(\"/auth/login\", { replace: true })}\n className=\"w-full px-6 py-3 rounded-xl border border-border-default text-text-primary font-medium hover:bg-bg-sunken transition-colors\"\n >\n {tr(\"auth.ssoCallback.backToLogin\", \"Back to Login\")}\n </button>\n </div>\n </>\n )}\n\n {/* SSO Type Badge */}\n {callbackType !== \"unknown\" && (\n <div className=\"mt-6\">\n <span\n className={`inline-flex items-center px-3 py-1 rounded-full text-xs font-medium ${\n callbackType === \"oidc\"\n ? \"bg-accent-purple-subtle text-accent-purple\"\n : \"bg-status-info-bg-subtle text-text-linkHover\"\n }`}\n >\n {callbackType === \"oidc\" ? \"OpenID Connect\" : \"SAML 2.0\"}\n </span>\n </div>\n )}\n\n {/* Help Text */}\n <div className=\"mt-8 pt-6 border-t border-border-subtle\">\n <p className=\"text-xs text-text-secondary\">\n {tr(\n \"auth.ssoCallback.helpText\",\n \"Having trouble? Contact your organization's IT administrator for assistance with SSO login.\",\n )}\n </p>\n </div>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -8,5 +8,5 @@ interface SsoConfigPageProps {
8
8
  * In admin-app context, bypassEnterprisePlanGate=true and tenant/org/workspace
9
9
  * scoping is read from URL search params (?tenant=&org=&workspace=).
10
10
  */
11
- export declare function SsoConfigPage({ bypassEnterprisePlanGate, }: SsoConfigPageProps): import("react").JSX.Element;
11
+ export declare function SsoConfigPage({ bypassEnterprisePlanGate, }: SsoConfigPageProps): import('react').JSX.Element;
12
12
  export {};