@nibssplc/cams-sdk-react 1.0.0-rc.70 → 1.0.0-rc.71

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.
@@ -1,6 +1,5 @@
1
1
  import z from "zod";
2
2
  declare const MFAEndpointsSchema: z.ZodObject<{
3
- ValidateUser: z.ZodURL;
4
3
  ValidateUserMFA: z.ZodURL;
5
4
  RegisterNewChallenge: z.ZodURL;
6
5
  RegisterVerify: z.ZodURL;
@@ -23,5 +22,5 @@ interface MFAGateProps {
23
22
  }) => void;
24
23
  onAuthError?: (error: any) => void;
25
24
  }
26
- declare const MFAGate: ({ children, fallback, usePassKey, useADLogin, CredentialsAuthEndpoint, PassKeysRegisterProps, MFAEndpoints, requiresMFA, onAuthSuccess, onAuthError, }: MFAGateProps) => string | number | bigint | boolean | Iterable<import("react").ReactNode> | Promise<string | number | bigint | boolean | import("react").ReactPortal | import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | Iterable<import("react").ReactNode> | null | undefined> | import("react/jsx-runtime").JSX.Element | null;
25
+ declare const MFAGate: ({ children, fallback, usePassKey, useADLogin, CredentialsAuthEndpoint, PassKeysRegisterProps, MFAEndpoints, requiresMFA, onAuthSuccess, onAuthError, }: MFAGateProps) => string | number | bigint | boolean | Iterable<import("react").ReactNode> | Promise<string | number | bigint | boolean | import("react").ReactPortal | import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | Iterable<import("react").ReactNode> | null | undefined> | import("react/jsx-runtime").JSX.Element | null | undefined;
27
26
  export default MFAGate;
@@ -11,6 +11,7 @@ interface RegularCAMSContextValue extends BaseCAMSContextValue, UseCAMSAuthRetur
11
11
  authMode: "REGULAR";
12
12
  }
13
13
  interface MSALCAMSContextValue extends BaseCAMSContextValue, UseCAMSMSALAuthReturn {
14
+ email: string;
14
15
  authMode: "MSAL";
15
16
  onAuthSuccess?: (tokens: {
16
17
  accessToken: string;
@@ -21,6 +21,7 @@ export interface UseCAMSMSALAuthReturn {
21
21
  idToken: string;
22
22
  accessToken: string;
23
23
  appCode: string;
24
+ email: string;
24
25
  requiresMFA: boolean;
25
26
  completeMFA: (data: MFAAuthenticatedResponse) => Promise<MFAAuthenticatedResponse>;
26
27
  setRequiresMFA: React.Dispatch<React.SetStateAction<boolean>>;
package/dist/index.cjs.js CHANGED
@@ -440,9 +440,10 @@ function useCAMSMSALAuth(options) {
440
440
  var _c = React.useState(null), error = _c[0], setError = _c[1];
441
441
  var _d = React.useState(""), idToken = _d[0], setIdToken = _d[1];
442
442
  var _e = React.useState(""), accessToken = _e[0], setAccessToken = _e[1];
443
+ var _f = React.useState(""), email = _f[0], setEmail = _f[1];
443
444
  // const [mfaAuthenticator, setMfaAuthenticator] =
444
445
  // useState<CAMSMFAAuthenticator | null>(null);
445
- var _f = React.useState(false), requiresMFA = _f[0], setRequiresMFA = _f[1];
446
+ var _g = React.useState(false), requiresMFA = _g[0], setRequiresMFA = _g[1];
446
447
  var isLoading = inProgress !== msalBrowser.InteractionStatus.None;
447
448
  var isAuthenticated = !!account && !!accessToken && !requiresMFA;
448
449
  var scopes = optScopes || ["openid", "profile", "email"];
@@ -521,17 +522,17 @@ function useCAMSMSALAuth(options) {
521
522
  return [4 /*yield*/, authenticator.GetUserMFAConfig(mfaConfig)];
522
523
  case 3:
523
524
  userConfig = _b.sent();
524
- camsSdk.Logger.debug("MFA Authenticator initialized:", userConfig);
525
- console.log("MFA Authenticator initialized:", userConfig);
525
+ camsSdk.Logger.info("MFA Authenticator initialized:", userConfig);
526
526
  // Don't persist as authenticated until MFA is complete
527
527
  if (typeof window !== "undefined" && userConfig.isValid) {
528
- setRequiresMFA(userConfig.userInfo.isMFAEnabled);
529
528
  localStorage.setItem(storageKey, JSON.stringify({
530
529
  isAuthenticated: false,
531
530
  requiresMFA: userConfig.userInfo.isMFAEnabled,
532
531
  accessToken: response.accessToken,
533
532
  idToken: response.idToken,
534
533
  }));
534
+ setEmail(userConfig.userInfo.email);
535
+ setRequiresMFA(userConfig.userInfo.isMFAEnabled);
535
536
  }
536
537
  return [3 /*break*/, 5];
537
538
  case 4:
@@ -651,6 +652,7 @@ function useCAMSMSALAuth(options) {
651
652
  isAuthenticated: isAuthenticated,
652
653
  isLoading: isLoading,
653
654
  error: error,
655
+ email: email,
654
656
  idToken: idToken,
655
657
  accessToken: accessToken,
656
658
  appCode: appCode,
@@ -1542,59 +1544,33 @@ var useCredentialsHandler = function (onAuthComplete) {
1542
1544
  };
1543
1545
 
1544
1546
  var MFAOptions = function (_a) {
1545
- var _b, _c;
1547
+ var _b, _c, _d, _e, _f;
1546
1548
  var onComplete = _a.onComplete, onAuthFailed = _a.onAuthFailed, MFAEndpoints = _a.MFAEndpoints, usePassKey = _a.usePassKey;
1547
- var _d = React.useState(""), value = _d[0], setValue = _d[1];
1548
- var _e = React.useState(false), otpVisible = _e[0], setOtpVisible = _e[1];
1549
- var _f = React.useState(false), showSuccessAnimation = _f[0], setShowSuccessAnimation = _f[1];
1550
- var _g = React.useState(null), authType = _g[0], setAuthType = _g[1];
1549
+ var _g = React.useState(""), value = _g[0], setValue = _g[1];
1550
+ var _h = React.useState(false), otpVisible = _h[0], setOtpVisible = _h[1];
1551
+ var _j = React.useState(false), showSuccessAnimation = _j[0], setShowSuccessAnimation = _j[1];
1552
+ var _k = React.useState(null), authType = _k[0], setAuthType = _k[1];
1551
1553
  var context = useCAMSContext();
1552
- var _h = context.authMode === "MSAL" && "sendEmailOTP" in context
1554
+ var _l = context.authMode === "MSAL" && "sendEmailOTP" in context
1553
1555
  ? context
1554
- : { sendEmailOTP: null, completeMFA: null, logout: function () { return __awaiter$1(void 0, void 0, void 0, function () { return __generator$1(this, function (_a) {
1556
+ : { completeMFA: null, logout: function () { return __awaiter$1(void 0, void 0, void 0, function () { return __generator$1(this, function (_a) {
1555
1557
  return [2 /*return*/];
1556
- }); }); } }; _h.sendEmailOTP; var completeMFA = _h.completeMFA, logout = _h.logout;
1558
+ }); }); } }, completeMFA = _l.completeMFA, logout = _l.logout;
1557
1559
  context.authMode === "MSAL" ? context.accessToken : "";
1558
1560
  context.authMode === "MSAL" ? context.idToken : "";
1559
1561
  var authenticate = useWebAuthn().authenticate;
1560
1562
  var authenticator = new camsSdk.CAMSMFAAuthenticator();
1561
- // const handleFIDOLogin = async () => {
1562
- // try {
1563
- // // 1. Fetch authentication challenge from your server
1564
- // console.log("Requesting authentication challenge from server...");
1565
- // const { data: options } = await axiosInstance.post(
1566
- // MFAEndpoints.RetrieveAuthChallenge,
1567
- // {}
1568
- // );
1569
- // console.log("Received challenge:", options);
1570
- // // 2. Call the SDK to trigger the browser's passkey authentication UI
1571
- // console.log("Calling SDK authenticate function...");
1572
- // const assertionResponse = await authenticate({
1573
- // ...options,
1574
- // userVerification: "discouraged",
1575
- // });
1576
- // console.log(
1577
- // "Authentication assertion received from client:",
1578
- // assertionResponse
1579
- // );
1580
- // // 3. Send the assertion back to the server for verification
1581
- // console.log("Sending assertion to server for verification...");
1582
- // await axiosInstance.post(
1583
- // MFAEndpoints.AuthChallengeVerify,
1584
- // assertionResponse
1585
- // );
1586
- // toast.success("🔑 Sign-in successful!");
1587
- // } catch (error) {
1588
- // console.error("Authentication failed:", error);
1589
- // toast.error("❌ Could not sign in.");
1590
- // }
1591
- // };
1592
- var _j = useOTPHandler({
1593
- email: ((_c = (_b = context.user) === null || _b === void 0 ? void 0 : _b.profile) === null || _c === void 0 ? void 0 : _c.email) || "",
1563
+ camsSdk.Logger.debug("User context:", {
1564
+ user: context.user,
1565
+ profile: (_b = context.user) === null || _b === void 0 ? void 0 : _b.profile,
1566
+ email: (_d = (_c = context.user) === null || _c === void 0 ? void 0 : _c.profile) === null || _d === void 0 ? void 0 : _d.email,
1567
+ });
1568
+ var _m = useOTPHandler({
1569
+ email: ((_f = (_e = context.user) === null || _e === void 0 ? void 0 : _e.profile) === null || _f === void 0 ? void 0 : _f.email) || context.email,
1594
1570
  appCode: context.appCode || "",
1595
1571
  MFAEndpoint: MFAEndpoints.ValidateUserMFA,
1596
1572
  onAuthComplete: function (state, data) {
1597
- console.log("Completed Auth. Handling MFA", state);
1573
+ console.log("Completed Auth. Handling MFA", state, data);
1598
1574
  if (state) {
1599
1575
  // Call completeMFA to update context state
1600
1576
  if (completeMFA && data) {
@@ -1619,7 +1595,7 @@ var MFAOptions = function (_a) {
1619
1595
  }
1620
1596
  }
1621
1597
  },
1622
- }), handleSubmitOTP = _j.handleSubmitOTP, loading = _j.loading, attemptCount = _j.attemptCount, remainingAttempts = _j.remainingAttempts, isMaxAttemptsReached = _j.isMaxAttemptsReached, resetAttempts = _j.resetAttempts;
1598
+ }), handleSubmitOTP = _m.handleSubmitOTP, loading = _m.loading, attemptCount = _m.attemptCount, remainingAttempts = _m.remainingAttempts, isMaxAttemptsReached = _m.isMaxAttemptsReached, resetAttempts = _m.resetAttempts;
1623
1599
  var handleGoBack = function () {
1624
1600
  setAuthType(null);
1625
1601
  setOtpVisible(false);
@@ -1824,7 +1800,6 @@ var ErrorFallback = function (_a) {
1824
1800
  };
1825
1801
 
1826
1802
  var MFAEndpointsSchema = z.object({
1827
- ValidateUser: z.url("ValidateUser Endpoint must be a valid URL"),
1828
1803
  ValidateUserMFA: z.url("ValidateUser MFA Endpoint must be a valid URL"),
1829
1804
  RegisterNewChallenge: z.url("MFA RegisterNewChallenge must be a valid URL"),
1830
1805
  RegisterVerify: z.url("MFA RegisterVerify must be a valid URL"),
@@ -1838,6 +1813,7 @@ var MFAGate = function (_a) {
1838
1813
  // loginComponent: LoginComponent = DefaultLoginPage,
1839
1814
  usePassKey = _c === void 0 ? false : _c, _d = _a.useADLogin, useADLogin = _d === void 0 ? false : _d, CredentialsAuthEndpoint = _a.CredentialsAuthEndpoint, PassKeysRegisterProps = _a.PassKeysRegisterProps, MFAEndpoints = _a.MFAEndpoints, requiresMFA = _a.requiresMFA, onAuthSuccess = _a.onAuthSuccess, onAuthError = _a.onAuthError;
1840
1815
  var context = useCAMSContext();
1816
+ var _e = React.useState("Loading"), authState = _e[0], setAuthState = _e[1];
1841
1817
  var validatedMFAEndpoints = React.useMemo(function () {
1842
1818
  var parsed = MFAEndpointsSchema.safeParse(MFAEndpoints);
1843
1819
  if (!parsed.success) {
@@ -1882,30 +1858,74 @@ var MFAGate = function (_a) {
1882
1858
  });
1883
1859
  }); }, [context, onAuthError]);
1884
1860
  React.useEffect(function () {
1885
- if (requiresMFA === false &&
1886
- "accessToken" in context &&
1887
- context.accessToken &&
1888
- "setRequiresMFA" in context) {
1889
- context.setRequiresMFA(false);
1861
+ if (context.isLoading) {
1862
+ setAuthState("Loading");
1863
+ return;
1864
+ }
1865
+ if (!context.isAuthenticated) {
1866
+ setAuthState("Unauthenticated");
1867
+ return;
1890
1868
  }
1891
- }, [requiresMFA, context]);
1869
+ // Small delay to ensure all context updates are processed
1870
+ var timer = setTimeout(function () {
1871
+ var shouldRequireMFA = requiresMFA !== null && requiresMFA !== void 0 ? requiresMFA : ("requiresMFA" in context ? context.requiresMFA : false);
1872
+ var accessToken = "accessToken" in context ? context.accessToken : "";
1873
+ if (shouldRequireMFA && accessToken) {
1874
+ setAuthState("MFA_Required");
1875
+ }
1876
+ else {
1877
+ setAuthState("Authenticated");
1878
+ }
1879
+ }, 50);
1880
+ return function () { return clearTimeout(timer); };
1881
+ }, [
1882
+ context.isLoading,
1883
+ context.isAuthenticated,
1884
+ // context["requiresMFA"],
1885
+ requiresMFA,
1886
+ context,
1887
+ ]);
1892
1888
  if (useADLogin && !CredentialsAuthEndpoint)
1893
1889
  return jsxRuntime.jsx(ErrorFallback, { message: "Invalid AD Login Configuration." });
1894
1890
  if (!validatedMFAEndpoints)
1895
1891
  return jsxRuntime.jsx(ErrorFallback, { message: "Invalid MFA Configuration." });
1896
1892
  if (context.authMode !== "MSAL")
1897
1893
  return jsxRuntime.jsx(jsxRuntime.Fragment, { children: children });
1898
- if (context.isLoading)
1899
- return fallback;
1900
- if (!context.isAuthenticated) {
1901
- var shouldRequireMFA = requiresMFA !== null && requiresMFA !== void 0 ? requiresMFA : ("requiresMFA" in context ? context.requiresMFA : false);
1902
- var accessToken = "accessToken" in context ? context.accessToken : "";
1903
- if (shouldRequireMFA && accessToken) {
1894
+ // if (!context.isAuthenticated) {
1895
+ // const shouldRequireMFA =
1896
+ // requiresMFA ?? ("requiresMFA" in context ? context.requiresMFA : false);
1897
+ // const accessToken = "accessToken" in context ? context.accessToken : "";
1898
+ // if (shouldRequireMFA && accessToken) {
1899
+ // return (
1900
+ // <MFAOptions
1901
+ // MFAEndpoints={validatedMFAEndpoints}
1902
+ // usePassKey={usePassKey}
1903
+ // onComplete={handleComplete}
1904
+ // onAuthFailed={handleAuthFailed}
1905
+ // />
1906
+ // );
1907
+ // }
1908
+ // return (
1909
+ // <DefaultLoginPage
1910
+ // usePassKey={usePassKey}
1911
+ // useADLogin={useADLogin}
1912
+ // MFAEndpoints={MFAEndpoints!}
1913
+ // PassKeysRegisterProps={PassKeysRegisterProps}
1914
+ // CredentialsAuthEndpoint={CredentialsAuthEndpoint}
1915
+ // />
1916
+ // );
1917
+ // }
1918
+ switch (authState) {
1919
+ case "Loading":
1920
+ return fallback;
1921
+ case "MFA_Required":
1904
1922
  return (jsxRuntime.jsx(MFAOptions, { MFAEndpoints: validatedMFAEndpoints, usePassKey: usePassKey, onComplete: handleComplete, onAuthFailed: handleAuthFailed }));
1905
- }
1906
- return (jsxRuntime.jsx(DefaultLoginPage, { usePassKey: usePassKey, useADLogin: useADLogin, MFAEndpoints: MFAEndpoints, PassKeysRegisterProps: PassKeysRegisterProps, CredentialsAuthEndpoint: CredentialsAuthEndpoint }));
1923
+ case "Authenticated":
1924
+ return jsxRuntime.jsx(jsxRuntime.Fragment, { children: children });
1925
+ case "Unauthenticated":
1926
+ default:
1927
+ jsxRuntime.jsx(DefaultLoginPage, { usePassKey: usePassKey, useADLogin: useADLogin, MFAEndpoints: MFAEndpoints, PassKeysRegisterProps: PassKeysRegisterProps, CredentialsAuthEndpoint: CredentialsAuthEndpoint });
1907
1928
  }
1908
- return jsxRuntime.jsx(jsxRuntime.Fragment, { children: children });
1909
1929
  };
1910
1930
 
1911
1931
  exports.CAMSMSALProvider = CAMSMSALProvider;