@nibssplc/cams-sdk-react 0.0.1-beta.98 → 1.0.0-rc.2
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/dist/components/ADLoginModal.d.ts +3 -1
- package/dist/components/DefaultLoginPage.d.ts +3 -1
- package/dist/components/MFAGate.d.ts +3 -1
- package/dist/hooks/useOTPHandler.d.ts +2 -7
- package/dist/index.cjs.js +147 -66
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.esm.js +147 -66
- package/dist/index.esm.js.map +1 -1
- package/dist/utils/DeviceID.d.ts +4 -1
- package/package.json +1 -1
package/dist/index.esm.js
CHANGED
|
@@ -555,23 +555,27 @@ function arrayBufferToBase64url(buffer) {
|
|
|
555
555
|
function register(options) {
|
|
556
556
|
return __awaiter(this, void 0, void 0, function () {
|
|
557
557
|
var createOptions, credential, publicKeyCredential, attestationResponse, transports, err_1;
|
|
558
|
-
var _a, _b, _c;
|
|
559
|
-
return __generator(this, function (
|
|
560
|
-
switch (
|
|
558
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|
559
|
+
return __generator(this, function (_k) {
|
|
560
|
+
switch (_k.label) {
|
|
561
561
|
case 0:
|
|
562
|
-
|
|
562
|
+
_k.trys.push([0, 2, , 3]);
|
|
563
563
|
createOptions = __assign(__assign({}, options), { challenge: base64urlToArrayBuffer(options.challenge), user: __assign(__assign({}, options.user), { id: base64urlToArrayBuffer(options.user.id) }) });
|
|
564
|
-
console.log("Creating credential with options:", createOptions, "...\n\n\n", options);
|
|
565
564
|
return [4 /*yield*/, navigator.credentials.create({
|
|
566
|
-
publicKey: createOptions,
|
|
565
|
+
publicKey: __assign(__assign({}, createOptions), { pubKeyCredParams: (_a = options.pubKeyCredParams) === null || _a === void 0 ? void 0 : _a.map(function (param) { return ({
|
|
566
|
+
type: "public-key",
|
|
567
|
+
alg: param.alg,
|
|
568
|
+
}); }), attestation: (((_b = options.attestation) === null || _b === void 0 ? void 0 : _b.toLowerCase()) || "none"), authenticatorSelection: __assign(__assign({}, options.authenticatorSelection), { residentKey: (((_d = (_c = options.authenticatorSelection) === null || _c === void 0 ? void 0 : _c.residentKey) === null || _d === void 0 ? void 0 : _d.toLowerCase()) ||
|
|
569
|
+
"discouraged"), userVerification: (((_f = (_e = options.authenticatorSelection) === null || _e === void 0 ? void 0 : _e.userVerification) === null || _f === void 0 ? void 0 : _f.toLowerCase()) ||
|
|
570
|
+
"discouraged") }) }),
|
|
567
571
|
})];
|
|
568
572
|
case 1:
|
|
569
|
-
credential =
|
|
573
|
+
credential = _k.sent();
|
|
570
574
|
if (!credential)
|
|
571
575
|
throw new Error("No credential created.");
|
|
572
576
|
publicKeyCredential = credential;
|
|
573
577
|
attestationResponse = publicKeyCredential.response;
|
|
574
|
-
transports = (
|
|
578
|
+
transports = (_j = (_h = (_g = publicKeyCredential.response).getTransports) === null || _h === void 0 ? void 0 : _h.call(_g)) !== null && _j !== void 0 ? _j : [];
|
|
575
579
|
return [2 /*return*/, {
|
|
576
580
|
id: publicKeyCredential.id,
|
|
577
581
|
rawId: arrayBufferToBase64url(publicKeyCredential.rawId),
|
|
@@ -583,13 +587,17 @@ function register(options) {
|
|
|
583
587
|
},
|
|
584
588
|
}];
|
|
585
589
|
case 2:
|
|
586
|
-
err_1 =
|
|
590
|
+
err_1 = _k.sent();
|
|
591
|
+
console.error("Error during registration:", err_1);
|
|
587
592
|
if (err_1.name === "NotAllowedError") {
|
|
588
|
-
throw new Error("
|
|
593
|
+
throw new Error("Face ID/Touch ID cancelled or failed. Please try again.");
|
|
589
594
|
}
|
|
590
595
|
if (err_1.name === "InvalidStateError") {
|
|
591
596
|
throw new Error("Passkey already registered for this user.");
|
|
592
597
|
}
|
|
598
|
+
if (err_1.name === "NotSupportedError") {
|
|
599
|
+
throw new Error("Passkeys not supported on this device.");
|
|
600
|
+
}
|
|
593
601
|
throw err_1;
|
|
594
602
|
case 3: return [2 /*return*/];
|
|
595
603
|
}
|
|
@@ -1711,7 +1719,7 @@ var GenerateDeviceId = function () {
|
|
|
1711
1719
|
var userAgent = window.navigator.userAgent;
|
|
1712
1720
|
var deviceId = "";
|
|
1713
1721
|
// Parse browser, version, OS, and device type
|
|
1714
|
-
var browserMatch = Array.from(userAgent.matchAll(/(Chrome|Firefox|Safari|Edge|Opera)\/([\d.]+)/
|
|
1722
|
+
var browserMatch = Array.from(userAgent.matchAll(/(Chrome|Firefox|Safari|Edge|Opera)\/([\d.]+)/gi));
|
|
1715
1723
|
var osMatch = Array.from(userAgent.matchAll(/\(([^)]+)\)/g));
|
|
1716
1724
|
var isMobile = /Mobile|Android|iPhone|iPad/i.test(userAgent);
|
|
1717
1725
|
// Browser info
|
|
@@ -1741,6 +1749,10 @@ var GenerateDeviceId = function () {
|
|
|
1741
1749
|
deviceId += "_".concat(hash);
|
|
1742
1750
|
return (_a = deviceId.replace(/[^a-zA-Z0-9-_]/g, "_")) !== null && _a !== void 0 ? _a : "unknown-device";
|
|
1743
1751
|
};
|
|
1752
|
+
var APIHeaders = {
|
|
1753
|
+
"X-DEVICE-ID": GenerateDeviceId(),
|
|
1754
|
+
"X-API-VERSION": "1.0",
|
|
1755
|
+
};
|
|
1744
1756
|
|
|
1745
1757
|
var MAX_ATTEMPTS = 3;
|
|
1746
1758
|
var useOTPHandler = function (_a) {
|
|
@@ -1775,9 +1787,7 @@ var useOTPHandler = function (_a) {
|
|
|
1775
1787
|
MFACode: authenticationValue,
|
|
1776
1788
|
appCode: appCode,
|
|
1777
1789
|
}, {
|
|
1778
|
-
headers:
|
|
1779
|
-
"X-Device-ID": GenerateDeviceId(),
|
|
1780
|
-
},
|
|
1790
|
+
headers: APIHeaders,
|
|
1781
1791
|
timeout: 605000,
|
|
1782
1792
|
})];
|
|
1783
1793
|
case 2:
|
|
@@ -1840,6 +1850,78 @@ var useOTPHandler = function (_a) {
|
|
|
1840
1850
|
remainingAttempts: MAX_ATTEMPTS - attemptCount,
|
|
1841
1851
|
};
|
|
1842
1852
|
};
|
|
1853
|
+
var useCredentialsHandler = function (onAuthComplete) {
|
|
1854
|
+
var _a = useState(false), loading = _a[0], setLoading = _a[1];
|
|
1855
|
+
var _b = useState(0), attemptCount = _b[0], setAttemptCount = _b[1];
|
|
1856
|
+
var _c = useState(false), isMaxAttemptsReached = _c[0], setIsMaxAttemptsReached = _c[1];
|
|
1857
|
+
var handleSubmitCredentials = useMemo(function () {
|
|
1858
|
+
return function (CredAuthEndpoint, credentials, appCode) { return __awaiter(void 0, void 0, void 0, function () {
|
|
1859
|
+
var currentAttempt, response, error_2, currentAttempt;
|
|
1860
|
+
return __generator(this, function (_a) {
|
|
1861
|
+
switch (_a.label) {
|
|
1862
|
+
case 0:
|
|
1863
|
+
_a.trys.push([0, 2, 3, 4]);
|
|
1864
|
+
setLoading(true);
|
|
1865
|
+
currentAttempt = attemptCount + 1;
|
|
1866
|
+
setAttemptCount(currentAttempt);
|
|
1867
|
+
return [4 /*yield*/, axios.post(CredAuthEndpoint, {
|
|
1868
|
+
username: credentials.username,
|
|
1869
|
+
password: credentials.password,
|
|
1870
|
+
MFACode: credentials.MFACode,
|
|
1871
|
+
appCode: appCode,
|
|
1872
|
+
}, {
|
|
1873
|
+
headers: APIHeaders,
|
|
1874
|
+
timeout: 605000,
|
|
1875
|
+
})];
|
|
1876
|
+
case 1:
|
|
1877
|
+
response = (_a.sent()).data;
|
|
1878
|
+
if (response) {
|
|
1879
|
+
onAuthComplete(true, response);
|
|
1880
|
+
return [2 /*return*/, true];
|
|
1881
|
+
}
|
|
1882
|
+
else {
|
|
1883
|
+
if (currentAttempt >= MAX_ATTEMPTS) {
|
|
1884
|
+
setIsMaxAttemptsReached(true);
|
|
1885
|
+
onAuthComplete(false, {
|
|
1886
|
+
message: "Maximum attempts reached",
|
|
1887
|
+
});
|
|
1888
|
+
}
|
|
1889
|
+
else {
|
|
1890
|
+
onAuthComplete(false, response.response.data);
|
|
1891
|
+
}
|
|
1892
|
+
return [2 /*return*/, false];
|
|
1893
|
+
}
|
|
1894
|
+
case 2:
|
|
1895
|
+
error_2 = _a.sent();
|
|
1896
|
+
console.error(error_2);
|
|
1897
|
+
currentAttempt = attemptCount + 1;
|
|
1898
|
+
if (currentAttempt >= MAX_ATTEMPTS) {
|
|
1899
|
+
setIsMaxAttemptsReached(true);
|
|
1900
|
+
onAuthComplete(false, error_2.response.data);
|
|
1901
|
+
}
|
|
1902
|
+
else {
|
|
1903
|
+
onAuthComplete(false, error_2.response.data);
|
|
1904
|
+
}
|
|
1905
|
+
onAuthComplete(false, error_2.response.data);
|
|
1906
|
+
return [2 /*return*/, false];
|
|
1907
|
+
case 3:
|
|
1908
|
+
setLoading(false);
|
|
1909
|
+
return [7 /*endfinally*/];
|
|
1910
|
+
case 4: return [2 /*return*/];
|
|
1911
|
+
}
|
|
1912
|
+
});
|
|
1913
|
+
}); };
|
|
1914
|
+
}, []);
|
|
1915
|
+
return {
|
|
1916
|
+
handleSubmitCredentials: handleSubmitCredentials,
|
|
1917
|
+
loading: loading,
|
|
1918
|
+
setLoading: setLoading,
|
|
1919
|
+
attemptCount: attemptCount,
|
|
1920
|
+
isMaxAttemptsReached: isMaxAttemptsReached,
|
|
1921
|
+
// resetAttempts,
|
|
1922
|
+
remainingAttempts: MAX_ATTEMPTS - attemptCount,
|
|
1923
|
+
};
|
|
1924
|
+
};
|
|
1843
1925
|
|
|
1844
1926
|
var MFAOptions = function (_a) {
|
|
1845
1927
|
var onComplete = _a.onComplete, onAuthFailed = _a.onAuthFailed, MFAEndpoints = _a.MFAEndpoints, usePassKey = _a.usePassKey;
|
|
@@ -1858,50 +1940,36 @@ var MFAOptions = function (_a) {
|
|
|
1858
1940
|
var authenticate = useWebAuthn().authenticate;
|
|
1859
1941
|
var handleFIDOLogin = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
1860
1942
|
var options, assertionResponse, error_1;
|
|
1861
|
-
|
|
1862
|
-
|
|
1863
|
-
switch (_o.label) {
|
|
1943
|
+
return __generator(this, function (_a) {
|
|
1944
|
+
switch (_a.label) {
|
|
1864
1945
|
case 0:
|
|
1865
|
-
|
|
1946
|
+
_a.trys.push([0, 4, , 5]);
|
|
1866
1947
|
// 1. Fetch authentication challenge from your server
|
|
1867
1948
|
console.log("Requesting authentication challenge from server...");
|
|
1868
1949
|
return [4 /*yield*/, axios.post(MFAEndpoints.RetrieveAuthChallenge, {}, {
|
|
1869
|
-
headers:
|
|
1870
|
-
"X-DEVICE-ID": GenerateDeviceId(),
|
|
1871
|
-
"X-API-VERSION": "1.0",
|
|
1872
|
-
},
|
|
1950
|
+
headers: APIHeaders,
|
|
1873
1951
|
})];
|
|
1874
1952
|
case 1:
|
|
1875
|
-
options = (
|
|
1953
|
+
options = (_a.sent()).data;
|
|
1876
1954
|
console.log("Received challenge:", options);
|
|
1877
|
-
__assign(__assign({}, options), { pubKeyCredParams: (_a = options.pubKeyCredParams) === null || _a === void 0 ? void 0 : _a.map(function (param) { return ({
|
|
1878
|
-
type: "public-key",
|
|
1879
|
-
alg: param.alg
|
|
1880
|
-
}); }), attestation: ((_b = options.attestation) === null || _b === void 0 ? void 0 : _b.toLowerCase()) || "none", authenticatorSelection: __assign(__assign({}, options.authenticatorSelection), { residentKey: ((_d = (_c = options.authenticatorSelection) === null || _c === void 0 ? void 0 : _c.residentKey) === null || _d === void 0 ? void 0 : _d.toLowerCase()) || "discouraged", userVerification: ((_f = (_e = options.authenticatorSelection) === null || _e === void 0 ? void 0 : _e.userVerification) === null || _f === void 0 ? void 0 : _f.toLowerCase()) || "preferred" }) });
|
|
1881
1955
|
// 2. Call the SDK to trigger the browser's passkey authentication UI
|
|
1882
1956
|
console.log("Calling SDK authenticate function...");
|
|
1883
|
-
return [4 /*yield*/, authenticate(__assign(__assign({}, options), {
|
|
1884
|
-
type: "public-key",
|
|
1885
|
-
alg: param.alg
|
|
1886
|
-
}); }), attestation: ((_h = options.attestation) === null || _h === void 0 ? void 0 : _h.toLowerCase()) || "none", authenticatorSelection: __assign(__assign({}, options.authenticatorSelection), { residentKey: ((_k = (_j = options.authenticatorSelection) === null || _j === void 0 ? void 0 : _j.residentKey) === null || _k === void 0 ? void 0 : _k.toLowerCase()) || "discouraged", userVerification: ((_m = (_l = options.authenticatorSelection) === null || _l === void 0 ? void 0 : _l.userVerification) === null || _m === void 0 ? void 0 : _m.toLowerCase()) || "preferred" }) }))];
|
|
1957
|
+
return [4 /*yield*/, authenticate(__assign(__assign({}, options), { userVerification: "discouraged" }))];
|
|
1887
1958
|
case 2:
|
|
1888
|
-
assertionResponse =
|
|
1959
|
+
assertionResponse = _a.sent();
|
|
1889
1960
|
console.log("Authentication assertion received from client:", assertionResponse);
|
|
1890
1961
|
// 3. Send the assertion back to the server for verification
|
|
1891
1962
|
console.log("Sending assertion to server for verification...");
|
|
1892
1963
|
return [4 /*yield*/, axios.post(MFAEndpoints.AuthChallengeVerify, assertionResponse, {
|
|
1893
|
-
headers:
|
|
1894
|
-
"X-DEVICE-ID": GenerateDeviceId(),
|
|
1895
|
-
"X-API-VERSION": "1.0",
|
|
1896
|
-
},
|
|
1964
|
+
headers: APIHeaders,
|
|
1897
1965
|
withCredentials: true, // credentials: 'include'
|
|
1898
1966
|
})];
|
|
1899
1967
|
case 3:
|
|
1900
|
-
|
|
1968
|
+
_a.sent();
|
|
1901
1969
|
toast.success("🔑 Sign-in successful!");
|
|
1902
1970
|
return [3 /*break*/, 5];
|
|
1903
1971
|
case 4:
|
|
1904
|
-
error_1 =
|
|
1972
|
+
error_1 = _a.sent();
|
|
1905
1973
|
console.error("Authentication failed:", error_1);
|
|
1906
1974
|
toast.error("❌ Could not sign in.");
|
|
1907
1975
|
return [3 /*break*/, 5];
|
|
@@ -2020,14 +2088,13 @@ var credentialsSchema = z.object({
|
|
|
2020
2088
|
password: z.string().min(1, "Password is required"),
|
|
2021
2089
|
});
|
|
2022
2090
|
var ADLoginModal = function (_a) {
|
|
2023
|
-
var open = _a.open, onOpenChange = _a.onOpenChange, onLogin = _a.onLogin;
|
|
2091
|
+
var open = _a.open, isLoading = _a.isLoading, setIsLoading = _a.setIsLoading, onOpenChange = _a.onOpenChange, onLogin = _a.onLogin;
|
|
2024
2092
|
var _b = useState("credentials"), step = _b[0], setStep = _b[1];
|
|
2025
2093
|
var _c = useState({
|
|
2026
2094
|
username: "",
|
|
2027
2095
|
password: "",
|
|
2028
2096
|
}), credentials = _c[0], setCredentials = _c[1];
|
|
2029
2097
|
var _d = useState(""), mfaCode = _d[0], setMfaCode = _d[1];
|
|
2030
|
-
var _e = useState(false), isLoading = _e[0], setIsLoading = _e[1];
|
|
2031
2098
|
var form = useForm({
|
|
2032
2099
|
resolver: a$1(credentialsSchema),
|
|
2033
2100
|
defaultValues: { username: "", password: "" },
|
|
@@ -2077,21 +2144,45 @@ var ADLoginModal = function (_a) {
|
|
|
2077
2144
|
form.reset();
|
|
2078
2145
|
setMfaCode("");
|
|
2079
2146
|
};
|
|
2080
|
-
return (jsxRuntimeExports.jsx(Dialog, { open: open, onOpenChange: handleClose, children: jsxRuntimeExports.jsxs(DialogContent, { className: "
|
|
2147
|
+
return (jsxRuntimeExports.jsx(Dialog, { open: open, onOpenChange: handleClose, children: jsxRuntimeExports.jsxs(DialogContent, { className: "w-[70vw] min-w-[250px] max-w-[350px]", children: [jsxRuntimeExports.jsx(DialogHeader, { children: jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [jsxRuntimeExports.jsx(KeyIcon, { className: "w-8 h-8 text-[#506f4a]" }), jsxRuntimeExports.jsx(DialogTitle, { className: "text-2xl", children: "Sign in with AD" })] }) }), step === "credentials" ? (jsxRuntimeExports.jsx(Form, __assign({}, form, { children: jsxRuntimeExports.jsxs("form", { onSubmit: form.handleSubmit(handleCredentialsSubmit), className: "space-y-4", children: [jsxRuntimeExports.jsx(FormField, { control: form.control, name: "username", render: function (_a) {
|
|
2081
2148
|
var field = _a.field;
|
|
2082
|
-
return (jsxRuntimeExports.jsxs(FormItem, { children: [jsxRuntimeExports.jsx(FormLabel, { children: "Username" }), jsxRuntimeExports.jsx(FormControl, { children: jsxRuntimeExports.jsx(Input, __assign({ placeholder: "Enter your username" }, field)) }), jsxRuntimeExports.jsx(FormMessage, {})] }));
|
|
2149
|
+
return (jsxRuntimeExports.jsxs(FormItem, { children: [jsxRuntimeExports.jsx(FormLabel, { children: "Username" }), jsxRuntimeExports.jsx(FormControl, { children: jsxRuntimeExports.jsx(Input, __assign({ className: "h-12", placeholder: "Enter your username" }, field)) }), jsxRuntimeExports.jsx(FormMessage, {})] }));
|
|
2083
2150
|
} }), jsxRuntimeExports.jsx(FormField, { control: form.control, name: "password", render: function (_a) {
|
|
2084
2151
|
var field = _a.field;
|
|
2085
|
-
return (jsxRuntimeExports.jsxs(FormItem, { children: [jsxRuntimeExports.jsx(FormLabel, { children: "Password" }), jsxRuntimeExports.jsx(FormControl, { children: jsxRuntimeExports.jsx(Input, __assign({ type: "password", placeholder: "Enter your password" }, field)) }), jsxRuntimeExports.jsx(FormMessage, {})] }));
|
|
2152
|
+
return (jsxRuntimeExports.jsxs(FormItem, { children: [jsxRuntimeExports.jsx(FormLabel, { children: "Password" }), jsxRuntimeExports.jsx(FormControl, { children: jsxRuntimeExports.jsx(Input, __assign({ className: "h-12", type: "password", placeholder: "Enter your password" }, field)) }), jsxRuntimeExports.jsx(FormMessage, {})] }));
|
|
2086
2153
|
} }), jsxRuntimeExports.jsx(Button, { type: "submit", className: "w-full bg-[#506f4a] hover:bg-[#506f4a]/90", children: "Continue" })] }) }))) : (jsxRuntimeExports.jsxs("div", { className: "space-y-4", children: [jsxRuntimeExports.jsx(GenericOTPVerifier, { value: mfaCode, setValue: setMfaCode, setLoading: setIsLoading, isDisabled: isLoading, onChangeOTP: handleMFASubmit, fieldName: "AuthenticatorCode" }), isLoading && (jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-center gap-2 text-sm text-muted-foreground", children: [jsxRuntimeExports.jsx(Loader2, { className: "w-4 h-4 animate-spin" }), jsxRuntimeExports.jsx("span", { children: "Verifying..." })] }))] }))] }) }));
|
|
2087
2154
|
};
|
|
2088
2155
|
|
|
2089
2156
|
var DefaultLoginPage = function (_a) {
|
|
2090
|
-
var usePassKey = _a.usePassKey, MFAEndpoints = _a.MFAEndpoints, PassKeysRegisterProps = _a.PassKeysRegisterProps;
|
|
2157
|
+
var usePassKey = _a.usePassKey, useADLogin = _a.useADLogin, MFAEndpoints = _a.MFAEndpoints, CredentialsAuthEndpoint = _a.CredentialsAuthEndpoint, PassKeysRegisterProps = _a.PassKeysRegisterProps;
|
|
2158
|
+
var cardVariants = {
|
|
2159
|
+
hidden: { opacity: 0, scale: 0.8, y: 50 },
|
|
2160
|
+
visible: {
|
|
2161
|
+
opacity: 1,
|
|
2162
|
+
scale: 1,
|
|
2163
|
+
y: 0,
|
|
2164
|
+
transition: { type: "spring", duration: 0.6 },
|
|
2165
|
+
},
|
|
2166
|
+
exit: { opacity: 0, scale: 0.8, y: -50, transition: { duration: 0.3 } },
|
|
2167
|
+
};
|
|
2091
2168
|
var context = useCAMSContext();
|
|
2092
2169
|
var login = context.login, isLoading = context.isLoading, authMode = context.authMode;
|
|
2093
2170
|
var _b = useState(false), showADModal = _b[0], setShowADModal = _b[1];
|
|
2094
2171
|
var register = useWebAuthn().register;
|
|
2172
|
+
var _c = useCredentialsHandler(function (state, data) { return __awaiter(void 0, void 0, void 0, function () {
|
|
2173
|
+
return __generator(this, function (_a) {
|
|
2174
|
+
console.log(data);
|
|
2175
|
+
if (state && data) {
|
|
2176
|
+
context.isAuthenticated = true;
|
|
2177
|
+
context.requiresMFA = false;
|
|
2178
|
+
context.setUserProfile({
|
|
2179
|
+
type: "AUTH_SUCCESS",
|
|
2180
|
+
userProfile: __assign({}, data),
|
|
2181
|
+
});
|
|
2182
|
+
}
|
|
2183
|
+
return [2 /*return*/];
|
|
2184
|
+
});
|
|
2185
|
+
}); }), handleSubmitCredentials = _c.handleSubmitCredentials, isCredAuthLoading = _c.loading, setIsCredAuthLoading = _c.setLoading;
|
|
2095
2186
|
var handleMSALLogin = function () {
|
|
2096
2187
|
if (authMode === "MSAL") {
|
|
2097
2188
|
login();
|
|
@@ -2101,16 +2192,6 @@ var DefaultLoginPage = function (_a) {
|
|
|
2101
2192
|
console.warn("Regular CAMS login requires configuration");
|
|
2102
2193
|
}
|
|
2103
2194
|
};
|
|
2104
|
-
var cardVariants = {
|
|
2105
|
-
hidden: { opacity: 0, scale: 0.8, y: 50 },
|
|
2106
|
-
visible: {
|
|
2107
|
-
opacity: 1,
|
|
2108
|
-
scale: 1,
|
|
2109
|
-
y: 0,
|
|
2110
|
-
transition: { type: "spring", duration: 0.6 },
|
|
2111
|
-
},
|
|
2112
|
-
exit: { opacity: 0, scale: 0.8, y: -50, transition: { duration: 0.3 } },
|
|
2113
|
-
};
|
|
2114
2195
|
var handleRegister = function (data) { return __awaiter(void 0, void 0, void 0, function () {
|
|
2115
2196
|
var options, attestationResponse, error_1;
|
|
2116
2197
|
return __generator(this, function (_a) {
|
|
@@ -2120,10 +2201,7 @@ var DefaultLoginPage = function (_a) {
|
|
|
2120
2201
|
// 1. Fetch challenge from your server
|
|
2121
2202
|
console.log("Requesting registration challenge from server...");
|
|
2122
2203
|
return [4 /*yield*/, axios.post(MFAEndpoints.RegisterNewChallenge, __assign({}, data), {
|
|
2123
|
-
headers:
|
|
2124
|
-
"X-DEVICE-ID": GenerateDeviceId(),
|
|
2125
|
-
"X-API-VERSION": "1.0",
|
|
2126
|
-
},
|
|
2204
|
+
headers: APIHeaders,
|
|
2127
2205
|
})];
|
|
2128
2206
|
case 1:
|
|
2129
2207
|
options = (_a.sent()).data;
|
|
@@ -2137,10 +2215,7 @@ var DefaultLoginPage = function (_a) {
|
|
|
2137
2215
|
// 3. Send the response back to the server for verification
|
|
2138
2216
|
console.log("Sending attestation to server for verification...");
|
|
2139
2217
|
return [4 /*yield*/, axios.post(MFAEndpoints.RegisterVerify, attestationResponse, {
|
|
2140
|
-
headers:
|
|
2141
|
-
"X-DEVICE-ID": GenerateDeviceId(),
|
|
2142
|
-
"X-API-VERSION": "1.0",
|
|
2143
|
-
},
|
|
2218
|
+
headers: APIHeaders,
|
|
2144
2219
|
withCredentials: true, // credentials: 'include'
|
|
2145
2220
|
})];
|
|
2146
2221
|
case 3:
|
|
@@ -2160,11 +2235,15 @@ var DefaultLoginPage = function (_a) {
|
|
|
2160
2235
|
// variant="outline"
|
|
2161
2236
|
, {
|
|
2162
2237
|
// variant="outline"
|
|
2163
|
-
className: "w-full flex items-center justify-center cursor-pointer bg-[#506f4a] hover:bg-[#506f4a] rounded-lg border border-transparent px-5 py-8 text-base font-medium transition-colors duration-250", onClick: handleMSALLogin, disabled: isLoading, children: [jsxRuntimeExports.jsx("img", { src: MicrosoftLogo, alt: "Microsoft Logo", width: 35, height: 35 }), jsxRuntimeExports.jsx("span", { className: "ml-2", children: isLoading ? "Logging in..." : "Sign in with Microsoft" })] }),
|
|
2238
|
+
className: "w-full flex items-center justify-center cursor-pointer bg-[#506f4a] hover:bg-[#506f4a] rounded-lg border border-transparent px-5 py-8 text-base font-medium transition-colors duration-250", onClick: handleMSALLogin, disabled: isLoading, children: [jsxRuntimeExports.jsx("img", { src: MicrosoftLogo, alt: "Microsoft Logo", width: 35, height: 35 }), jsxRuntimeExports.jsx("span", { className: "ml-2", children: isLoading ? "Logging in..." : "Sign in with Microsoft" })] }), useADLogin && (jsxRuntimeExports.jsxs(Button, { className: "w-full flex items-center justify-center cursor-pointer bg-[#506f4a] hover:bg-[#506f4a] rounded-lg border border-transparent px-5 py-8 text-base font-medium transition-colors duration-250", onClick: function () { return setShowADModal(true); }, disabled: isLoading, children: [jsxRuntimeExports.jsx(KeyIcon, { className: "text-[#506f4a]", size: 64 }), jsxRuntimeExports.jsx("span", { children: isLoading
|
|
2239
|
+
? "Logging in..."
|
|
2240
|
+
: "Sign in with ActiveDirectory" })] })), usePassKey && (jsxRuntimeExports.jsxs(Button, { className: "w-full flex items-center justify-center cursor-pointer bg-[#506f4a] hover:bg-[#506f4a] rounded-lg border border-transparent px-5 py-8 text-base font-medium transition-colors duration-250", onClick: function () { return handleRegister(PassKeysRegisterProps); }, disabled: isLoading, children: [jsxRuntimeExports.jsx(KeyIcon, { className: "text-[#506f4a]", size: 64 }), jsxRuntimeExports.jsx("span", { children: "Create a Passkey" })] }))] }), jsxRuntimeExports.jsxs(CardFooter, { className: "flex items-center justify-center mt-6 space-x-2 text-gray-400 text-sm", children: [jsxRuntimeExports.jsx(ShieldCheck, { className: "w-4 h-4 text-[#506f4a] pulse-glow" }), jsxRuntimeExports.jsx("span", { children: "Powered By NIBSS" })] })] }) }) }, "landing"), jsxRuntimeExports.jsx(ADLoginModal, { open: showADModal, onOpenChange: setShowADModal, isLoading: isCredAuthLoading, setIsLoading: setIsCredAuthLoading, onLogin: function (_a) { return __awaiter(void 0, [_a], void 0, function (_b) {
|
|
2164
2241
|
var username = _b.username, password = _b.password, MFACode = _b.MFACode;
|
|
2165
2242
|
return __generator(this, function (_c) {
|
|
2166
2243
|
// Implement your AD login logic here
|
|
2167
2244
|
console.log("AD Login:", { username: username, password: password, MFACode: MFACode });
|
|
2245
|
+
// Example: await adLoginService(username, password, mfaCode);
|
|
2246
|
+
handleSubmitCredentials(CredentialsAuthEndpoint !== null && CredentialsAuthEndpoint !== void 0 ? CredentialsAuthEndpoint : "/api/auth/validate", { username: username, password: password, MFACode: MFACode }, context.appCode);
|
|
2168
2247
|
return [2 /*return*/];
|
|
2169
2248
|
});
|
|
2170
2249
|
}); } })] }));
|
|
@@ -2187,7 +2266,7 @@ var MFAGate = function (_a) {
|
|
|
2187
2266
|
// loginComponent: LoginComponent = DefaultLoginPage,
|
|
2188
2267
|
_c = _a.usePassKey,
|
|
2189
2268
|
// loginComponent: LoginComponent = DefaultLoginPage,
|
|
2190
|
-
usePassKey = _c === void 0 ? false : _c, PassKeysRegisterProps = _a.PassKeysRegisterProps, MFAEndpoints = _a.MFAEndpoints;
|
|
2269
|
+
usePassKey = _c === void 0 ? false : _c, _d = _a.useADLogin, useADLogin = _d === void 0 ? false : _d, CredentialsAuthEndpoint = _a.CredentialsAuthEndpoint, PassKeysRegisterProps = _a.PassKeysRegisterProps, MFAEndpoints = _a.MFAEndpoints;
|
|
2191
2270
|
var context = useCAMSContext();
|
|
2192
2271
|
var validatedMFAEndpoints = useMemo(function () {
|
|
2193
2272
|
var parsed = MFAEndpointsSchema.safeParse(MFAEndpoints);
|
|
@@ -2212,8 +2291,10 @@ var MFAGate = function (_a) {
|
|
|
2212
2291
|
});
|
|
2213
2292
|
}); }, [context.logout]);
|
|
2214
2293
|
Logger.debug("MFA Endpoint >>>", { MFAEndpoints: MFAEndpoints });
|
|
2294
|
+
if (useADLogin && !CredentialsAuthEndpoint)
|
|
2295
|
+
return jsxRuntimeExports.jsx(ErrorFallback, { message: "Invalid AD Login Configuration." });
|
|
2215
2296
|
if (!validatedMFAEndpoints)
|
|
2216
|
-
return jsxRuntimeExports.jsx(ErrorFallback, { message: "Invalid MFA
|
|
2297
|
+
return jsxRuntimeExports.jsx(ErrorFallback, { message: "Invalid MFA Configuration." });
|
|
2217
2298
|
if (context.authMode !== "MSAL")
|
|
2218
2299
|
return jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment, { children: children });
|
|
2219
2300
|
if (context.isLoading)
|
|
@@ -2222,7 +2303,7 @@ var MFAGate = function (_a) {
|
|
|
2222
2303
|
return (jsxRuntimeExports.jsx(MFAOptions, { MFAEndpoints: validatedMFAEndpoints, usePassKey: usePassKey, onComplete: handleComplete, onAuthFailed: handleAuthFailed }));
|
|
2223
2304
|
}
|
|
2224
2305
|
if (!context.isAuthenticated) {
|
|
2225
|
-
return (jsxRuntimeExports.jsx(DefaultLoginPage, { usePassKey: usePassKey, MFAEndpoints: MFAEndpoints, PassKeysRegisterProps: PassKeysRegisterProps }));
|
|
2306
|
+
return (jsxRuntimeExports.jsx(DefaultLoginPage, { usePassKey: usePassKey, useADLogin: useADLogin, MFAEndpoints: MFAEndpoints, PassKeysRegisterProps: PassKeysRegisterProps, CredentialsAuthEndpoint: CredentialsAuthEndpoint }));
|
|
2226
2307
|
}
|
|
2227
2308
|
return jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment, { children: children });
|
|
2228
2309
|
};
|