diff options
author | Matthew Miller <matthew@millerti.me> | 2020-05-20 23:38:07 -0700 |
---|---|---|
committer | Matthew Miller <matthew@millerti.me> | 2020-05-20 23:38:07 -0700 |
commit | 4888c8bea2762d4b45ab8e9c286453368ec57c66 (patch) | |
tree | aec92b6a9de1510f3f2ac30f1e8243f39ac88254 /packages/browser/src/methods/startAttestation.ts | |
parent | acfc8822607a95e58fff085d3905ecb29346b270 (diff) |
Add startAttestation method to browser
Diffstat (limited to 'packages/browser/src/methods/startAttestation.ts')
-rw-r--r-- | packages/browser/src/methods/startAttestation.ts | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/packages/browser/src/methods/startAttestation.ts b/packages/browser/src/methods/startAttestation.ts new file mode 100644 index 0000000..3b955cc --- /dev/null +++ b/packages/browser/src/methods/startAttestation.ts @@ -0,0 +1,45 @@ +import { + PublicKeyCredentialCreationOptionsJSON, + EncodedAuthenticatorAttestationResponse, + AttestationCredential, +} from '@webauthntine/typescript-types'; + +import toUint8Array from '../helpers/toUint8Array'; +import toBase64String from '../helpers/toBase64String'; +import supportsWebauthn from '../helpers/supportsWebauthn'; + +/** + * + */ +export default async function startAttestation( + creationOptionsJSON: PublicKeyCredentialCreationOptionsJSON +): Promise<EncodedAuthenticatorAttestationResponse> { + if (!supportsWebauthn()) { + throw new Error('Webauthn is not supported in this browser'); + } + + // We need to convert some values to Uint8Arrays before passing the credentials to the navigator + const publicKey: PublicKeyCredentialCreationOptions = { + ...creationOptionsJSON.publicKey, + challenge: toUint8Array(creationOptionsJSON.publicKey.challenge), + user: { + ...creationOptionsJSON.publicKey.user, + id: toUint8Array(creationOptionsJSON.publicKey.user.id), + }, + }; + + // Wait for the user to complete attestation + const credential = await navigator.credentials.create({ publicKey }); + + if (!credential) { + throw new Error('Attestation was not completed'); + } + + const { response } = (credential as AttestationCredential); + + // Convert values to base64 to make it easier to send back to the server + return { + base64AttestationObject: toBase64String(response.attestationObject), + base64ClientDataJSON: toBase64String(response.clientDataJSON), + }; +} |