@burdenoff/microfe-auth 2026.510.127
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.
- package/README.md +12 -0
- package/dist/_virtual/_rolldown/runtime.js +13 -0
- package/dist/auth/AuthRoot.d.ts +30 -0
- package/dist/auth/AuthRoot.d.ts.map +1 -0
- package/dist/auth/AuthRoot.js +82 -0
- package/dist/auth/AuthRoot.js.map +1 -0
- package/dist/auth/AuthRoutes.d.ts +29 -0
- package/dist/auth/AuthRoutes.d.ts.map +1 -0
- package/dist/auth/AuthRoutes.js +271 -0
- package/dist/auth/AuthRoutes.js.map +1 -0
- package/dist/auth/components/AuthIcons.d.ts +17 -0
- package/dist/auth/components/AuthIcons.d.ts.map +1 -0
- package/dist/auth/components/AuthIcons.js +197 -0
- package/dist/auth/components/AuthIcons.js.map +1 -0
- package/dist/auth/components/AuthLayout.d.ts +17 -0
- package/dist/auth/components/AuthLayout.d.ts.map +1 -0
- package/dist/auth/components/AuthLayout.js +237 -0
- package/dist/auth/components/AuthLayout.js.map +1 -0
- package/dist/auth/components/CaptchaV2.d.ts +16 -0
- package/dist/auth/components/CaptchaV2.d.ts.map +1 -0
- package/dist/auth/components/CaptchaV2.js +47 -0
- package/dist/auth/components/CaptchaV2.js.map +1 -0
- package/dist/auth/components/ConfirmActionDialog.d.ts +16 -0
- package/dist/auth/components/ConfirmActionDialog.d.ts.map +1 -0
- package/dist/auth/components/ConfirmActionDialog.js +68 -0
- package/dist/auth/components/ConfirmActionDialog.js.map +1 -0
- package/dist/auth/components/index.d.ts +4 -0
- package/dist/auth/components/index.d.ts.map +1 -0
- package/dist/auth/components/profile/UserProfileMenu.d.ts +42 -0
- package/dist/auth/components/profile/UserProfileMenu.d.ts.map +1 -0
- package/dist/auth/components/profile/UserProfileMenu.js +91 -0
- package/dist/auth/components/profile/UserProfileMenu.js.map +1 -0
- package/dist/auth/components/workspace/WorkspaceSelector.d.ts +76 -0
- package/dist/auth/components/workspace/WorkspaceSelector.d.ts.map +1 -0
- package/dist/auth/components/workspace/WorkspaceSelector.js +240 -0
- package/dist/auth/components/workspace/WorkspaceSelector.js.map +1 -0
- package/dist/auth/constants/permissions.d.ts +30 -0
- package/dist/auth/constants/permissions.d.ts.map +1 -0
- package/dist/auth/constants/permissions.js +18 -0
- package/dist/auth/constants/permissions.js.map +1 -0
- package/dist/auth/constants/sessionKeys.d.ts +18 -0
- package/dist/auth/constants/sessionKeys.d.ts.map +1 -0
- package/dist/auth/constants/sessionKeys.js +6 -0
- package/dist/auth/constants/sessionKeys.js.map +1 -0
- package/dist/auth/hooks/index.d.ts +18 -0
- package/dist/auth/hooks/index.d.ts.map +1 -0
- package/dist/auth/hooks/index.js +16 -0
- package/dist/auth/hooks/useAccountOperations.d.ts +19 -0
- package/dist/auth/hooks/useAccountOperations.d.ts.map +1 -0
- package/dist/auth/hooks/useAccountOperations.js +52 -0
- package/dist/auth/hooks/useAccountOperations.js.map +1 -0
- package/dist/auth/hooks/useApiKeyOperations.d.ts +22 -0
- package/dist/auth/hooks/useApiKeyOperations.d.ts.map +1 -0
- package/dist/auth/hooks/useApiKeyOperations.js +4 -0
- package/dist/auth/hooks/useAppOperations.d.ts +26 -0
- package/dist/auth/hooks/useAppOperations.d.ts.map +1 -0
- package/dist/auth/hooks/useAppOperations.js +4 -0
- package/dist/auth/hooks/useAuthOperations.d.ts +57 -0
- package/dist/auth/hooks/useAuthOperations.d.ts.map +1 -0
- package/dist/auth/hooks/useAuthOperations.js +236 -0
- package/dist/auth/hooks/useAuthOperations.js.map +1 -0
- package/dist/auth/hooks/useAuthPermissions.d.ts +20 -0
- package/dist/auth/hooks/useAuthPermissions.d.ts.map +1 -0
- package/dist/auth/hooks/useAuthPermissions.js +22 -0
- package/dist/auth/hooks/useAuthPermissions.js.map +1 -0
- package/dist/auth/hooks/useCaptchaV3.d.ts +13 -0
- package/dist/auth/hooks/useCaptchaV3.d.ts.map +1 -0
- package/dist/auth/hooks/useCaptchaV3.js +19 -0
- package/dist/auth/hooks/useCaptchaV3.js.map +1 -0
- package/dist/auth/hooks/useContextSwitcherData.d.ts +106 -0
- package/dist/auth/hooks/useContextSwitcherData.d.ts.map +1 -0
- package/dist/auth/hooks/useContextSwitcherData.js +466 -0
- package/dist/auth/hooks/useContextSwitcherData.js.map +1 -0
- package/dist/auth/hooks/useDelegationOperations.d.ts +25 -0
- package/dist/auth/hooks/useDelegationOperations.d.ts.map +1 -0
- package/dist/auth/hooks/useDelegationOperations.js +4 -0
- package/dist/auth/hooks/useMfaOperations.d.ts +18 -0
- package/dist/auth/hooks/useMfaOperations.d.ts.map +1 -0
- package/dist/auth/hooks/useMfaOperations.js +103 -0
- package/dist/auth/hooks/useMfaOperations.js.map +1 -0
- package/dist/auth/hooks/useMyWorkspaces.d.ts +45 -0
- package/dist/auth/hooks/useMyWorkspaces.d.ts.map +1 -0
- package/dist/auth/hooks/useMyWorkspaces.js +140 -0
- package/dist/auth/hooks/useMyWorkspaces.js.map +1 -0
- package/dist/auth/hooks/useOAuthOperations.d.ts +19 -0
- package/dist/auth/hooks/useOAuthOperations.d.ts.map +1 -0
- package/dist/auth/hooks/useOAuthOperations.js +103 -0
- package/dist/auth/hooks/useOAuthOperations.js.map +1 -0
- package/dist/auth/hooks/usePasswordOperations.d.ts +13 -0
- package/dist/auth/hooks/usePasswordOperations.d.ts.map +1 -0
- package/dist/auth/hooks/usePasswordOperations.js +56 -0
- package/dist/auth/hooks/usePasswordOperations.js.map +1 -0
- package/dist/auth/hooks/useSessionOperations.d.ts +41 -0
- package/dist/auth/hooks/useSessionOperations.d.ts.map +1 -0
- package/dist/auth/hooks/useSessionOperations.js +59 -0
- package/dist/auth/hooks/useSessionOperations.js.map +1 -0
- package/dist/auth/hooks/useSsoOperations.d.ts +65 -0
- package/dist/auth/hooks/useSsoOperations.d.ts.map +1 -0
- package/dist/auth/hooks/useSsoOperations.js +236 -0
- package/dist/auth/hooks/useSsoOperations.js.map +1 -0
- package/dist/auth/hooks/useTokenRefresh.d.ts +56 -0
- package/dist/auth/hooks/useTokenRefresh.d.ts.map +1 -0
- package/dist/auth/hooks/useTokenRefresh.js +53 -0
- package/dist/auth/hooks/useTokenRefresh.js.map +1 -0
- package/dist/auth/hooks/useUserOperations.d.ts +32 -0
- package/dist/auth/hooks/useUserOperations.d.ts.map +1 -0
- package/dist/auth/hooks/useUserOperations.js +100 -0
- package/dist/auth/hooks/useUserOperations.js.map +1 -0
- package/dist/auth/hooks/useWorkspaceOperations.d.ts +35 -0
- package/dist/auth/hooks/useWorkspaceOperations.d.ts.map +1 -0
- package/dist/auth/hooks/useWorkspaceOperations.js +35 -0
- package/dist/auth/hooks/useWorkspaceOperations.js.map +1 -0
- package/dist/auth/hooks/useWorkspaceToken.d.ts +56 -0
- package/dist/auth/hooks/useWorkspaceToken.d.ts.map +1 -0
- package/dist/auth/hooks/useWorkspaceToken.js +94 -0
- package/dist/auth/hooks/useWorkspaceToken.js.map +1 -0
- package/dist/auth/index.d.ts +63 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +18 -0
- package/dist/auth/pages/ApiKeysPage.d.ts +5 -0
- package/dist/auth/pages/ApiKeysPage.d.ts.map +1 -0
- package/dist/auth/pages/AppsPage.d.ts +5 -0
- package/dist/auth/pages/AppsPage.d.ts.map +1 -0
- package/dist/auth/pages/AuditLogPage.d.ts +5 -0
- package/dist/auth/pages/AuditLogPage.d.ts.map +1 -0
- package/dist/auth/pages/AuditLogPage.js +129 -0
- package/dist/auth/pages/AuditLogPage.js.map +1 -0
- package/dist/auth/pages/DelegationsPage.d.ts +5 -0
- package/dist/auth/pages/DelegationsPage.d.ts.map +1 -0
- package/dist/auth/pages/EmailVerifyPage.d.ts +5 -0
- package/dist/auth/pages/EmailVerifyPage.d.ts.map +1 -0
- package/dist/auth/pages/EmailVerifyPage.js +166 -0
- package/dist/auth/pages/EmailVerifyPage.js.map +1 -0
- package/dist/auth/pages/LoginPage.d.ts +6 -0
- package/dist/auth/pages/LoginPage.d.ts.map +1 -0
- package/dist/auth/pages/LoginPage.js +575 -0
- package/dist/auth/pages/LoginPage.js.map +1 -0
- package/dist/auth/pages/MagicLinkPage.d.ts +6 -0
- package/dist/auth/pages/MagicLinkPage.d.ts.map +1 -0
- package/dist/auth/pages/MagicLinkPage.js +219 -0
- package/dist/auth/pages/MagicLinkPage.js.map +1 -0
- package/dist/auth/pages/MfaSetupPage.d.ts +5 -0
- package/dist/auth/pages/MfaSetupPage.d.ts.map +1 -0
- package/dist/auth/pages/MfaSetupPage.js +341 -0
- package/dist/auth/pages/MfaSetupPage.js.map +1 -0
- package/dist/auth/pages/MfaVerifyPage.d.ts +7 -0
- package/dist/auth/pages/MfaVerifyPage.d.ts.map +1 -0
- package/dist/auth/pages/MfaVerifyPage.js +189 -0
- package/dist/auth/pages/MfaVerifyPage.js.map +1 -0
- package/dist/auth/pages/OAuthCallbackPage.d.ts +7 -0
- package/dist/auth/pages/OAuthCallbackPage.d.ts.map +1 -0
- package/dist/auth/pages/OAuthCallbackPage.js +100 -0
- package/dist/auth/pages/OAuthCallbackPage.js.map +1 -0
- package/dist/auth/pages/PasswordResetPage.d.ts +6 -0
- package/dist/auth/pages/PasswordResetPage.d.ts.map +1 -0
- package/dist/auth/pages/PasswordResetPage.js +352 -0
- package/dist/auth/pages/PasswordResetPage.js.map +1 -0
- package/dist/auth/pages/ReactivatePage.d.ts +6 -0
- package/dist/auth/pages/ReactivatePage.d.ts.map +1 -0
- package/dist/auth/pages/ReactivatePage.js +217 -0
- package/dist/auth/pages/ReactivatePage.js.map +1 -0
- package/dist/auth/pages/RegisterPage.d.ts +5 -0
- package/dist/auth/pages/RegisterPage.d.ts.map +1 -0
- package/dist/auth/pages/RegisterPage.js +439 -0
- package/dist/auth/pages/RegisterPage.js.map +1 -0
- package/dist/auth/pages/SSORelayCallbackPage.d.ts +8 -0
- package/dist/auth/pages/SSORelayCallbackPage.d.ts.map +1 -0
- package/dist/auth/pages/SSORelayCallbackPage.js +48 -0
- package/dist/auth/pages/SSORelayCallbackPage.js.map +1 -0
- package/dist/auth/pages/SSORelayPage.d.ts +18 -0
- package/dist/auth/pages/SSORelayPage.d.ts.map +1 -0
- package/dist/auth/pages/SSORelayPage.js +134 -0
- package/dist/auth/pages/SSORelayPage.js.map +1 -0
- package/dist/auth/pages/SecurityPage.d.ts +5 -0
- package/dist/auth/pages/SecurityPage.d.ts.map +1 -0
- package/dist/auth/pages/SecurityPage.js +587 -0
- package/dist/auth/pages/SecurityPage.js.map +1 -0
- package/dist/auth/pages/SessionBridgePage.d.ts +14 -0
- package/dist/auth/pages/SessionBridgePage.d.ts.map +1 -0
- package/dist/auth/pages/SessionBridgePage.js +231 -0
- package/dist/auth/pages/SessionBridgePage.js.map +1 -0
- package/dist/auth/pages/SessionsPage.d.ts +5 -0
- package/dist/auth/pages/SessionsPage.d.ts.map +1 -0
- package/dist/auth/pages/SessionsPage.js +258 -0
- package/dist/auth/pages/SessionsPage.js.map +1 -0
- package/dist/auth/pages/SsoCallbackPage.d.ts +8 -0
- package/dist/auth/pages/SsoCallbackPage.d.ts.map +1 -0
- package/dist/auth/pages/SsoCallbackPage.js +188 -0
- package/dist/auth/pages/SsoCallbackPage.js.map +1 -0
- package/dist/auth/pages/SsoConfigPage.d.ts +6 -0
- package/dist/auth/pages/SsoConfigPage.d.ts.map +1 -0
- package/dist/auth/pages/SsoConfigPage.js +1144 -0
- package/dist/auth/pages/SsoConfigPage.js.map +1 -0
- package/dist/auth/pages/SsoLoginPage.d.ts +7 -0
- package/dist/auth/pages/SsoLoginPage.d.ts.map +1 -0
- package/dist/auth/pages/SsoLoginPage.js +236 -0
- package/dist/auth/pages/SsoLoginPage.js.map +1 -0
- package/dist/auth/pages/UserDetailsPage.d.ts +11 -0
- package/dist/auth/pages/UserDetailsPage.d.ts.map +1 -0
- package/dist/auth/pages/UserDetailsPage.js +338 -0
- package/dist/auth/pages/UserDetailsPage.js.map +1 -0
- package/dist/auth/pages/UserProfilePage.d.ts +5 -0
- package/dist/auth/pages/UserProfilePage.d.ts.map +1 -0
- package/dist/auth/pages/UserProfilePage.js +445 -0
- package/dist/auth/pages/UserProfilePage.js.map +1 -0
- package/dist/auth/pages/UsersPage.d.ts +5 -0
- package/dist/auth/pages/UsersPage.d.ts.map +1 -0
- package/dist/auth/pages/UsersPage.js +899 -0
- package/dist/auth/pages/UsersPage.js.map +1 -0
- package/dist/auth/providers/AuthProvider.d.ts +18 -0
- package/dist/auth/providers/AuthProvider.d.ts.map +1 -0
- package/dist/auth/providers/AuthProvider.js +36 -0
- package/dist/auth/providers/AuthProvider.js.map +1 -0
- package/dist/auth/providers/CaptchaProvider.d.ts +13 -0
- package/dist/auth/providers/CaptchaProvider.d.ts.map +1 -0
- package/dist/auth/providers/CaptchaProvider.js +21 -0
- package/dist/auth/providers/CaptchaProvider.js.map +1 -0
- package/dist/auth/store/authStore.d.ts +91 -0
- package/dist/auth/store/authStore.d.ts.map +1 -0
- package/dist/auth/store/authStore.js +314 -0
- package/dist/auth/store/authStore.js.map +1 -0
- package/dist/auth/types/index.d.ts +636 -0
- package/dist/auth/types/index.d.ts.map +1 -0
- package/dist/auth/utils/captchaConfig.d.ts +4 -0
- package/dist/auth/utils/captchaConfig.d.ts.map +1 -0
- package/dist/auth/utils/captchaConfig.js +13 -0
- package/dist/auth/utils/captchaConfig.js.map +1 -0
- package/dist/auth/utils/formatters.d.ts +37 -0
- package/dist/auth/utils/formatters.d.ts.map +1 -0
- package/dist/auth/utils/formatters.js +48 -0
- package/dist/auth/utils/formatters.js.map +1 -0
- package/dist/auth/utils/gatewayBaseUrls.d.ts +6 -0
- package/dist/auth/utils/gatewayBaseUrls.d.ts.map +1 -0
- package/dist/auth/utils/gatewayBaseUrls.js +18 -0
- package/dist/auth/utils/gatewayBaseUrls.js.map +1 -0
- package/dist/auth/utils/index.d.ts +3 -0
- package/dist/auth/utils/index.d.ts.map +1 -0
- package/dist/auth/utils/validation.d.ts +30 -0
- package/dist/auth/utils/validation.d.ts.map +1 -0
- package/dist/auth/utils/validation.js +15 -0
- package/dist/auth/utils/validation.js.map +1 -0
- package/dist/dev/main.d.ts +2 -0
- package/dist/dev/main.d.ts.map +1 -0
- package/dist/generated/global-operations.d.ts +2978 -0
- package/dist/generated/global-operations.d.ts.map +1 -0
- package/dist/generated/global-operations.js +944 -0
- package/dist/generated/global-operations.js.map +1 -0
- package/dist/generated/global-types.d.ts +21253 -0
- package/dist/generated/global-types.d.ts.map +1 -0
- package/dist/generated/wspace-operations.d.ts +2 -0
- package/dist/generated/wspace-operations.d.ts.map +1 -0
- package/dist/generated/wspace-types.d.ts +55214 -0
- package/dist/generated/wspace-types.d.ts.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/microfe-auth.css +3 -0
- package/dist/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js +70 -0
- package/dist/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js.map +1 -0
- package/dist/node_modules/object-assign/index.js +41 -0
- package/dist/node_modules/object-assign/index.js.map +1 -0
- package/dist/node_modules/prop-types/checkPropTypes.js +46 -0
- package/dist/node_modules/prop-types/checkPropTypes.js.map +1 -0
- package/dist/node_modules/prop-types/factoryWithThrowingShims.js +49 -0
- package/dist/node_modules/prop-types/factoryWithThrowingShims.js.map +1 -0
- package/dist/node_modules/prop-types/factoryWithTypeCheckers.js +272 -0
- package/dist/node_modules/prop-types/factoryWithTypeCheckers.js.map +1 -0
- package/dist/node_modules/prop-types/index.js +16 -0
- package/dist/node_modules/prop-types/index.js.map +1 -0
- package/dist/node_modules/prop-types/lib/ReactPropTypesSecret.js +10 -0
- package/dist/node_modules/prop-types/lib/ReactPropTypesSecret.js.map +1 -0
- package/dist/node_modules/prop-types/lib/has.js +10 -0
- package/dist/node_modules/prop-types/lib/has.js.map +1 -0
- package/dist/node_modules/qrcode.react/lib/esm/index.js +959 -0
- package/dist/node_modules/qrcode.react/lib/esm/index.js.map +1 -0
- package/dist/node_modules/react-async-script/lib/esm/async-script-loader.js +114 -0
- package/dist/node_modules/react-async-script/lib/esm/async-script-loader.js.map +1 -0
- package/dist/node_modules/react-google-recaptcha/lib/esm/index.js +8 -0
- package/dist/node_modules/react-google-recaptcha/lib/esm/index.js.map +1 -0
- package/dist/node_modules/react-google-recaptcha/lib/esm/recaptcha-wrapper.js +20 -0
- package/dist/node_modules/react-google-recaptcha/lib/esm/recaptcha-wrapper.js.map +1 -0
- package/dist/node_modules/react-google-recaptcha/lib/esm/recaptcha.js +148 -0
- package/dist/node_modules/react-google-recaptcha/lib/esm/recaptcha.js.map +1 -0
- package/dist/node_modules/react-google-recaptcha-v3/dist/react-google-recaptcha-v3.esm.js +445 -0
- package/dist/node_modules/react-google-recaptcha-v3/dist/react-google-recaptcha-v3.esm.js.map +1 -0
- package/dist/node_modules/react-is/cjs/react-is.development.js +84 -0
- package/dist/node_modules/react-is/cjs/react-is.development.js.map +1 -0
- package/dist/node_modules/react-is/cjs/react-is.production.min.js +64 -0
- package/dist/node_modules/react-is/cjs/react-is.production.min.js.map +1 -0
- package/dist/node_modules/react-is/index.js +12 -0
- package/dist/node_modules/react-is/index.js.map +1 -0
- package/dist/shared/hooks/index.d.ts +7 -0
- package/dist/shared/hooks/index.d.ts.map +1 -0
- package/dist/shared/index.d.ts +6 -0
- package/dist/shared/index.d.ts.map +1 -0
- package/dist/shared/types/index.d.ts +109 -0
- package/dist/shared/types/index.d.ts.map +1 -0
- package/dist/utils/nativeBridge.d.ts +3 -0
- package/dist/utils/nativeBridge.d.ts.map +1 -0
- package/dist/utils/nativeBridge.js +2 -0
- package/package.json +114 -0
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { useAuth as e } from "../providers/AuthProvider.js";
|
|
2
|
+
import { useAuthStore as t } from "../store/authStore.js";
|
|
3
|
+
import { AuthenticateOAuthDocument as n } from "../../generated/global-operations.js";
|
|
4
|
+
import { useMutation as r } from "@apollo/client/react";
|
|
5
|
+
//#region src/auth/hooks/useOAuthOperations.ts
|
|
6
|
+
var i = {
|
|
7
|
+
google: {
|
|
8
|
+
authorizationUrl: "https://accounts.google.com/o/oauth2/v2/auth",
|
|
9
|
+
scopes: [
|
|
10
|
+
"openid",
|
|
11
|
+
"email",
|
|
12
|
+
"profile"
|
|
13
|
+
],
|
|
14
|
+
clientIdEnvKey: "VITE_GOOGLE_CLIENT_ID"
|
|
15
|
+
},
|
|
16
|
+
github: {
|
|
17
|
+
authorizationUrl: "https://github.com/login/oauth/authorize",
|
|
18
|
+
scopes: ["user:email", "read:user"],
|
|
19
|
+
clientIdEnvKey: "VITE_GITHUB_CLIENT_ID"
|
|
20
|
+
},
|
|
21
|
+
microsoft: {
|
|
22
|
+
authorizationUrl: "https://login.microsoftonline.com/common/oauth2/v2.0/authorize",
|
|
23
|
+
scopes: [
|
|
24
|
+
"openid",
|
|
25
|
+
"email",
|
|
26
|
+
"profile"
|
|
27
|
+
],
|
|
28
|
+
clientIdEnvKey: "VITE_MICROSOFT_CLIENT_ID"
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
function a() {
|
|
32
|
+
let e = new Uint8Array(32);
|
|
33
|
+
return crypto.getRandomValues(e), Array.from(e, (e) => e.toString(16).padStart(2, "0")).join("");
|
|
34
|
+
}
|
|
35
|
+
function o() {
|
|
36
|
+
let o = e(), [s, { loading: c }] = r(n), l = (e) => {
|
|
37
|
+
let t = i[e], n = {
|
|
38
|
+
VITE_GOOGLE_CLIENT_ID: void 0,
|
|
39
|
+
VITE_GITHUB_CLIENT_ID: void 0,
|
|
40
|
+
VITE_MICROSOFT_CLIENT_ID: void 0
|
|
41
|
+
}[t.clientIdEnvKey];
|
|
42
|
+
if (!n) throw console.error(`OAuth client ID not configured for ${e}`), Error(`${e} OAuth is not configured. Please set ${t.clientIdEnvKey} environment variable.`);
|
|
43
|
+
let r = a();
|
|
44
|
+
localStorage.setItem("oauth_state", r), localStorage.setItem("oauth_provider", e);
|
|
45
|
+
let o = `${window.location.origin}/auth/oauth/callback`;
|
|
46
|
+
localStorage.setItem("oauth_redirect_uri", o);
|
|
47
|
+
let s = new URLSearchParams({
|
|
48
|
+
client_id: n,
|
|
49
|
+
redirect_uri: o,
|
|
50
|
+
response_type: "code",
|
|
51
|
+
scope: t.scopes.join(" "),
|
|
52
|
+
state: r,
|
|
53
|
+
...e === "google" && { prompt: "select_account" },
|
|
54
|
+
...e === "google" && { access_type: "offline" }
|
|
55
|
+
}), c = `${t.authorizationUrl}?${s.toString()}`;
|
|
56
|
+
window.location.href = c;
|
|
57
|
+
};
|
|
58
|
+
return {
|
|
59
|
+
initiateOAuth: l,
|
|
60
|
+
completeOAuth: async (e, n) => {
|
|
61
|
+
let r = t.getState(), i = localStorage.getItem("oauth_state");
|
|
62
|
+
if (!i || i !== n) throw console.error("[OAuth Complete] State mismatch!", {
|
|
63
|
+
storedState: i,
|
|
64
|
+
urlState: n
|
|
65
|
+
}), Error("Invalid OAuth state. Please try again.");
|
|
66
|
+
let a = localStorage.getItem("oauth_provider"), c = localStorage.getItem("oauth_redirect_uri");
|
|
67
|
+
if (!a || !c) throw console.error("[OAuth Complete] Missing provider or redirectUri"), Error("OAuth session data missing. Please try again.");
|
|
68
|
+
localStorage.removeItem("oauth_state"), localStorage.removeItem("oauth_provider"), localStorage.removeItem("oauth_redirect_uri");
|
|
69
|
+
try {
|
|
70
|
+
r.setLoading(!0), r.setError(null);
|
|
71
|
+
let { data: t, error: n } = await s({ variables: { input: {
|
|
72
|
+
provider: a.toUpperCase(),
|
|
73
|
+
code: e,
|
|
74
|
+
redirectUri: c
|
|
75
|
+
} } });
|
|
76
|
+
if (!t?.authenticateOAuth) {
|
|
77
|
+
let e = n?.message ?? "OAuth authentication failed. Please try again.";
|
|
78
|
+
throw Error(e);
|
|
79
|
+
}
|
|
80
|
+
let i = t.authenticateOAuth;
|
|
81
|
+
return i.requiresMFA ? (r.setMfaRequired(!0, i.mfaChallengeId || void 0), i) : (i.success && i.user && i.token ? (r.setUser(i.user), r.setAuthTokens(i.token, i.refreshToken || ""), r.setAuthenticated(!0), r.setMfaRequired(!1), o.onAuthSuccess?.(i.user, i.token, i.refreshToken || void 0)) : i.error && r.setError(i.error), i);
|
|
82
|
+
} catch (e) {
|
|
83
|
+
let t = e instanceof Error ? e.message : "OAuth authentication failed";
|
|
84
|
+
throw r.setError(t), e;
|
|
85
|
+
} finally {
|
|
86
|
+
r.setLoading(!1);
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
initiateGoogleOAuth: () => l("google"),
|
|
90
|
+
initiateGitHubOAuth: () => l("github"),
|
|
91
|
+
initiateMicrosoftOAuth: () => l("microsoft"),
|
|
92
|
+
isProviderConfigured: (e) => !!{
|
|
93
|
+
VITE_GOOGLE_CLIENT_ID: void 0,
|
|
94
|
+
VITE_GITHUB_CLIENT_ID: void 0,
|
|
95
|
+
VITE_MICROSOFT_CLIENT_ID: void 0
|
|
96
|
+
}[i[e].clientIdEnvKey],
|
|
97
|
+
isLoading: c
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
//#endregion
|
|
101
|
+
export { o as useOAuthOperations };
|
|
102
|
+
|
|
103
|
+
//# sourceMappingURL=useOAuthOperations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useOAuthOperations.js","names":[],"sources":["../../../src/auth/hooks/useOAuthOperations.ts"],"sourcesContent":["import { useMutation } from \"@apollo/client/react\";\nimport { useAuthStore } from \"../store/authStore\";\nimport { useAuth } from \"../providers/AuthProvider\";\nimport type { AuthResult, OAuthInput } from \"../types\";\n\nimport { AuthenticateOAuthDocument } from \"../../generated/global-operations\";\n\n// =============================================================================\n// GRAPHQL RESPONSE INTERFACES\n// =============================================================================\n\ninterface AuthenticateOAuthResponse {\n authenticateOAuth: AuthResult;\n}\n\ninterface AuthenticateOAuthVariables {\n input: OAuthInput;\n}\n\n/**\n * Supported OAuth providers\n */\nexport type OAuthProvider = \"google\" | \"github\" | \"microsoft\";\n\n/**\n * OAuth configuration for each provider\n */\ninterface OAuthConfig {\n authorizationUrl: string;\n scopes: string[];\n clientIdEnvKey: string;\n}\n\nconst OAUTH_CONFIGS: Record<OAuthProvider, OAuthConfig> = {\n google: {\n authorizationUrl: \"https://accounts.google.com/o/oauth2/v2/auth\",\n scopes: [\"openid\", \"email\", \"profile\"],\n clientIdEnvKey: \"VITE_GOOGLE_CLIENT_ID\",\n },\n github: {\n authorizationUrl: \"https://github.com/login/oauth/authorize\",\n scopes: [\"user:email\", \"read:user\"],\n clientIdEnvKey: \"VITE_GITHUB_CLIENT_ID\",\n },\n microsoft: {\n authorizationUrl:\n \"https://login.microsoftonline.com/common/oauth2/v2.0/authorize\",\n scopes: [\"openid\", \"email\", \"profile\"],\n clientIdEnvKey: \"VITE_MICROSOFT_CLIENT_ID\",\n },\n};\n\n/**\n * Generate a random state parameter for CSRF protection\n */\nfunction generateState(): string {\n const array = new Uint8Array(32);\n crypto.getRandomValues(array);\n return Array.from(array, (byte) => byte.toString(16).padStart(2, \"0\")).join(\n \"\",\n );\n}\n\n/**\n * Hook for OAuth authentication operations\n */\nexport function useOAuthOperations() {\n const context = useAuth();\n const [authenticateOAuthMutation, { loading }] = useMutation<\n AuthenticateOAuthResponse,\n AuthenticateOAuthVariables\n >(AuthenticateOAuthDocument);\n\n /**\n * Initiate OAuth flow by redirecting to the provider\n * @param provider - The OAuth provider to use\n */\n const initiateOAuth = (provider: OAuthProvider) => {\n const config = OAUTH_CONFIGS[provider];\n\n // Get client ID from environment\n // In Vite, environment variables are accessed via import.meta.env\n const envVars: Record<string, string | undefined> = {\n VITE_GOOGLE_CLIENT_ID: import.meta.env.VITE_GOOGLE_CLIENT_ID,\n VITE_GITHUB_CLIENT_ID: import.meta.env.VITE_GITHUB_CLIENT_ID,\n VITE_MICROSOFT_CLIENT_ID: import.meta.env.VITE_MICROSOFT_CLIENT_ID,\n };\n const clientId = envVars[config.clientIdEnvKey];\n\n if (!clientId) {\n console.error(`OAuth client ID not configured for ${provider}`);\n throw new Error(\n `${provider} OAuth is not configured. Please set ${config.clientIdEnvKey} environment variable.`,\n );\n }\n\n // Generate state for CSRF protection and store it\n // Use localStorage instead of sessionStorage for better persistence across redirects\n const state = generateState();\n localStorage.setItem(\"oauth_state\", state);\n localStorage.setItem(\"oauth_provider\", provider);\n\n // Build redirect URI - use current origin + callback path\n const redirectUri = `${window.location.origin}/auth/oauth/callback`;\n localStorage.setItem(\"oauth_redirect_uri\", redirectUri);\n\n // Build authorization URL\n const params = new URLSearchParams({\n client_id: clientId,\n redirect_uri: redirectUri,\n response_type: \"code\",\n scope: config.scopes.join(\" \"),\n state: state,\n // Google-specific: force account selection\n ...(provider === \"google\" && { prompt: \"select_account\" }),\n // Google-specific: enable offline access for refresh token\n ...(provider === \"google\" && { access_type: \"offline\" }),\n });\n\n const authUrl = `${config.authorizationUrl}?${params.toString()}`;\n\n // Redirect to OAuth provider\n window.location.href = authUrl;\n };\n\n /**\n * Complete OAuth flow by exchanging authorization code for tokens\n * Called from the callback page after provider redirects back\n * @param code - Authorization code from OAuth provider\n * @param state - State parameter for CSRF validation\n */\n const completeOAuth = async (\n code: string,\n state: string,\n ): Promise<AuthResult> => {\n const store = useAuthStore.getState();\n\n // Validate state parameter\n const storedState = localStorage.getItem(\"oauth_state\");\n if (!storedState || storedState !== state) {\n console.error(\"[OAuth Complete] State mismatch!\", {\n storedState,\n urlState: state,\n });\n throw new Error(\"Invalid OAuth state. Please try again.\");\n }\n\n // Get provider and redirect URI from localStorage\n const provider = localStorage.getItem(\"oauth_provider\") as OAuthProvider;\n const redirectUri = localStorage.getItem(\"oauth_redirect_uri\");\n\n if (!provider || !redirectUri) {\n console.error(\"[OAuth Complete] Missing provider or redirectUri\");\n throw new Error(\"OAuth session data missing. Please try again.\");\n }\n\n // Clear localStorage\n localStorage.removeItem(\"oauth_state\");\n localStorage.removeItem(\"oauth_provider\");\n localStorage.removeItem(\"oauth_redirect_uri\");\n\n try {\n store.setLoading(true);\n store.setError(null);\n\n // Call backend mutation to exchange code for tokens\n const { data, error } = await authenticateOAuthMutation({\n variables: {\n input: {\n provider: provider.toUpperCase(),\n code,\n redirectUri,\n },\n },\n });\n\n if (!data?.authenticateOAuth) {\n const errMsg =\n error?.message ?? \"OAuth authentication failed. Please try again.\";\n throw new Error(errMsg);\n }\n\n const result = data.authenticateOAuth;\n\n if (result.requiresMFA) {\n store.setMfaRequired(true, result.mfaChallengeId || undefined);\n return result;\n }\n\n if (result.success && result.user && result.token) {\n store.setUser(result.user);\n store.setAuthTokens(result.token, result.refreshToken || \"\");\n store.setAuthenticated(true);\n store.setMfaRequired(false);\n\n context.onAuthSuccess?.(\n result.user,\n result.token,\n result.refreshToken || undefined,\n );\n } else if (result.error) {\n store.setError(result.error);\n }\n\n return result;\n } catch (err) {\n const message =\n err instanceof Error ? err.message : \"OAuth authentication failed\";\n store.setError(message);\n throw err;\n } finally {\n store.setLoading(false);\n }\n };\n\n /**\n * Convenience method to initiate Google OAuth\n */\n const initiateGoogleOAuth = () => initiateOAuth(\"google\");\n\n /**\n * Convenience method to initiate GitHub OAuth\n */\n const initiateGitHubOAuth = () => initiateOAuth(\"github\");\n\n /**\n * Convenience method to initiate Microsoft OAuth\n */\n const initiateMicrosoftOAuth = () => initiateOAuth(\"microsoft\");\n\n /**\n * Check if a provider is configured (has client ID)\n */\n const isProviderConfigured = (provider: OAuthProvider): boolean => {\n const envVars: Record<string, string | undefined> = {\n VITE_GOOGLE_CLIENT_ID: import.meta.env.VITE_GOOGLE_CLIENT_ID,\n VITE_GITHUB_CLIENT_ID: import.meta.env.VITE_GITHUB_CLIENT_ID,\n VITE_MICROSOFT_CLIENT_ID: import.meta.env.VITE_MICROSOFT_CLIENT_ID,\n };\n const config = OAUTH_CONFIGS[provider];\n const clientId = envVars[config.clientIdEnvKey];\n return !!clientId;\n };\n\n return {\n initiateOAuth,\n completeOAuth,\n initiateGoogleOAuth,\n initiateGitHubOAuth,\n initiateMicrosoftOAuth,\n isProviderConfigured,\n isLoading: loading,\n };\n}\n"],"mappings":";;;;;AAiCA,IAAM,IAAoD;CACxD,QAAQ;EACN,kBAAkB;EAClB,QAAQ;GAAC;GAAU;GAAS;GAAU;EACtC,gBAAgB;EACjB;CACD,QAAQ;EACN,kBAAkB;EAClB,QAAQ,CAAC,cAAc,YAAY;EACnC,gBAAgB;EACjB;CACD,WAAW;EACT,kBACE;EACF,QAAQ;GAAC;GAAU;GAAS;GAAU;EACtC,gBAAgB;EACjB;CACF;AAKD,SAAS,IAAwB;CAC/B,IAAM,IAAQ,IAAI,WAAW,GAAG;AAEhC,QADA,OAAO,gBAAgB,EAAM,EACtB,MAAM,KAAK,IAAQ,MAAS,EAAK,SAAS,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,KACrE,GACD;;AAMH,SAAgB,IAAqB;CACnC,IAAM,IAAU,GAAS,EACnB,CAAC,GAA2B,EAAE,gBAAa,EAG/C,EAA0B,EAMtB,KAAiB,MAA4B;EACjD,IAAM,IAAS,EAAc,IASvB,IAL8C;GAClD,uBAAA,KAAA;GACA,uBAAA,KAAA;GACA,0BAAA,KAAA;GACD,CACwB,EAAO;AAEhC,MAAI,CAAC,EAEH,OADA,QAAQ,MAAM,sCAAsC,IAAW,EACrD,MACR,GAAG,EAAS,uCAAuC,EAAO,eAAe,wBAC1E;EAKH,IAAM,IAAQ,GAAe;AAE7B,EADA,aAAa,QAAQ,eAAe,EAAM,EAC1C,aAAa,QAAQ,kBAAkB,EAAS;EAGhD,IAAM,IAAc,GAAG,OAAO,SAAS,OAAO;AAC9C,eAAa,QAAQ,sBAAsB,EAAY;EAGvD,IAAM,IAAS,IAAI,gBAAgB;GACjC,WAAW;GACX,cAAc;GACd,eAAe;GACf,OAAO,EAAO,OAAO,KAAK,IAAI;GACvB;GAEP,GAAI,MAAa,YAAY,EAAE,QAAQ,kBAAkB;GAEzD,GAAI,MAAa,YAAY,EAAE,aAAa,WAAW;GACxD,CAAC,EAEI,IAAU,GAAG,EAAO,iBAAiB,GAAG,EAAO,UAAU;AAG/D,SAAO,SAAS,OAAO;;AA0HzB,QAAO;EACL;EACA,eAnHoB,OACpB,GACA,MACwB;GACxB,IAAM,IAAQ,EAAa,UAAU,EAG/B,IAAc,aAAa,QAAQ,cAAc;AACvD,OAAI,CAAC,KAAe,MAAgB,EAKlC,OAJA,QAAQ,MAAM,oCAAoC;IAChD;IACA,UAAU;IACX,CAAC,EACQ,MAAM,yCAAyC;GAI3D,IAAM,IAAW,aAAa,QAAQ,iBAAiB,EACjD,IAAc,aAAa,QAAQ,qBAAqB;AAE9D,OAAI,CAAC,KAAY,CAAC,EAEhB,OADA,QAAQ,MAAM,mDAAmD,EACvD,MAAM,gDAAgD;AAMlE,GAFA,aAAa,WAAW,cAAc,EACtC,aAAa,WAAW,iBAAiB,EACzC,aAAa,WAAW,qBAAqB;AAE7C,OAAI;AAEF,IADA,EAAM,WAAW,GAAK,EACtB,EAAM,SAAS,KAAK;IAGpB,IAAM,EAAE,SAAM,aAAU,MAAM,EAA0B,EACtD,WAAW,EACT,OAAO;KACL,UAAU,EAAS,aAAa;KAChC;KACA;KACD,EACF,EACF,CAAC;AAEF,QAAI,CAAC,GAAM,mBAAmB;KAC5B,IAAM,IACJ,GAAO,WAAW;AACpB,WAAU,MAAM,EAAO;;IAGzB,IAAM,IAAS,EAAK;AAsBpB,WApBI,EAAO,eACT,EAAM,eAAe,IAAM,EAAO,kBAAkB,KAAA,EAAU,EACvD,MAGL,EAAO,WAAW,EAAO,QAAQ,EAAO,SAC1C,EAAM,QAAQ,EAAO,KAAK,EAC1B,EAAM,cAAc,EAAO,OAAO,EAAO,gBAAgB,GAAG,EAC5D,EAAM,iBAAiB,GAAK,EAC5B,EAAM,eAAe,GAAM,EAE3B,EAAQ,gBACN,EAAO,MACP,EAAO,OACP,EAAO,gBAAgB,KAAA,EACxB,IACQ,EAAO,SAChB,EAAM,SAAS,EAAO,MAAM,EAGvB;YACA,GAAK;IACZ,IAAM,IACJ,aAAe,QAAQ,EAAI,UAAU;AAEvC,UADA,EAAM,SAAS,EAAQ,EACjB;aACE;AACR,MAAM,WAAW,GAAM;;;EAoCzB,2BA7BgC,EAAc,SAAS;EA8BvD,2BAzBgC,EAAc,SAAS;EA0BvD,8BArBmC,EAAc,YAAY;EAsB7D,uBAjB4B,MAQrB,CAAC,CAP4C;GAClD,uBAAA,KAAA;GACA,uBAAA,KAAA;GACA,0BAAA,KAAA;GACD,CACc,EAAc,GACG;EAWhC,WAAW;EACZ"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ChangePasswordInput, PasswordResetRequestResult } from '../types';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Hook for password management operations
|
|
5
|
+
* Uses Zustand v5 pattern: selectors for state, getState() for actions
|
|
6
|
+
*/
|
|
7
|
+
export declare function usePasswordOperations(): {
|
|
8
|
+
changePassword: (input: ChangePasswordInput) => Promise<boolean>;
|
|
9
|
+
requestPasswordReset: (email: string, recaptchaToken?: string) => Promise<PasswordResetRequestResult>;
|
|
10
|
+
resetPassword: (token: string, newPassword: string) => Promise<boolean>;
|
|
11
|
+
isLoading: boolean;
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=usePasswordOperations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePasswordOperations.d.ts","sourceRoot":"","sources":["../../../src/auth/hooks/usePasswordOperations.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,MAAM,UAAU,CAAC;AAoChF;;;GAGG;AACH,wBAAgB,qBAAqB;4BAqB1B,mBAAmB,KACzB,OAAO,CAAC,OAAO,CAAC;kCAsBV,MAAM,mBACI,MAAM,KACtB,OAAO,CAAC,0BAA0B,CAAC;2BAsB7B,MAAM,eACA,MAAM,KAClB,OAAO,CAAC,OAAO,CAAC;;EAwBpB"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { useAuthStore as e } from "../store/authStore.js";
|
|
2
|
+
import { ChangePasswordDocument as t, RequestPasswordResetDocument as n, ResetPasswordDocument as r } from "../../generated/global-operations.js";
|
|
3
|
+
import { useMutation as i } from "@apollo/client/react";
|
|
4
|
+
//#region src/auth/hooks/usePasswordOperations.ts
|
|
5
|
+
function a() {
|
|
6
|
+
let a = e((e) => e.isLoading), [o] = i(t), [s] = i(n), [c] = i(r);
|
|
7
|
+
return {
|
|
8
|
+
changePassword: async (t) => {
|
|
9
|
+
let n = e.getState();
|
|
10
|
+
try {
|
|
11
|
+
n.setLoading(!0);
|
|
12
|
+
let { data: e } = await o({ variables: { input: t } });
|
|
13
|
+
return e.changePassword;
|
|
14
|
+
} catch (e) {
|
|
15
|
+
throw console.error("Failed to change password:", e), e;
|
|
16
|
+
} finally {
|
|
17
|
+
n.setLoading(!1);
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
requestPasswordReset: async (t, n) => {
|
|
21
|
+
let r = e.getState();
|
|
22
|
+
try {
|
|
23
|
+
r.setLoading(!0);
|
|
24
|
+
let { data: e } = await s({ variables: {
|
|
25
|
+
email: t,
|
|
26
|
+
...n ? { recaptchaToken: n } : {}
|
|
27
|
+
} });
|
|
28
|
+
return e.requestPasswordReset;
|
|
29
|
+
} catch (e) {
|
|
30
|
+
throw console.error("Failed to request password reset:", e), e;
|
|
31
|
+
} finally {
|
|
32
|
+
r.setLoading(!1);
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
resetPassword: async (t, n) => {
|
|
36
|
+
let r = e.getState();
|
|
37
|
+
try {
|
|
38
|
+
r.setLoading(!0);
|
|
39
|
+
let { data: e } = await c({ variables: {
|
|
40
|
+
token: t,
|
|
41
|
+
newPassword: n
|
|
42
|
+
} });
|
|
43
|
+
return e.resetPassword;
|
|
44
|
+
} catch (e) {
|
|
45
|
+
throw console.error("Failed to reset password:", e), e;
|
|
46
|
+
} finally {
|
|
47
|
+
r.setLoading(!1);
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
isLoading: a
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
//#endregion
|
|
54
|
+
export { a as usePasswordOperations };
|
|
55
|
+
|
|
56
|
+
//# sourceMappingURL=usePasswordOperations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePasswordOperations.js","names":[],"sources":["../../../src/auth/hooks/usePasswordOperations.ts"],"sourcesContent":["import { useMutation } from \"@apollo/client/react\";\nimport { useAuthStore } from \"../store/authStore\";\nimport type { ChangePasswordInput, PasswordResetRequestResult } from \"../types\";\n\nimport {\n ChangePasswordDocument,\n RequestPasswordResetDocument,\n ResetPasswordDocument,\n} from \"../../generated/global-operations\";\n// Apollo Client 4.x Response Interfaces\ninterface ChangePasswordResponse {\n changePassword: boolean;\n}\n\ninterface ChangePasswordVariables {\n input: ChangePasswordInput;\n}\n\ninterface RequestPasswordResetResponse {\n requestPasswordReset: PasswordResetRequestResult;\n}\n\ninterface RequestPasswordResetVariables {\n email: string;\n recaptchaToken?: string;\n}\n\ninterface ResetPasswordResponse {\n resetPassword: boolean;\n}\n\ninterface ResetPasswordVariables {\n token: string;\n newPassword: string;\n}\n\n// GraphQL Operations\n\n/**\n * Hook for password management operations\n * Uses Zustand v5 pattern: selectors for state, getState() for actions\n */\nexport function usePasswordOperations() {\n // Use selectors for reactive state\n const isLoading = useAuthStore((state) => state.isLoading);\n\n const [changePasswordMutation] = useMutation<\n ChangePasswordResponse,\n ChangePasswordVariables\n >(ChangePasswordDocument);\n const [requestPasswordResetMutation] = useMutation<\n RequestPasswordResetResponse,\n RequestPasswordResetVariables\n >(RequestPasswordResetDocument);\n const [resetPasswordMutation] = useMutation<\n ResetPasswordResponse,\n ResetPasswordVariables\n >(ResetPasswordDocument);\n\n /**\n * Change password for authenticated user\n */\n const changePassword = async (\n input: ChangePasswordInput,\n ): Promise<boolean> => {\n const store = useAuthStore.getState();\n try {\n store.setLoading(true);\n\n const { data } = await changePasswordMutation({\n variables: { input },\n });\n\n return data!.changePassword;\n } catch (error) {\n console.error(\"Failed to change password:\", error);\n throw error;\n } finally {\n store.setLoading(false);\n }\n };\n\n /**\n * Request password reset email\n */\n const requestPasswordReset = async (\n email: string,\n recaptchaToken?: string,\n ): Promise<PasswordResetRequestResult> => {\n const store = useAuthStore.getState();\n try {\n store.setLoading(true);\n\n const { data } = await requestPasswordResetMutation({\n variables: { email, ...(recaptchaToken ? { recaptchaToken } : {}) },\n });\n\n return data!.requestPasswordReset;\n } catch (error) {\n console.error(\"Failed to request password reset:\", error);\n throw error;\n } finally {\n store.setLoading(false);\n }\n };\n\n /**\n * Reset password with token\n */\n const resetPassword = async (\n token: string,\n newPassword: string,\n ): Promise<boolean> => {\n const store = useAuthStore.getState();\n try {\n store.setLoading(true);\n\n const { data } = await resetPasswordMutation({\n variables: { token, newPassword },\n });\n\n return data!.resetPassword;\n } catch (error) {\n console.error(\"Failed to reset password:\", error);\n throw error;\n } finally {\n store.setLoading(false);\n }\n };\n\n return {\n changePassword,\n requestPasswordReset,\n resetPassword,\n isLoading,\n };\n}\n"],"mappings":";;;;AA0CA,SAAgB,IAAwB;CAEtC,IAAM,IAAY,GAAc,MAAU,EAAM,UAAU,EAEpD,CAAC,KAA0B,EAG/B,EAAuB,EACnB,CAAC,KAAgC,EAGrC,EAA6B,EACzB,CAAC,KAAyB,EAG9B,EAAsB;AAyExB,QAAO;EACL,gBArEqB,OACrB,MACqB;GACrB,IAAM,IAAQ,EAAa,UAAU;AACrC,OAAI;AACF,MAAM,WAAW,GAAK;IAEtB,IAAM,EAAE,YAAS,MAAM,EAAuB,EAC5C,WAAW,EAAE,UAAO,EACrB,CAAC;AAEF,WAAO,EAAM;YACN,GAAO;AAEd,UADA,QAAQ,MAAM,8BAA8B,EAAM,EAC5C;aACE;AACR,MAAM,WAAW,GAAM;;;EAsDzB,sBA/C2B,OAC3B,GACA,MACwC;GACxC,IAAM,IAAQ,EAAa,UAAU;AACrC,OAAI;AACF,MAAM,WAAW,GAAK;IAEtB,IAAM,EAAE,YAAS,MAAM,EAA6B,EAClD,WAAW;KAAE;KAAO,GAAI,IAAiB,EAAE,mBAAgB,GAAG,EAAE;KAAG,EACpE,CAAC;AAEF,WAAO,EAAM;YACN,GAAO;AAEd,UADA,QAAQ,MAAM,qCAAqC,EAAM,EACnD;aACE;AACR,MAAM,WAAW,GAAM;;;EA+BzB,eAxBoB,OACpB,GACA,MACqB;GACrB,IAAM,IAAQ,EAAa,UAAU;AACrC,OAAI;AACF,MAAM,WAAW,GAAK;IAEtB,IAAM,EAAE,YAAS,MAAM,EAAsB,EAC3C,WAAW;KAAE;KAAO;KAAa,EAClC,CAAC;AAEF,WAAO,EAAM;YACN,GAAO;AAEd,UADA,QAAQ,MAAM,6BAA6B,EAAM,EAC3C;aACE;AACR,MAAM,WAAW,GAAM;;;EAQzB;EACD"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { ActiveSessionsQuery } from '../../generated/global-operations';
|
|
2
|
+
import { TokenValidationResponse, ValidateTokensInput } from '../types';
|
|
3
|
+
|
|
4
|
+
interface TokenInfoQueryResponse {
|
|
5
|
+
tokenInfo: TokenValidationResponse;
|
|
6
|
+
}
|
|
7
|
+
interface UseSessionOperationsOptions {
|
|
8
|
+
disableTokenInfoQuery?: boolean;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Hook for session/token management operations
|
|
12
|
+
*/
|
|
13
|
+
export declare function useSessionOperations(options?: UseSessionOperationsOptions): {
|
|
14
|
+
validateTokens: (input: ValidateTokensInput) => Promise<TokenValidationResponse>;
|
|
15
|
+
isTokenExpired: () => boolean;
|
|
16
|
+
getTokenRemainingTime: () => number;
|
|
17
|
+
tokenInfo: TokenValidationResponse | undefined;
|
|
18
|
+
revokeSession: (sessionId: string) => Promise<boolean>;
|
|
19
|
+
revokeAllSessions: () => Promise<{
|
|
20
|
+
success: boolean;
|
|
21
|
+
revokedCount: number;
|
|
22
|
+
}>;
|
|
23
|
+
activeSessions: {
|
|
24
|
+
__typename?: "Session";
|
|
25
|
+
id: string;
|
|
26
|
+
status: import('../../generated/global-types').SessionStatus;
|
|
27
|
+
ipAddress?: string | null;
|
|
28
|
+
userAgent?: string | null;
|
|
29
|
+
location?: string | null;
|
|
30
|
+
lastActivityAt: string;
|
|
31
|
+
expiresAt: string;
|
|
32
|
+
createdAt: string;
|
|
33
|
+
isCurrent: boolean;
|
|
34
|
+
}[];
|
|
35
|
+
sessionsLoading: boolean;
|
|
36
|
+
refetchSessions: (variables?: Partial<import('@apollo/client').OperationVariables> | undefined) => Promise<import("@apollo/client").ApolloClient.QueryResult<ActiveSessionsQuery>>;
|
|
37
|
+
isLoading: boolean;
|
|
38
|
+
refetch: (variables?: Partial<import('@apollo/client').OperationVariables> | undefined) => Promise<import("@apollo/client").ApolloClient.QueryResult<TokenInfoQueryResponse>>;
|
|
39
|
+
};
|
|
40
|
+
export {};
|
|
41
|
+
//# sourceMappingURL=useSessionOperations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSessionOperations.d.ts","sourceRoot":"","sources":["../../../src/auth/hooks/useSessionOperations.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,mBAAmB,EAKpB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAM7E,UAAU,sBAAsB;IAC9B,SAAS,EAAE,uBAAuB,CAAC;CACpC;AAUD,UAAU,2BAA2B;IACnC,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,GAAE,2BAAgC;4BA2ChC,mBAAmB,KACzB,OAAO,CAAC,uBAAuB,CAAC;0BAaR,OAAO;iCAQA,MAAM;;+BASA,MAAM,KAAG,OAAO,CAAC,OAAO,CAAC;6BAmB7B,OAAO,CAAC;QAC1C,OAAO,EAAE,OAAO,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;;;;;;;;;;;;;;;;;EA8BH"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { useAuthStore as e } from "../store/authStore.js";
|
|
2
|
+
import { ActiveSessionsDocument as t, RevokeAllSessionsDocument as n, RevokeSessionDocument as r, TokenInfoDocument as i, ValidateTokensDocument as a } from "../../generated/global-operations.js";
|
|
3
|
+
import { useMutation as o, useQuery as s } from "@apollo/client/react";
|
|
4
|
+
//#region src/auth/hooks/useSessionOperations.ts
|
|
5
|
+
function c(c = {}) {
|
|
6
|
+
let l = e(), u = c.disableTokenInfoQuery ?? !1, [d] = o(a), { data: f, loading: p, refetch: m } = s(i, {
|
|
7
|
+
skip: u || !l.isAuthenticated,
|
|
8
|
+
fetchPolicy: "cache-and-network",
|
|
9
|
+
pollInterval: 300 * 1e3
|
|
10
|
+
}), { data: h, loading: g, refetch: _ } = s(t, {
|
|
11
|
+
skip: !l.isAuthenticated,
|
|
12
|
+
fetchPolicy: "cache-and-network"
|
|
13
|
+
}), [v] = o(r), [y] = o(n);
|
|
14
|
+
return {
|
|
15
|
+
validateTokens: async (e) => {
|
|
16
|
+
try {
|
|
17
|
+
let { data: t } = await d({ variables: { input: e } });
|
|
18
|
+
return t.validateTokens;
|
|
19
|
+
} catch (e) {
|
|
20
|
+
throw console.error("Failed to validate tokens:", e), e;
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
isTokenExpired: () => f?.tokenInfo?.expiresAt ? Date.now() / 1e3 > f.tokenInfo.expiresAt : !0,
|
|
24
|
+
getTokenRemainingTime: () => {
|
|
25
|
+
if (!f?.tokenInfo?.expiresAt) return 0;
|
|
26
|
+
let e = f.tokenInfo.expiresAt - Date.now() / 1e3;
|
|
27
|
+
return Math.max(0, e);
|
|
28
|
+
},
|
|
29
|
+
tokenInfo: f?.tokenInfo,
|
|
30
|
+
revokeSession: async (e) => {
|
|
31
|
+
try {
|
|
32
|
+
let { data: t } = await v({ variables: { sessionId: e } });
|
|
33
|
+
return t?.revokeSession && await _(), t?.revokeSession ?? !1;
|
|
34
|
+
} catch (e) {
|
|
35
|
+
throw console.error("Failed to revoke session:", e), e;
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
revokeAllSessions: async () => {
|
|
39
|
+
try {
|
|
40
|
+
let { data: e } = await y();
|
|
41
|
+
return e?.revokeAllSessions?.success && await _(), e?.revokeAllSessions ?? {
|
|
42
|
+
success: !1,
|
|
43
|
+
revokedCount: 0
|
|
44
|
+
};
|
|
45
|
+
} catch (e) {
|
|
46
|
+
throw console.error("Failed to revoke all sessions:", e), e;
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
activeSessions: h?.activeSessions ?? [],
|
|
50
|
+
sessionsLoading: g,
|
|
51
|
+
refetchSessions: _,
|
|
52
|
+
isLoading: p || g,
|
|
53
|
+
refetch: m
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
//#endregion
|
|
57
|
+
export { c as useSessionOperations };
|
|
58
|
+
|
|
59
|
+
//# sourceMappingURL=useSessionOperations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSessionOperations.js","names":[],"sources":["../../../src/auth/hooks/useSessionOperations.ts"],"sourcesContent":["import { useQuery, useMutation } from \"@apollo/client/react\";\nimport { useAuthStore } from \"../store/authStore\";\nimport {\n TokenInfoDocument,\n ValidateTokensDocument,\n ActiveSessionsDocument,\n RevokeSessionDocument,\n RevokeAllSessionsDocument,\n} from \"../../generated/global-operations\";\nimport type {\n ActiveSessionsQuery,\n RevokeSessionMutation,\n RevokeSessionMutationVariables,\n RevokeAllSessionsMutation,\n RevokeAllSessionsMutationVariables,\n} from \"../../generated/global-operations\";\nimport type { TokenValidationResponse, ValidateTokensInput } from \"../types\";\n\n// =============================================================================\n// GRAPHQL RESPONSE INTERFACES\n// =============================================================================\n\ninterface TokenInfoQueryResponse {\n tokenInfo: TokenValidationResponse;\n}\n\ninterface ValidateTokensMutationResponse {\n validateTokens: TokenValidationResponse;\n}\n\ninterface ValidateTokensMutationVariables {\n input: ValidateTokensInput;\n}\n\ninterface UseSessionOperationsOptions {\n disableTokenInfoQuery?: boolean;\n}\n\n/**\n * Hook for session/token management operations\n */\nexport function useSessionOperations(\n options: UseSessionOperationsOptions = {},\n) {\n const store = useAuthStore();\n const disableTokenInfoQuery = options.disableTokenInfoQuery ?? false;\n const [validateTokensMutation] = useMutation<\n ValidateTokensMutationResponse,\n ValidateTokensMutationVariables\n >(ValidateTokensDocument);\n\n const { data, loading, refetch } = useQuery<TokenInfoQueryResponse>(\n TokenInfoDocument,\n {\n skip: disableTokenInfoQuery || !store.isAuthenticated,\n fetchPolicy: \"cache-and-network\",\n pollInterval: 5 * 60 * 1000, // Poll every 5 minutes (was 1 min — too aggressive)\n },\n );\n\n // Active sessions query\n const {\n data: sessionsData,\n loading: sessionsLoading,\n refetch: refetchSessions,\n } = useQuery<ActiveSessionsQuery>(ActiveSessionsDocument, {\n skip: !store.isAuthenticated,\n fetchPolicy: \"cache-and-network\",\n });\n\n // Session mutations\n const [revokeSessionMutation] = useMutation<\n RevokeSessionMutation,\n RevokeSessionMutationVariables\n >(RevokeSessionDocument);\n\n const [revokeAllSessionsMutation] = useMutation<\n RevokeAllSessionsMutation,\n RevokeAllSessionsMutationVariables\n >(RevokeAllSessionsDocument);\n\n /**\n * Validate tokens\n */\n const validateTokens = async (\n input: ValidateTokensInput,\n ): Promise<TokenValidationResponse> => {\n try {\n const { data } = await validateTokensMutation({ variables: { input } });\n return data!.validateTokens;\n } catch (error) {\n console.error(\"Failed to validate tokens:\", error);\n throw error;\n }\n };\n\n /**\n * Check if token is expired\n */\n const isTokenExpired = (): boolean => {\n if (!data?.tokenInfo?.expiresAt) return true;\n return Date.now() / 1000 > data.tokenInfo.expiresAt;\n };\n\n /**\n * Get remaining time until token expires (in seconds)\n */\n const getTokenRemainingTime = (): number => {\n if (!data?.tokenInfo?.expiresAt) return 0;\n const remaining = data.tokenInfo.expiresAt - Date.now() / 1000;\n return Math.max(0, remaining);\n };\n\n /**\n * Revoke a specific session by ID\n */\n const revokeSession = async (sessionId: string): Promise<boolean> => {\n try {\n const { data } = await revokeSessionMutation({\n variables: { sessionId },\n });\n if (data?.revokeSession) {\n // Refetch active sessions to reflect the change\n await refetchSessions();\n }\n return data?.revokeSession ?? false;\n } catch (error) {\n console.error(\"Failed to revoke session:\", error);\n throw error;\n }\n };\n\n /**\n * Revoke all sessions except the current one\n */\n const revokeAllSessions = async (): Promise<{\n success: boolean;\n revokedCount: number;\n }> => {\n try {\n const { data } = await revokeAllSessionsMutation();\n if (data?.revokeAllSessions?.success) {\n // Refetch active sessions to reflect the change\n await refetchSessions();\n }\n return data?.revokeAllSessions ?? { success: false, revokedCount: 0 };\n } catch (error) {\n console.error(\"Failed to revoke all sessions:\", error);\n throw error;\n }\n };\n\n return {\n // Token operations\n validateTokens,\n isTokenExpired,\n getTokenRemainingTime,\n tokenInfo: data?.tokenInfo,\n // Session operations\n revokeSession,\n revokeAllSessions,\n activeSessions: sessionsData?.activeSessions ?? [],\n sessionsLoading,\n refetchSessions,\n // General state\n isLoading: loading || sessionsLoading,\n refetch,\n };\n}\n"],"mappings":";;;;AAyCA,SAAgB,EACd,IAAuC,EAAE,EACzC;CACA,IAAM,IAAQ,GAAc,EACtB,IAAwB,EAAQ,yBAAyB,IACzD,CAAC,KAA0B,EAG/B,EAAuB,EAEnB,EAAE,SAAM,YAAS,eAAY,EACjC,GACA;EACE,MAAM,KAAyB,CAAC,EAAM;EACtC,aAAa;EACb,cAAc,MAAS;EACxB,CACF,EAGK,EACJ,MAAM,GACN,SAAS,GACT,SAAS,MACP,EAA8B,GAAwB;EACxD,MAAM,CAAC,EAAM;EACb,aAAa;EACd,CAAC,EAGI,CAAC,KAAyB,EAG9B,EAAsB,EAElB,CAAC,KAA6B,EAGlC,EAA0B;AAyE5B,QAAO;EAEL,gBAtEqB,OACrB,MACqC;AACrC,OAAI;IACF,IAAM,EAAE,YAAS,MAAM,EAAuB,EAAE,WAAW,EAAE,UAAO,EAAE,CAAC;AACvE,WAAO,EAAM;YACN,GAAO;AAEd,UADA,QAAQ,MAAM,8BAA8B,EAAM,EAC5C;;;EA+DR,sBAvDK,GAAM,WAAW,YACf,KAAK,KAAK,GAAG,MAAO,EAAK,UAAU,YADF;EAwDxC,6BAjD0C;AAC1C,OAAI,CAAC,GAAM,WAAW,UAAW,QAAO;GACxC,IAAM,IAAY,EAAK,UAAU,YAAY,KAAK,KAAK,GAAG;AAC1D,UAAO,KAAK,IAAI,GAAG,EAAU;;EA+C7B,WAAW,GAAM;EAEjB,eA3CoB,OAAO,MAAwC;AACnE,OAAI;IACF,IAAM,EAAE,YAAS,MAAM,EAAsB,EAC3C,WAAW,EAAE,cAAW,EACzB,CAAC;AAKF,WAJI,GAAM,iBAER,MAAM,GAAiB,EAElB,GAAM,iBAAiB;YACvB,GAAO;AAEd,UADA,QAAQ,MAAM,6BAA6B,EAAM,EAC3C;;;EAgCR,mBAzBwB,YAGpB;AACJ,OAAI;IACF,IAAM,EAAE,YAAS,MAAM,GAA2B;AAKlD,WAJI,GAAM,mBAAmB,WAE3B,MAAM,GAAiB,EAElB,GAAM,qBAAqB;KAAE,SAAS;KAAO,cAAc;KAAG;YAC9D,GAAO;AAEd,UADA,QAAQ,MAAM,kCAAkC,EAAM,EAChD;;;EAaR,gBAAgB,GAAc,kBAAkB,EAAE;EAClD;EACA;EAEA,WAAW,KAAW;EACtB;EACD"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { AuthResult, SSOConfig } from '../types';
|
|
2
|
+
|
|
3
|
+
interface GetSSOConfigResponse {
|
|
4
|
+
getSSOConfig: SSOConfig | null;
|
|
5
|
+
}
|
|
6
|
+
interface GetSSOConfigVariables {
|
|
7
|
+
tenantId: string;
|
|
8
|
+
}
|
|
9
|
+
export interface SSOConfigInput {
|
|
10
|
+
entityId: string;
|
|
11
|
+
ssoUrl: string;
|
|
12
|
+
sloUrl?: string;
|
|
13
|
+
certificate: string;
|
|
14
|
+
enabled?: boolean;
|
|
15
|
+
metadata?: Record<string, unknown>;
|
|
16
|
+
}
|
|
17
|
+
export interface SAMLRequestResult {
|
|
18
|
+
requestId: string;
|
|
19
|
+
ssoUrl: string;
|
|
20
|
+
samlRequest: string;
|
|
21
|
+
}
|
|
22
|
+
export interface ExternalOIDCAuthUrlResult {
|
|
23
|
+
authUrl: string;
|
|
24
|
+
state: string;
|
|
25
|
+
nonce: string;
|
|
26
|
+
codeVerifier: string;
|
|
27
|
+
relayState?: string;
|
|
28
|
+
}
|
|
29
|
+
export interface OIDCConfig {
|
|
30
|
+
issuer: string;
|
|
31
|
+
authorizationEndpoint: string;
|
|
32
|
+
tokenEndpoint: string;
|
|
33
|
+
userinfoEndpoint: string;
|
|
34
|
+
jwksUri: string;
|
|
35
|
+
registrationEndpoint?: string;
|
|
36
|
+
scopesSupported: string[];
|
|
37
|
+
responseTypesSupported: string[];
|
|
38
|
+
grantTypesSupported: string[];
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Hook for SSO/SAML operations
|
|
42
|
+
*/
|
|
43
|
+
export declare function useSsoOperations(tenantId?: string): {
|
|
44
|
+
initiateSsoLogin: (targetTenantId: string, relayState?: string) => Promise<void>;
|
|
45
|
+
handleSamlCallback: (samlResponse: string, relayState?: string) => Promise<AuthResult>;
|
|
46
|
+
saveSsoConfig: (configOrTenantId: SSOConfigInput | string, config?: SSOConfigInput) => Promise<SSOConfig>;
|
|
47
|
+
deleteSsoConfig: (targetTenantId?: string) => Promise<boolean>;
|
|
48
|
+
getOidcAuthUrl: (clientId: string, redirectUri: string, scopes?: string[]) => Promise<string>;
|
|
49
|
+
exchangeOidcCode: (code: string, clientId: string, redirectUri: string) => Promise<AuthResult>;
|
|
50
|
+
validateOidcState: (state: string) => boolean;
|
|
51
|
+
initiateExternalOidcLogin: (targetTenantId: string, redirectPath?: string) => Promise<void>;
|
|
52
|
+
handleExternalOidcCallback: (code: string, state: string) => Promise<AuthResult>;
|
|
53
|
+
isExternalOidcCallback: () => boolean;
|
|
54
|
+
ssoConfig: SSOConfig | undefined;
|
|
55
|
+
oidcConfig: OIDCConfig | undefined;
|
|
56
|
+
isLoading: boolean;
|
|
57
|
+
isGeneratingRequest: boolean;
|
|
58
|
+
isAuthenticating: boolean;
|
|
59
|
+
isSaving: boolean;
|
|
60
|
+
isDeleting: boolean;
|
|
61
|
+
isGeneratingOidcUrl: boolean;
|
|
62
|
+
refetchConfig: (variables?: Partial<GetSSOConfigVariables> | undefined) => Promise<import("@apollo/client").ApolloClient.QueryResult<GetSSOConfigResponse>>;
|
|
63
|
+
};
|
|
64
|
+
export {};
|
|
65
|
+
//# sourceMappingURL=useSsoOperations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSsoOperations.d.ts","sourceRoot":"","sources":["../../../src/auth/hooks/useSsoOperations.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAQ,MAAM,UAAU,CAAC;AAwB5D,UAAU,oBAAoB;IAC5B,YAAY,EAAE,SAAS,GAAG,IAAI,CAAC;CAChC;AAED,UAAU,qBAAqB;IAC7B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAkFD,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,qBAAqB,EAAE,MAAM,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,sBAAsB,EAAE,MAAM,EAAE,CAAC;IACjC,mBAAmB,EAAE,MAAM,EAAE,CAAC;CAC/B;AAiCD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,CAAC,EAAE,MAAM;uCAkD9B,MAAM,eACT,MAAM,KAClB,OAAO,CAAC,IAAI,CAAC;uCA0CA,MAAM,eACP,MAAM,KAClB,OAAO,CAAC,UAAU,CAAC;sCAwNF,cAAc,GAAG,MAAM,WAChC,cAAc,KACtB,OAAO,CAAC,SAAS,CAAC;uCAyB2B,MAAM,KAAG,OAAO,CAAC,OAAO,CAAC;+BAsB7D,MAAM,eACH,MAAM,WACX,MAAM,EAAE,KACf,OAAO,CAAC,MAAM,CAAC;6BAgCV,MAAM,YACF,MAAM,eACH,MAAM,KAClB,OAAO,CAAC,UAAU,CAAC;+BAoGY,MAAM,KAAG,OAAO;gDAhWhC,MAAM,iBACP,MAAM,KACpB,OAAO,CAAC,IAAI,CAAC;uCA8CR,MAAM,SACL,MAAM,KACZ,OAAO,CAAC,UAAU,CAAC;kCAsGa,OAAO;;;;;;;;;;EAqP3C"}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { useAuthStore as e } from "../store/authStore.js";
|
|
2
|
+
import { AuthenticateOidcDocument as t, AuthenticateSamlDocument as n, DeleteSsoConfigDocument as r, GenerateOidcAuthUrlDocument as i, GenerateSamlRequestDocument as a, GetOidcConfigDocument as o, GetSsoConfigDocument as s, SaveSsoConfigDocument as c } from "../../generated/global-operations.js";
|
|
3
|
+
import { OIDC_CODE_VERIFIER as l, OIDC_FLOW as u, OIDC_NONCE as d, OIDC_REDIRECT as f, OIDC_STATE as p, OIDC_TENANT_ID as m } from "../constants/sessionKeys.js";
|
|
4
|
+
import { useMutation as h, useQuery as g } from "@apollo/client/react";
|
|
5
|
+
//#region src/auth/hooks/useSsoOperations.ts
|
|
6
|
+
function _(e) {
|
|
7
|
+
return typeof e == "object" && !!e;
|
|
8
|
+
}
|
|
9
|
+
function v(e) {
|
|
10
|
+
if (!_(e)) return [];
|
|
11
|
+
let t = e.graphQLErrors;
|
|
12
|
+
return Array.isArray(t) ? t.filter((e) => _(e)) : [];
|
|
13
|
+
}
|
|
14
|
+
function y(e, t) {
|
|
15
|
+
let n = v(e)[0];
|
|
16
|
+
return n?.message ? n.message : e instanceof Error || _(e) && typeof e.message == "string" ? e.message : t;
|
|
17
|
+
}
|
|
18
|
+
function b(_) {
|
|
19
|
+
let [v, { loading: b }] = h(a), [w, { loading: T }] = h(n), [E, { loading: D }] = h(c), [O, { loading: k }] = h(r), [A, { loading: j }] = h(i), [M, { loading: N }] = h(t), { data: P, loading: F, refetch: I } = g(s, {
|
|
20
|
+
variables: { tenantId: _ || "" },
|
|
21
|
+
skip: !_
|
|
22
|
+
}), { data: L, loading: R } = g(o, { skip: !1 });
|
|
23
|
+
return {
|
|
24
|
+
initiateSsoLogin: async (e, t) => {
|
|
25
|
+
try {
|
|
26
|
+
let { data: n } = await v({ variables: {
|
|
27
|
+
tenantId: e,
|
|
28
|
+
relayState: t
|
|
29
|
+
} });
|
|
30
|
+
if (!n || !n.generateSAMLRequest) throw Error("SAML SSO is not configured for this tenant. Please contact your administrator or use email/password login.");
|
|
31
|
+
let r = n.generateSAMLRequest, i = new URLSearchParams({ SAMLRequest: r.samlRequest });
|
|
32
|
+
t && i.append("RelayState", t), window.location.href = `${r.ssoUrl}?${i.toString()}`;
|
|
33
|
+
} catch (e) {
|
|
34
|
+
let t = y(e, "Failed to initiate SAML SSO login");
|
|
35
|
+
throw console.error("Failed to initiate SSO login:", t), Error(t);
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
handleSamlCallback: async (t, n) => {
|
|
39
|
+
let r = e.getState(), i = _ || sessionStorage.getItem("oidc_tenant_id") || void 0;
|
|
40
|
+
try {
|
|
41
|
+
r.setLoading(!0), r.setError(null);
|
|
42
|
+
let { data: e, error: a } = await w({ variables: { input: {
|
|
43
|
+
samlResponse: t,
|
|
44
|
+
relayState: n,
|
|
45
|
+
tenantId: i
|
|
46
|
+
} } });
|
|
47
|
+
if (!e?.authenticateSAML) {
|
|
48
|
+
let e = a?.message ?? "SAML authentication failed. Please try again.";
|
|
49
|
+
throw Error(e);
|
|
50
|
+
}
|
|
51
|
+
let o = e.authenticateSAML;
|
|
52
|
+
return o.success && o.user && o.token ? (r.setUser(o.user), r.setAuthTokens(o.token, o.refreshToken || ""), r.setAuthenticated(!0)) : o.error && r.setError(o.error), o;
|
|
53
|
+
} catch (e) {
|
|
54
|
+
let t = e instanceof Error ? e.message : "SAML authentication failed";
|
|
55
|
+
throw r.setError(t), e;
|
|
56
|
+
} finally {
|
|
57
|
+
r.setLoading(!1);
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
saveSsoConfig: async (e, t) => {
|
|
61
|
+
let n = typeof e == "string" ? e : _ || "", r = typeof e == "string" ? t : e;
|
|
62
|
+
try {
|
|
63
|
+
let { data: e, error: t } = await E({ variables: {
|
|
64
|
+
tenantId: n,
|
|
65
|
+
input: r
|
|
66
|
+
} });
|
|
67
|
+
if (await I(), !e?.saveSSOConfig) throw Error(t?.message ?? "Failed to save SSO config");
|
|
68
|
+
return e.saveSSOConfig;
|
|
69
|
+
} catch (e) {
|
|
70
|
+
throw console.error("Failed to save SSO config:", e), e;
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
deleteSsoConfig: async (e) => {
|
|
74
|
+
let t = e || _ || "";
|
|
75
|
+
try {
|
|
76
|
+
let { data: e, error: n } = await O({ variables: { tenantId: t } });
|
|
77
|
+
if (await I(), e?.deleteSSOConfig == null) throw Error(n?.message ?? "Failed to delete SSO config");
|
|
78
|
+
return e.deleteSSOConfig;
|
|
79
|
+
} catch (e) {
|
|
80
|
+
throw console.error("Failed to delete SSO config:", e), e;
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
getOidcAuthUrl: async (e, t, n = [
|
|
84
|
+
"openid",
|
|
85
|
+
"profile",
|
|
86
|
+
"email"
|
|
87
|
+
]) => {
|
|
88
|
+
let r = L?.getOIDCConfig;
|
|
89
|
+
if (!r) throw Error("OIDC configuration not available");
|
|
90
|
+
let i = x(), a = await S(i), o = C();
|
|
91
|
+
sessionStorage.setItem(l, i), sessionStorage.setItem(p, o);
|
|
92
|
+
let s = new URLSearchParams({
|
|
93
|
+
response_type: "code",
|
|
94
|
+
client_id: e,
|
|
95
|
+
redirect_uri: t,
|
|
96
|
+
scope: n.join(" "),
|
|
97
|
+
state: o,
|
|
98
|
+
code_challenge: a,
|
|
99
|
+
code_challenge_method: "S256"
|
|
100
|
+
});
|
|
101
|
+
return `${r.authorizationEndpoint}?${s.toString()}`;
|
|
102
|
+
},
|
|
103
|
+
exchangeOidcCode: async (t, n, r) => {
|
|
104
|
+
let i = L?.getOIDCConfig;
|
|
105
|
+
if (!i) throw Error("OIDC configuration not available");
|
|
106
|
+
let a = e.getState(), o = sessionStorage.getItem(l);
|
|
107
|
+
if (!o) throw Error("Code verifier not found. Please restart the login flow.");
|
|
108
|
+
try {
|
|
109
|
+
a.setLoading(!0), a.setError(null);
|
|
110
|
+
let e = await fetch(i.tokenEndpoint, {
|
|
111
|
+
method: "POST",
|
|
112
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
113
|
+
body: new URLSearchParams({
|
|
114
|
+
grant_type: "authorization_code",
|
|
115
|
+
code: t,
|
|
116
|
+
redirect_uri: r,
|
|
117
|
+
client_id: n,
|
|
118
|
+
code_verifier: o
|
|
119
|
+
})
|
|
120
|
+
}), s = await e.json();
|
|
121
|
+
if (!e.ok) throw Error(s.error_description || s.error || "Token exchange failed");
|
|
122
|
+
sessionStorage.removeItem(l), sessionStorage.removeItem(p);
|
|
123
|
+
let c = await (await fetch(i.userinfoEndpoint, { headers: { Authorization: `Bearer ${s.access_token}` } })).json(), u = (/* @__PURE__ */ new Date()).toISOString(), d = {
|
|
124
|
+
success: !0,
|
|
125
|
+
token: s.access_token,
|
|
126
|
+
refreshToken: s.refresh_token,
|
|
127
|
+
expiresIn: s.expires_in,
|
|
128
|
+
user: {
|
|
129
|
+
id: c.sub,
|
|
130
|
+
email: c.email,
|
|
131
|
+
username: c.preferred_username || c.email,
|
|
132
|
+
emailVerified: c.email_verified ?? !0,
|
|
133
|
+
firstName: c.given_name,
|
|
134
|
+
lastName: c.family_name,
|
|
135
|
+
name: c.name,
|
|
136
|
+
role: "MEMBER",
|
|
137
|
+
status: "ACTIVE",
|
|
138
|
+
mfaEnabled: !1,
|
|
139
|
+
createdAt: u,
|
|
140
|
+
updatedAt: u
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
return d.user && d.token && (a.setUser(d.user), a.setAuthTokens(d.token, d.refreshToken || ""), a.setAuthenticated(!0)), d;
|
|
144
|
+
} catch (e) {
|
|
145
|
+
let t = e instanceof Error ? e.message : "OIDC authentication failed";
|
|
146
|
+
throw a.setError(t), e;
|
|
147
|
+
} finally {
|
|
148
|
+
a.setLoading(!1);
|
|
149
|
+
}
|
|
150
|
+
},
|
|
151
|
+
validateOidcState: (e) => sessionStorage.getItem(p) === e,
|
|
152
|
+
initiateExternalOidcLogin: async (e, t) => {
|
|
153
|
+
try {
|
|
154
|
+
let { data: n } = await A({ variables: {
|
|
155
|
+
tenantId: e,
|
|
156
|
+
state: t
|
|
157
|
+
} });
|
|
158
|
+
if (!n || !n.generateOIDCAuthUrl) throw Error("SSO is not configured for this tenant. Please contact your administrator or use email/password login.");
|
|
159
|
+
let r = n.generateOIDCAuthUrl;
|
|
160
|
+
sessionStorage.setItem(l, r.codeVerifier), sessionStorage.setItem(p, r.state), sessionStorage.setItem(d, r.nonce), sessionStorage.setItem(m, e), sessionStorage.setItem(u, "external"), sessionStorage.setItem("oidc_redirect", r.relayState || t || "/dashboard"), window.location.href = r.authUrl;
|
|
161
|
+
} catch (e) {
|
|
162
|
+
let t = y(e, "Failed to initiate OIDC SSO login");
|
|
163
|
+
throw console.error("Failed to initiate external OIDC login:", t), Error(t);
|
|
164
|
+
}
|
|
165
|
+
},
|
|
166
|
+
handleExternalOidcCallback: async (t, n) => {
|
|
167
|
+
let r = e.getState();
|
|
168
|
+
try {
|
|
169
|
+
r.setLoading(!0), r.setError(null);
|
|
170
|
+
let e = sessionStorage.getItem(p);
|
|
171
|
+
if (n !== e) throw Error(`Invalid state parameter. Possible CSRF attack. Expected: ${e?.substring(0, 10)}..., Got: ${n.substring(0, 10)}...`);
|
|
172
|
+
let i = sessionStorage.getItem(l), a = sessionStorage.getItem(d), o = sessionStorage.getItem("oidc_tenant_id") || "default";
|
|
173
|
+
if (!i) throw Error("Code verifier not found. Please restart the login flow.");
|
|
174
|
+
let { data: s } = await M({ variables: { input: {
|
|
175
|
+
tenantId: o,
|
|
176
|
+
code: t,
|
|
177
|
+
state: n,
|
|
178
|
+
codeVerifier: i,
|
|
179
|
+
nonce: a
|
|
180
|
+
} } });
|
|
181
|
+
if (!s) throw Error("No data returned from authenticateOIDC mutation");
|
|
182
|
+
let c = s.authenticateOIDC, h = sessionStorage.getItem("oidc_redirect") || "/dashboard";
|
|
183
|
+
return sessionStorage.removeItem(l), sessionStorage.removeItem(p), sessionStorage.removeItem(d), sessionStorage.removeItem(m), sessionStorage.removeItem(u), sessionStorage.removeItem(f), c.user && c.accessToken ? (r.setUser(c.user), r.setAuthTokens(c.accessToken, c.refreshToken || ""), r.setAuthenticated(!0), {
|
|
184
|
+
success: !0,
|
|
185
|
+
user: c.user,
|
|
186
|
+
token: c.accessToken,
|
|
187
|
+
refreshToken: c.refreshToken,
|
|
188
|
+
expiresIn: c.expiresIn,
|
|
189
|
+
redirectPath: h
|
|
190
|
+
}) : {
|
|
191
|
+
success: !1,
|
|
192
|
+
error: "Authentication failed",
|
|
193
|
+
redirectPath: h
|
|
194
|
+
};
|
|
195
|
+
} catch (e) {
|
|
196
|
+
console.error("[OIDC Callback] Error:", e);
|
|
197
|
+
let t = e instanceof Error ? e.message : "OIDC authentication failed";
|
|
198
|
+
throw r.setError(t), sessionStorage.removeItem(l), sessionStorage.removeItem(p), sessionStorage.removeItem(d), sessionStorage.removeItem(m), sessionStorage.removeItem(u), sessionStorage.removeItem(f), e;
|
|
199
|
+
} finally {
|
|
200
|
+
r.setLoading(!1);
|
|
201
|
+
}
|
|
202
|
+
},
|
|
203
|
+
isExternalOidcCallback: () => {
|
|
204
|
+
let e = sessionStorage.getItem(u) === "external", t = !!sessionStorage.getItem(m), n = !!sessionStorage.getItem(l);
|
|
205
|
+
return e || t && n;
|
|
206
|
+
},
|
|
207
|
+
ssoConfig: P?.getSSOConfig ?? void 0,
|
|
208
|
+
oidcConfig: L?.getOIDCConfig ?? void 0,
|
|
209
|
+
isLoading: F || R || b || T || D || k || j || N,
|
|
210
|
+
isGeneratingRequest: b,
|
|
211
|
+
isAuthenticating: T || N,
|
|
212
|
+
isSaving: D,
|
|
213
|
+
isDeleting: k,
|
|
214
|
+
isGeneratingOidcUrl: j,
|
|
215
|
+
refetchConfig: I
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
function x() {
|
|
219
|
+
let e = new Uint8Array(32);
|
|
220
|
+
return crypto.getRandomValues(e), w(e);
|
|
221
|
+
}
|
|
222
|
+
async function S(e) {
|
|
223
|
+
let t = new TextEncoder().encode(e), n = await crypto.subtle.digest("SHA-256", t);
|
|
224
|
+
return w(new Uint8Array(n));
|
|
225
|
+
}
|
|
226
|
+
function C() {
|
|
227
|
+
let e = new Uint8Array(16);
|
|
228
|
+
return crypto.getRandomValues(e), w(e);
|
|
229
|
+
}
|
|
230
|
+
function w(e) {
|
|
231
|
+
return btoa(String.fromCharCode(...e)).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
|
|
232
|
+
}
|
|
233
|
+
//#endregion
|
|
234
|
+
export { b as useSsoOperations };
|
|
235
|
+
|
|
236
|
+
//# sourceMappingURL=useSsoOperations.js.map
|