diff --git a/src/login/KcContext/kcContextMocks.ts b/src/login/KcContext/kcContextMocks.ts index 1c9f2ced..af190a45 100644 --- a/src/login/KcContext/kcContextMocks.ts +++ b/src/login/KcContext/kcContextMocks.ts @@ -345,8 +345,7 @@ export const kcContextMocks = [ rpId: "", createTimeout: "0", isUserIdentified: "false", - shouldDisplayAuthenticators: false, - login: {} + shouldDisplayAuthenticators: false }), id({ ...kcContextCommonMock, diff --git a/src/login/pages/LoginPasskeysConditionalAuthenticate.useScript.tsx b/src/login/pages/LoginPasskeysConditionalAuthenticate.useScript.tsx index ceb7aa52..9cd1c867 100644 --- a/src/login/pages/LoginPasskeysConditionalAuthenticate.useScript.tsx +++ b/src/login/pages/LoginPasskeysConditionalAuthenticate.useScript.tsx @@ -11,7 +11,7 @@ type KcContextLike = { challenge: string; userVerification: string; rpId: string; - createTimeout: number; + createTimeout: number | string; }; assert(); @@ -41,9 +41,9 @@ export function useScript(params: { authButtonId: string; kcContext: KcContextLi const authButton = document.getElementById("${authButtonId}"); const input = { isUserIdentified : ${isUserIdentified}, - challenge : '${challenge}', - userVerification : '${userVerification}', - rpId : '${rpId}', + challenge : ${JSON.stringify(challenge)}, + userVerification : ${JSON.stringify(userVerification)}, + rpId : ${JSON.stringify(rpId)}, createTimeout : ${createTimeout} }; authButton.addEventListener("click", () => { diff --git a/src/login/pages/WebauthnAuthenticate.useScript.tsx b/src/login/pages/WebauthnAuthenticate.useScript.tsx index 21b75b46..bc8fde5a 100644 --- a/src/login/pages/WebauthnAuthenticate.useScript.tsx +++ b/src/login/pages/WebauthnAuthenticate.useScript.tsx @@ -30,7 +30,7 @@ export function useScript(params: { authButtonId: string; kcContext: KcContextLi const { msgStr, isFetchingTranslations } = i18n; const { insertScriptTags } = useInsertScriptTags({ - componentOrHookName: "LoginRecoveryAuthnCodeConfig", + componentOrHookName: "WebauthnAuthenticate", scriptTags: [ { type: "module", diff --git a/src/login/pages/WebauthnRegister.tsx b/src/login/pages/WebauthnRegister.tsx index 9bbcb70e..8f953b75 100644 --- a/src/login/pages/WebauthnRegister.tsx +++ b/src/login/pages/WebauthnRegister.tsx @@ -1,7 +1,5 @@ -import { useEffect } from "react"; -import { assert } from "keycloakify/tools/assert"; import { getKcClsx, type KcClsx } from "keycloakify/login/lib/kcClsx"; -import { useInsertScriptTags } from "keycloakify/tools/useInsertScriptTags"; +import { useScript } from "keycloakify/login/pages/WebauthnRegister.useScript"; import type { PageProps } from "keycloakify/login/pages/PageProps"; import type { KcContext } from "../KcContext"; import type { I18n } from "../i18n"; @@ -11,198 +9,18 @@ export default function WebauthnRegister(props: PageProps 0) publicKey.excludeCredentials = excludeCredentials; - - navigator.credentials.create({publicKey}) - .then(function (result) { - window.result = result; - let clientDataJSON = result.response.clientDataJSON; - let attestationObject = result.response.attestationObject; - let publicKeyCredentialId = result.rawId; - - $("#clientDataJSON").val(base64url.encode(new Uint8Array(clientDataJSON), {pad: false})); - $("#attestationObject").val(base64url.encode(new Uint8Array(attestationObject), {pad: false})); - $("#publicKeyCredentialId").val(base64url.encode(new Uint8Array(publicKeyCredentialId), {pad: false})); - - if (typeof result.response.getTransports === "function") { - let transports = result.response.getTransports(); - if (transports) { - $("#transports").val(getTransportsAsString(transports)); - } - } else { - console.log("Your browser is not able to recognize supported transport media for the authenticator."); - } - - let initLabel = "WebAuthn Authenticator (Default Label)"; - let labelResult = window.prompt("Please input your registered authenticator's label", initLabel); - if (labelResult === null) labelResult = initLabel; - $("#authenticatorLabel").val(labelResult); - - $("#register").submit(); - - }) - .catch(function (err) { - $("#error").val(err); - $("#register").submit(); - - }); - } - - function getPubKeyCredParams(signatureAlgorithmsList) { - let pubKeyCredParams = []; - if (signatureAlgorithmsList.length === 0) { - pubKeyCredParams.push({type: "public-key", alg: -7}); - return pubKeyCredParams; - } - - for (let i = 0; i < signatureAlgorithmsList.length; i++) { - pubKeyCredParams.push({ - type: "public-key", - alg: signatureAlgorithmsList[i] - }); - } - return pubKeyCredParams; - } - - function getExcludeCredentials(excludeCredentialIds) { - let excludeCredentials = []; - if (excludeCredentialIds === "") return excludeCredentials; - - let excludeCredentialIdsList = excludeCredentialIds.split(','); - - for (let i = 0; i < excludeCredentialIdsList.length; i++) { - excludeCredentials.push({ - type: "public-key", - id: base64url.decode(excludeCredentialIdsList[i], - {loose: true}) - }); - } - return excludeCredentials; - } - - function getTransportsAsString(transportsList) { - if (transportsList === '' || Array.isArray(transportsList)) return ""; - - let transportsString = ""; - - for (let i = 0; i < transportsList.length; i++) { - transportsString += transportsList[i] + ","; - } - - return transportsString.slice(0, -1); - } - ` - } - ] + useScript({ + authButtonId, + kcContext, + i18n }); - useEffect(() => { - insertScriptTags(); - }, []); - return (