summaryrefslogtreecommitdiffhomepage
path: root/packages/browser
diff options
context:
space:
mode:
authorMatthew Miller <matthew@millerti.me>2020-05-20 23:38:07 -0700
committerMatthew Miller <matthew@millerti.me>2020-05-20 23:38:07 -0700
commit4888c8bea2762d4b45ab8e9c286453368ec57c66 (patch)
treeaec92b6a9de1510f3f2ac30f1e8243f39ac88254 /packages/browser
parentacfc8822607a95e58fff085d3905ecb29346b270 (diff)
Add startAttestation method to browser
Diffstat (limited to 'packages/browser')
-rw-r--r--packages/browser/src/methods/startAttestation.ts45
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),
+ };
+}