diff options
author | Matthew Miller <matthew@millerti.me> | 2020-05-22 10:34:40 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-22 10:34:40 -0700 |
commit | 27d2104bfd297ac6e6e6ffe17ad12ad9dcd1bd3d (patch) | |
tree | c6c005074f78ef079d1195acbf03f6abd31bc562 /packages/browser/src/methods/startAssertion.ts | |
parent | d9074ec54935aa2155151d2dd9dea0974f33da29 (diff) | |
parent | 1038e1a9bb04a1b638248ff6cf7d57c21304a668 (diff) |
Merge pull request #1 from MasterKale/feature/lerna
feature/monorepo
Diffstat (limited to 'packages/browser/src/methods/startAssertion.ts')
-rw-r--r-- | packages/browser/src/methods/startAssertion.ts | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/packages/browser/src/methods/startAssertion.ts b/packages/browser/src/methods/startAssertion.ts new file mode 100644 index 0000000..603c6fb --- /dev/null +++ b/packages/browser/src/methods/startAssertion.ts @@ -0,0 +1,54 @@ +import { + PublicKeyCredentialRequestOptionsJSON, + AuthenticatorAssertionResponseJSON, + AssertionCredential, +} from '@webauthntine/typescript-types'; + +import toUint8Array from '../helpers/toUint8Array'; +import toBase64String from '../helpers/toBase64String'; +import supportsWebauthn from '../helpers/supportsWebauthn'; + +/** + * Begin authenticator "login" via WebAuthn assertion + * + * @param requestOptionsJSON Output from @webauthntine/server's generateAssertionOptions(...) + */ +export default async function startAssertion( + requestOptionsJSON: PublicKeyCredentialRequestOptionsJSON +): Promise<AuthenticatorAssertionResponseJSON> { + 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: PublicKeyCredentialRequestOptions = { + ...requestOptionsJSON.publicKey, + challenge: toUint8Array(requestOptionsJSON.publicKey.challenge), + allowCredentials: requestOptionsJSON.publicKey.allowCredentials.map((cred) => ({ + ...cred, + id: toUint8Array(cred.id), + })) + }; + + // Wait for the user to complete assertion + const credential = await navigator.credentials.get({ publicKey }); + + if (!credential) { + throw new Error('Assertion was not completed'); + } + + const { response } = (credential as AssertionCredential); + + let base64UserHandle = undefined; + if (response.userHandle) { + base64UserHandle = toBase64String(response.userHandle); + } + + // Convert values to base64 to make it easier to send back to the server + return { + base64AuthenticatorData: toBase64String(response.authenticatorData), + base64ClientDataJSON: toBase64String(response.clientDataJSON), + base64Signature: toBase64String(response.signature), + base64UserHandle, + }; +} |