in public/index.js [396:491]
function getAssertion(challenge) {
var largeBlobPresent = false;
if (typeof(PublicKeyCredential) === "undefined")
return Promise.reject("Error: WebAuthn APIs are not present on this device");
var getAssertionOptions = {
rpId: undefined,
timeout: 90000,
challenge: challenge,
allowCredentials: [],
userVerification: undefined,
extensions: {}
};
switch ($('#get_rpId').val()) {
case "normal":
getAssertionOptions.rpId = window.location.hostname;
break;
case "suffix":
getAssertionOptions.rpId = "suffix." + window.location.hostname;
break;
case "securityerror":
getAssertionOptions.rpId = "foo.com";
break;
case "undefined":
default:
break;
}
if ($('#get_allowCredentials').is(":checked")) {
var allowCredentials = credentials.map(cred => {
return {
type: "public-key",
id: Uint8Array.from(atob(cred.id), c => c.charCodeAt(0))
};
});
getAssertionOptions.allowCredentials = allowCredentials;
}
if ($('#get_userVerification').val() !== "undefined") {
getAssertionOptions.userVerification = $('#get_userVerification').val();
}
if ($('#get_credBlob').val() !== "undefined") {
var getCredBlob = ($('#get_credBlob').val() == "true");
getAssertionOptions.extensions.getCredBlob = getCredBlob;
}
if ($('#get_largeBlob').val() !== "undefined") {
getAssertionOptions.extensions.largeBlob = {};
getAssertionOptions.extensions.largeBlob.read = $('#get_largeBlob').val();
largeBlobPresent = true;
}
if ($('#get_largeBlobText').val()) {
if (!largeBlobPresent) {
getAssertionOptions.extensions.largeBlob = {};
}
getAssertionOptions.extensions.largeBlob.write = stringToArrayBuffer($('#get_largeBlobText').val());
}
return navigator.credentials.get({
publicKey: getAssertionOptions
}).then(assertion => {
/** @type {EncodedAssertionResponse} */
var credential = {
id: base64encode(assertion.rawId),
clientDataJSON: arrayBufferToString(assertion.response.clientDataJSON),
userHandle: base64encode(assertion.response.userHandle),
signature: base64encode(assertion.response.signature),
authenticatorData: base64encode(assertion.response.authenticatorData),
metadata: {
rpId: getAssertionOptions.rpId
}
};
console.log("=== Assertion response ===");
logVariable("id (base64)", credential.id);
logVariable("userHandle (base64)", credential.userHandle);
logVariable("authenticatorData (base64)", credential.authenticatorData);
logVariable("clientDataJSON", credential.clientDataJSON);
logVariable("signature (base64)", credential.signature);
return rest_put("/assertion", credential);
}).then(response => {
return response.json();
}).then(response => {
if (response.error) {
return Promise.reject(response.error);
} else {
return Promise.resolve(response.result);
}
});
}