summaryrefslogtreecommitdiffhomepage
path: root/packages/browser/src
diff options
context:
space:
mode:
Diffstat (limited to 'packages/browser/src')
-rw-r--r--packages/browser/src/helpers/toPublicKeyCredentialDescriptor.ts6
-rw-r--r--packages/browser/src/methods/startAuthentication.test.ts17
-rw-r--r--packages/browser/src/methods/startRegistration.test.ts35
3 files changed, 58 insertions, 0 deletions
diff --git a/packages/browser/src/helpers/toPublicKeyCredentialDescriptor.ts b/packages/browser/src/helpers/toPublicKeyCredentialDescriptor.ts
index 8fad78b..127713a 100644
--- a/packages/browser/src/helpers/toPublicKeyCredentialDescriptor.ts
+++ b/packages/browser/src/helpers/toPublicKeyCredentialDescriptor.ts
@@ -10,5 +10,11 @@ export default function toPublicKeyCredentialDescriptor(
return {
...descriptor,
id: base64URLStringToBuffer(id),
+ /**
+ * `descriptor.transports` is an array of our `AuthenticatorTransport` that includes newer
+ * transports that TypeScript's DOM lib is ignorant of. Convince TS that our list of transports
+ * are fine to pass to WebAuthn since browsers will recognize the new value.
+ */
+ transports: descriptor.transports as AuthenticatorTransport[],
};
}
diff --git a/packages/browser/src/methods/startAuthentication.test.ts b/packages/browser/src/methods/startAuthentication.test.ts
index 725cd4e..658b67c 100644
--- a/packages/browser/src/methods/startAuthentication.test.ts
+++ b/packages/browser/src/methods/startAuthentication.test.ts
@@ -202,6 +202,23 @@ test('should include extension results when no extensions specified', async () =
expect(response.clientExtensionResults).toEqual({});
});
+test('should support "cable" transport', async () => {
+ const opts: PublicKeyCredentialRequestOptionsJSON = {
+ ...goodOpts1,
+ allowCredentials: [
+ {
+ ...goodOpts1.allowCredentials![0],
+ transports: ["cable"],
+ },
+ ]
+ };
+
+ await startAuthentication(opts);
+
+ expect(mockNavigatorGet.mock.calls[0][0].publicKey.allowCredentials[0].transports[0])
+ .toEqual("cable");
+});
+
describe('WebAuthnError', () => {
describe('AbortError', () => {
const AbortError = generateCustomError('AbortError');
diff --git a/packages/browser/src/methods/startRegistration.test.ts b/packages/browser/src/methods/startRegistration.test.ts
index 360884e..fcd4a2c 100644
--- a/packages/browser/src/methods/startRegistration.test.ts
+++ b/packages/browser/src/methods/startRegistration.test.ts
@@ -176,6 +176,41 @@ test('should include extension results when no extensions specified', async () =
expect(response.clientExtensionResults).toEqual({});
});
+test('should support "cable" transport in excludeCredentials', async () => {
+ const opts: PublicKeyCredentialCreationOptionsJSON = {
+ ...goodOpts1,
+ excludeCredentials: [
+ {
+ ...goodOpts1.excludeCredentials![0],
+ transports: ["cable"],
+ },
+ ]
+ };
+
+ await startRegistration(opts);
+
+ expect(mockNavigatorCreate.mock.calls[0][0].publicKey.excludeCredentials[0].transports[0])
+ .toEqual("cable");
+});
+
+test('should return "cable" transport from response', async () => {
+ mockNavigatorCreate.mockResolvedValue({
+ id: 'foobar',
+ rawId: utf8StringToBuffer('foobar'),
+ response: {
+ attestationObject: Buffer.from(mockAttestationObject, 'ascii'),
+ clientDataJSON: Buffer.from(mockClientDataJSON, 'ascii'),
+ getTransports: () => (["cable"]),
+ },
+ getClientExtensionResults: () => ({}),
+ type: 'webauthn.create',
+ });
+
+ const response = await startRegistration(goodOpts1);
+
+ expect(response.transports).toEqual(["cable"]);
+});
+
describe('WebAuthnError', () => {
describe('AbortError', () => {
const AbortError = generateCustomError('AbortError');