mirror of
https://github.com/open-reception/appointment-booking-software.git
synced 2026-08-17 21:25:52 +02:00
Merge pull request #299 from open-reception/fix/passkeys-work-with-plain-array-prf-response
Passkeys now work with plain Array prf responses
This commit is contained in:
+24
-32
@@ -251,21 +251,31 @@ export const getPRFOutputAfterRegistration = async ({
|
|||||||
}
|
}
|
||||||
|
|
||||||
// PRF output is BufferSource, ensure we return ArrayBuffer
|
// PRF output is BufferSource, ensure we return ArrayBuffer
|
||||||
const prfOutput = prfResults.results.first;
|
return getPrfOutput(prfResults.results);
|
||||||
if (prfOutput instanceof ArrayBuffer) {
|
};
|
||||||
return prfOutput;
|
|
||||||
} else {
|
const getPrfOutput = (results: AuthenticationExtensionsPRFValues): ArrayBuffer => {
|
||||||
// Convert ArrayBufferView to ArrayBuffer
|
const first = prfResultsToArrayBuffer(results.first);
|
||||||
console.log("⚠️ Detected non-ArrayBuffer PRF output, trying to convert manually");
|
return first.buffer;
|
||||||
return prfOutput.buffer.slice(
|
};
|
||||||
prfOutput.byteOffset,
|
|
||||||
prfOutput.byteOffset + prfOutput.byteLength,
|
const prfResultsToArrayBuffer = (result: BufferSource): Uint8Array<ArrayBuffer> => {
|
||||||
) as ArrayBuffer;
|
if (result instanceof ArrayBuffer) {
|
||||||
|
return new Uint8Array(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ArrayBuffer.isView(result)) {
|
||||||
|
return new Uint8Array(result.buffer as ArrayBuffer, result.byteOffset, result.byteLength);
|
||||||
|
}
|
||||||
|
if (Array.isArray(result)) {
|
||||||
|
console.log("⚠️ Detected non-ArrayBuffer PRF output, trying to convert manually");
|
||||||
|
return Uint8Array.from(result as number[]);
|
||||||
|
}
|
||||||
|
throw Error("PRF result is not convertible");
|
||||||
};
|
};
|
||||||
|
|
||||||
export type GetCredentialResponse = PublicKeyCredential & {
|
export type GetCredentialResponse = PublicKeyCredential & {
|
||||||
prfOutput?: ArrayBuffer; // PRF output if enablePRF was true
|
prfOutput?: ArrayBuffer;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const getCredential = async ({
|
export const getCredential = async ({
|
||||||
@@ -320,27 +330,9 @@ export const getCredential = async ({
|
|||||||
|
|
||||||
// Extract PRF output if it was enabled
|
// Extract PRF output if it was enabled
|
||||||
if (enablePRF) {
|
if (enablePRF) {
|
||||||
const extensionResults = credential.getClientExtensionResults() as {
|
const extensionResults = credential.getClientExtensionResults();
|
||||||
prf?: {
|
if (extensionResults.prf?.results) {
|
||||||
enabled?: boolean;
|
prfOutput = getPrfOutput(extensionResults.prf.results);
|
||||||
results?: {
|
|
||||||
first?: BufferSource;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
if (extensionResults.prf?.results?.first) {
|
|
||||||
const prfResult = extensionResults.prf.results.first;
|
|
||||||
// Convert BufferSource to ArrayBuffer
|
|
||||||
if (prfResult instanceof ArrayBuffer) {
|
|
||||||
prfOutput = prfResult;
|
|
||||||
} else {
|
|
||||||
console.log("⚠️ Detected non-ArrayBuffer PRF output, trying to convert manually");
|
|
||||||
prfOutput = prfResult.buffer.slice(
|
|
||||||
prfResult.byteOffset,
|
|
||||||
prfResult.byteOffset + prfResult.byteLength,
|
|
||||||
) as ArrayBuffer;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user