@nibssplc/cams-sdk-react 1.0.0-rc.70 → 1.0.0-rc.72
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.
|
@@ -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
|
|
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.
|
|
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
|
|
1548
|
-
var
|
|
1549
|
-
var
|
|
1550
|
-
var
|
|
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
|
|
1554
|
+
var _l = context.authMode === "MSAL" && "sendEmailOTP" in context
|
|
1553
1555
|
? context
|
|
1554
|
-
: {
|
|
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
|
-
}); }); } }
|
|
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
|
-
|
|
1562
|
-
|
|
1563
|
-
|
|
1564
|
-
|
|
1565
|
-
|
|
1566
|
-
|
|
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 =
|
|
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,50 @@ var MFAGate = function (_a) {
|
|
|
1882
1858
|
});
|
|
1883
1859
|
}); }, [context, onAuthError]);
|
|
1884
1860
|
React.useEffect(function () {
|
|
1885
|
-
if (
|
|
1886
|
-
"
|
|
1887
|
-
|
|
1888
|
-
|
|
1889
|
-
|
|
1861
|
+
if (context.isLoading) {
|
|
1862
|
+
setAuthState("Loading");
|
|
1863
|
+
return;
|
|
1864
|
+
}
|
|
1865
|
+
if (!context.isAuthenticated) {
|
|
1866
|
+
setAuthState("Unauthenticated");
|
|
1867
|
+
return;
|
|
1890
1868
|
}
|
|
1891
|
-
|
|
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
|
-
|
|
1899
|
-
|
|
1900
|
-
|
|
1901
|
-
|
|
1902
|
-
var accessToken = "accessToken" in context ? context.accessToken : "";
|
|
1903
|
-
if (shouldRequireMFA && accessToken) {
|
|
1894
|
+
switch (authState) {
|
|
1895
|
+
case "Loading":
|
|
1896
|
+
return fallback;
|
|
1897
|
+
case "MFA_Required":
|
|
1904
1898
|
return (jsxRuntime.jsx(MFAOptions, { MFAEndpoints: validatedMFAEndpoints, usePassKey: usePassKey, onComplete: handleComplete, onAuthFailed: handleAuthFailed }));
|
|
1905
|
-
|
|
1906
|
-
|
|
1899
|
+
case "Authenticated":
|
|
1900
|
+
return jsxRuntime.jsx(jsxRuntime.Fragment, { children: children });
|
|
1901
|
+
case "Unauthenticated":
|
|
1902
|
+
default:
|
|
1903
|
+
return (jsxRuntime.jsx(DefaultLoginPage, { usePassKey: usePassKey, useADLogin: useADLogin, MFAEndpoints: MFAEndpoints, PassKeysRegisterProps: PassKeysRegisterProps, CredentialsAuthEndpoint: CredentialsAuthEndpoint }));
|
|
1907
1904
|
}
|
|
1908
|
-
return jsxRuntime.jsx(jsxRuntime.Fragment, { children: children });
|
|
1909
1905
|
};
|
|
1910
1906
|
|
|
1911
1907
|
exports.CAMSMSALProvider = CAMSMSALProvider;
|