mirror of
https://github.com/zitadel/zitadel.git
synced 2025-11-16 00:34:11 +00:00
# Which Problems Are Solved
When registering passkeys or u2f methods as second factor, some users
pressed the "Enter" key, rather than clicking the submit button. This
method has bypassed the execution of the device registration and
encoding scripts, resulting in the form being submitted without the
necessary encoded values.
# How the Problems Are Solved
This PR ensures that device registration is always executed and the
required information are submitted in the form regardless of pressing
"Enter" or clicking the button.
# Additional Changes
None
# Additional Context
- closes #6592
- closes #2910
(cherry picked from commit 27b319bd98)
62 lines
1.9 KiB
JavaScript
62 lines
1.9 KiB
JavaScript
document.addEventListener(
|
|
"DOMContentLoaded",
|
|
checkWebauthnSupported(login, "btn-login"),
|
|
);
|
|
|
|
async function login() {
|
|
document.getElementById("wa-error").classList.add("hidden");
|
|
|
|
let makeAssertionOptions;
|
|
try {
|
|
makeAssertionOptions = JSON.parse(atob(document.getElementsByName("credentialAssertionData")[0].value));
|
|
} catch (e) {
|
|
webauthnError({ message: "Failed to parse credential assertion data." });
|
|
return;
|
|
}
|
|
|
|
try {
|
|
makeAssertionOptions.publicKey.challenge = bufferDecode(makeAssertionOptions.publicKey.challenge, "publicKey.challenge");
|
|
makeAssertionOptions.publicKey.allowCredentials.forEach(function (listItem) {
|
|
listItem.id = bufferDecode(listItem.id, "publicKey.allowCredentials.id");
|
|
});
|
|
} catch (e) {
|
|
webauthnError({ message: "Failed to decode buffer data." });
|
|
return;
|
|
}
|
|
|
|
try {
|
|
const credential = await navigator.credentials.get({
|
|
publicKey: makeAssertionOptions.publicKey,
|
|
});
|
|
|
|
verifyAssertion(credential);
|
|
} catch (err) {
|
|
webauthnError(err);
|
|
}
|
|
}
|
|
|
|
function verifyAssertion(assertedCredential) {
|
|
let authData = new Uint8Array(assertedCredential.response.authenticatorData);
|
|
let clientDataJSON = new Uint8Array(
|
|
assertedCredential.response.clientDataJSON
|
|
);
|
|
let rawId = new Uint8Array(assertedCredential.rawId);
|
|
let sig = new Uint8Array(assertedCredential.response.signature);
|
|
let userHandle = new Uint8Array(assertedCredential.response.userHandle);
|
|
|
|
let data = JSON.stringify({
|
|
id: assertedCredential.id,
|
|
rawId: bufferEncode(rawId),
|
|
type: assertedCredential.type,
|
|
response: {
|
|
authenticatorData: bufferEncode(authData),
|
|
clientDataJSON: bufferEncode(clientDataJSON),
|
|
signature: bufferEncode(sig),
|
|
userHandle: bufferEncode(userHandle),
|
|
},
|
|
});
|
|
|
|
document.getElementsByName("credentialData")[0].value = window.btoa(data);
|
|
document.getElementsByTagName("form")[0].submit();
|
|
}
|