@passlock/client 2.0.1 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/README.template.md +2 -2
- package/dist/errors.d.ts +4 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +14 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +236 -31
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +236 -34
- package/dist/index.js.map +1 -1
- package/dist/internal/index.d.ts +4 -0
- package/dist/internal/index.d.ts.map +1 -0
- package/dist/internal/index.js +4 -0
- package/dist/internal/index.js.map +1 -0
- package/dist/{shared → internal}/network.d.ts +19 -16
- package/dist/internal/network.d.ts.map +1 -0
- package/dist/{shared → internal}/network.js +40 -25
- package/dist/internal/network.js.map +1 -0
- package/dist/{shared → internal}/promise.d.ts +2 -2
- package/dist/internal/promise.d.ts.map +1 -0
- package/dist/{shared → internal}/promise.js +2 -2
- package/dist/internal/promise.js.map +1 -0
- package/dist/internal/tenancy.d.ts.map +1 -0
- package/dist/internal/tenancy.js.map +1 -0
- package/dist/{logger/index.d.ts → logger.d.ts} +19 -4
- package/dist/logger.d.ts.map +1 -0
- package/dist/{logger/index.js → logger.js} +19 -4
- package/dist/logger.js.map +1 -0
- package/dist/{shared/options.d.ts → options.d.ts} +4 -0
- package/dist/options.d.ts.map +1 -0
- package/dist/{shared/options.js.map → options.js.map} +1 -1
- package/dist/passkey/authentication/authentication.d.ts +134 -0
- package/dist/passkey/authentication/authentication.d.ts.map +1 -0
- package/dist/passkey/{authentication.js → authentication/authentication.js} +68 -50
- package/dist/passkey/authentication/authentication.js.map +1 -0
- package/dist/passkey/errors.d.ts +158 -16
- package/dist/passkey/errors.d.ts.map +1 -1
- package/dist/passkey/errors.js +214 -6
- package/dist/passkey/errors.js.map +1 -1
- package/dist/passkey/registration/registration.d.ts +145 -0
- package/dist/passkey/registration/registration.d.ts.map +1 -0
- package/dist/passkey/{registration.js → registration/registration.js} +43 -36
- package/dist/passkey/registration/registration.js.map +1 -0
- package/dist/passkey/shared.d.ts +8 -2
- package/dist/passkey/shared.d.ts.map +1 -1
- package/dist/passkey/signals/signals.d.ts +103 -0
- package/dist/passkey/signals/signals.d.ts.map +1 -0
- package/dist/passkey/{signals.js → signals/signals.js} +69 -71
- package/dist/passkey/signals/signals.js.map +1 -0
- package/dist/passkey/support.d.ts +15 -0
- package/dist/passkey/support.d.ts.map +1 -1
- package/dist/passkey/support.js +16 -1
- package/dist/passkey/support.js.map +1 -1
- package/dist/principal.d.ts +16 -0
- package/dist/principal.d.ts.map +1 -0
- package/dist/principal.js +2 -0
- package/dist/principal.js.map +1 -0
- package/dist/safe.d.ts +247 -0
- package/dist/safe.d.ts.map +1 -0
- package/dist/safe.js +254 -0
- package/dist/safe.js.map +1 -0
- package/package.json +21 -19
- package/dist/logger/index.d.ts.map +0 -1
- package/dist/logger/index.js.map +0 -1
- package/dist/passkey/authentication.d.ts +0 -118
- package/dist/passkey/authentication.d.ts.map +0 -1
- package/dist/passkey/authentication.js.map +0 -1
- package/dist/passkey/authentication.test.d.ts +0 -2
- package/dist/passkey/authentication.test.d.ts.map +0 -1
- package/dist/passkey/authentication.test.js +0 -157
- package/dist/passkey/authentication.test.js.map +0 -1
- package/dist/passkey/registration.d.ts +0 -136
- package/dist/passkey/registration.d.ts.map +0 -1
- package/dist/passkey/registration.js.map +0 -1
- package/dist/passkey/registration.test.d.ts +0 -2
- package/dist/passkey/registration.test.d.ts.map +0 -1
- package/dist/passkey/registration.test.js +0 -161
- package/dist/passkey/registration.test.js.map +0 -1
- package/dist/passkey/signals.d.ts +0 -113
- package/dist/passkey/signals.d.ts.map +0 -1
- package/dist/passkey/signals.js.map +0 -1
- package/dist/shared/network.d.ts.map +0 -1
- package/dist/shared/network.js.map +0 -1
- package/dist/shared/options.d.ts.map +0 -1
- package/dist/shared/promise.d.ts.map +0 -1
- package/dist/shared/promise.js.map +0 -1
- package/dist/shared/tenancy.d.ts.map +0 -1
- package/dist/shared/tenancy.js.map +0 -1
- package/dist/surface.test.d.ts +0 -2
- package/dist/surface.test.d.ts.map +0 -1
- package/dist/surface.test.js +0 -38
- package/dist/surface.test.js.map +0 -1
- package/dist/unsafe.d.ts +0 -41
- package/dist/unsafe.d.ts.map +0 -1
- package/dist/unsafe.js +0 -52
- package/dist/unsafe.js.map +0 -1
- /package/dist/{shared → internal}/tenancy.d.ts +0 -0
- /package/dist/{shared → internal}/tenancy.js +0 -0
- /package/dist/{shared/options.js → options.js} +0 -0
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
import type { PasslockOptions } from "../shared/options";
|
|
2
|
-
import type { UserVerification } from "./shared";
|
|
3
|
-
import * as Helper from "@simplewebauthn/browser";
|
|
4
|
-
import { type AuthenticationResponseJSON, type PublicKeyCredentialRequestOptionsJSON } from "@simplewebauthn/browser";
|
|
5
|
-
import { Context, Micro } from "effect";
|
|
6
|
-
import { Logger } from "../logger";
|
|
7
|
-
import { Endpoint, type UnexpectedError } from "../shared/network";
|
|
8
|
-
import { TenancyId } from "../shared/tenancy";
|
|
9
|
-
import { OtherPasskeyError, PasskeyUnsupportedError } from "./errors";
|
|
10
|
-
interface OptionsResponse {
|
|
11
|
-
sessionToken: string;
|
|
12
|
-
optionsJSON: PublicKeyCredentialRequestOptionsJSON;
|
|
13
|
-
}
|
|
14
|
-
declare const AuthenticationHelper_base: Context.TagClass<AuthenticationHelper, "AuthenticationHelper", {
|
|
15
|
-
browserSupportsWebAuthn: typeof Helper.browserSupportsWebAuthn;
|
|
16
|
-
startAuthentication: typeof Helper.startAuthentication;
|
|
17
|
-
}>;
|
|
18
|
-
export declare class AuthenticationHelper extends AuthenticationHelper_base {
|
|
19
|
-
static Default: {
|
|
20
|
-
browserSupportsWebAuthn: typeof Helper.browserSupportsWebAuthn;
|
|
21
|
-
startAuthentication: typeof Helper.startAuthentication;
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
export declare const authenticationEvent: readonly ["optionsRequest", "getCredential", "verifyCredential"];
|
|
25
|
-
export type AuthenticationEvent = (typeof authenticationEvent)[number];
|
|
26
|
-
export type OnEventFn = (event: AuthenticationEvent) => void;
|
|
27
|
-
export interface AuthenticationOptions extends PasslockOptions {
|
|
28
|
-
/**
|
|
29
|
-
* Passlock userId. Essentially a shortcut to look up any
|
|
30
|
-
* registered passkeys (allowCredentials) for a given user.
|
|
31
|
-
*/
|
|
32
|
-
userId?: string | undefined;
|
|
33
|
-
/**
|
|
34
|
-
* Restrict the passkey(s) the device presents to the user to a given set
|
|
35
|
-
*
|
|
36
|
-
* @see {@link https://passlock.dev/passkeys/authentication/#allowcredentials|allowCredentials}
|
|
37
|
-
*/
|
|
38
|
-
allowCredentials?: Array<string> | undefined;
|
|
39
|
-
/**
|
|
40
|
-
* Whether the device should re-authenticate the user locally before registering the passkey.
|
|
41
|
-
*
|
|
42
|
-
* @see {@link https://passlock.dev/passkeys/user-verification/|userVerification}
|
|
43
|
-
*/
|
|
44
|
-
userVerification?: UserVerification | undefined;
|
|
45
|
-
/**
|
|
46
|
-
* Use browser autofill.
|
|
47
|
-
*/
|
|
48
|
-
autofill?: boolean;
|
|
49
|
-
/**
|
|
50
|
-
* Receive notifications about key stages in the authentication process.
|
|
51
|
-
* For example, you might use event notifications to toggle loading icons or
|
|
52
|
-
* to disable certain form fields.
|
|
53
|
-
* @param event
|
|
54
|
-
* @returns
|
|
55
|
-
*/
|
|
56
|
-
onEvent?: OnEventFn;
|
|
57
|
-
timeout?: number | undefined;
|
|
58
|
-
}
|
|
59
|
-
export declare const fetchOptions: (options: Omit<AuthenticationOptions, keyof PasslockOptions>) => Micro.Micro<OptionsResponse, UnexpectedError, Logger | Endpoint | TenancyId>;
|
|
60
|
-
declare const AuthenticationSuccessTag: "AuthenticationSuccess";
|
|
61
|
-
type AuthenticationSuccessTag = typeof AuthenticationSuccessTag;
|
|
62
|
-
/**
|
|
63
|
-
* Represents the outcome of a successfull passkey authentication.
|
|
64
|
-
* Submit the code and/or id_token to your backend, then either
|
|
65
|
-
* exchange the code with the passlock REST API or decode and
|
|
66
|
-
* verify the id_token (JWT).
|
|
67
|
-
*
|
|
68
|
-
* Note: The @passlock/node library includes utilities to do this
|
|
69
|
-
* for you.
|
|
70
|
-
*/
|
|
71
|
-
export interface AuthenticationSuccess {
|
|
72
|
-
_tag: AuthenticationSuccessTag;
|
|
73
|
-
principal: {
|
|
74
|
-
authenticatorId: string;
|
|
75
|
-
userId: string;
|
|
76
|
-
};
|
|
77
|
-
/**
|
|
78
|
-
* A signed JWT representing the newly registered passkey.
|
|
79
|
-
* Decode and verify this in your backend or use one of the @passlock/node
|
|
80
|
-
* helper utilities.
|
|
81
|
-
*
|
|
82
|
-
* @see {@link https://passlock.dev/principal/idtoken-verification/|id_token}
|
|
83
|
-
*/
|
|
84
|
-
id_token: string;
|
|
85
|
-
/**
|
|
86
|
-
* Call the Passlock API to exchange this code for details about the newly
|
|
87
|
-
* registered passkey.
|
|
88
|
-
*
|
|
89
|
-
* @see {@link https://passlock.dev/principal/code-exchange//|code exchange}
|
|
90
|
-
*/
|
|
91
|
-
code: string;
|
|
92
|
-
}
|
|
93
|
-
export declare const isAuthenticationSuccess: (payload: unknown) => payload is AuthenticationSuccess;
|
|
94
|
-
export interface PasskeyNotFound {
|
|
95
|
-
_tag: "@error/PasskeyNotFound";
|
|
96
|
-
message: string;
|
|
97
|
-
credentialId: string;
|
|
98
|
-
rpId: string;
|
|
99
|
-
}
|
|
100
|
-
export declare const isPasskeyNotFound: (payload: unknown) => payload is PasskeyNotFound;
|
|
101
|
-
export declare const startAuthentication: (optionsJSON: PublicKeyCredentialRequestOptionsJSON, { useBrowserAutofill, onEvent, }: {
|
|
102
|
-
useBrowserAutofill: boolean;
|
|
103
|
-
onEvent?: OnEventFn | undefined;
|
|
104
|
-
}) => Micro.Micro<Helper.AuthenticationResponseJSON, PasskeyUnsupportedError | OtherPasskeyError, Logger | AuthenticationHelper>;
|
|
105
|
-
export declare const verifyCredential: (sessionToken: string, response: AuthenticationResponseJSON, { onEvent }: {
|
|
106
|
-
onEvent?: OnEventFn | undefined;
|
|
107
|
-
}) => Micro.Micro<AuthenticationSuccess, UnexpectedError | PasskeyNotFound, Logger | Endpoint | TenancyId>;
|
|
108
|
-
export type AuthenticationError = PasskeyUnsupportedError | OtherPasskeyError | PasskeyNotFound | UnexpectedError;
|
|
109
|
-
/**
|
|
110
|
-
* Trigger local passkey authentication then verify the passkey in the Passlock vault.
|
|
111
|
-
* Returns a code and id_token that can be exchanged/decoded in your backend.
|
|
112
|
-
*
|
|
113
|
-
* @param options
|
|
114
|
-
* @returns
|
|
115
|
-
*/
|
|
116
|
-
export declare const authenticatePasskey: (options: AuthenticationOptions) => Micro.Micro<AuthenticationSuccess, AuthenticationError, Logger | AuthenticationHelper>;
|
|
117
|
-
export {};
|
|
118
|
-
//# sourceMappingURL=authentication.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"authentication.d.ts","sourceRoot":"","sources":["../../src/passkey/authentication.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"authentication.js","sourceRoot":"","sources":["../../src/passkey/authentication.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"authentication.test.d.ts","sourceRoot":"","sources":["../../src/passkey/authentication.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
import fetchMock from "@fetch-mock/vitest";
|
|
2
|
-
import { Context, Micro, pipe } from "effect";
|
|
3
|
-
import { afterAll, describe, expect, it, vi } from "vitest";
|
|
4
|
-
import { Logger } from "../logger";
|
|
5
|
-
import { Endpoint } from "../shared/network";
|
|
6
|
-
import { TenancyId } from "../shared/tenancy";
|
|
7
|
-
import { AuthenticationHelper, authenticatePasskey, fetchOptions, startAuthentication, verifyCredential, } from "./authentication";
|
|
8
|
-
import { PasskeyUnsupportedError } from "./errors";
|
|
9
|
-
const loggerTest = {
|
|
10
|
-
logDebug: () => Micro.void,
|
|
11
|
-
logError: () => Micro.void,
|
|
12
|
-
logInfo: () => Micro.void,
|
|
13
|
-
logWarn: () => Micro.void,
|
|
14
|
-
};
|
|
15
|
-
describe(fetchOptions.name, () => {
|
|
16
|
-
const endpoint = "https://api.passlock.dev";
|
|
17
|
-
const tenancyId = "dummyTenancyId";
|
|
18
|
-
const ctx = pipe(Context.make(Endpoint, { endpoint }), Context.add(Logger, loggerTest), Context.add(TenancyId, { tenancyId }));
|
|
19
|
-
const expectedRoute = `${endpoint}/${tenancyId}/passkey/authentication/options`;
|
|
20
|
-
const mockResponse = {
|
|
21
|
-
optionsJSON: {},
|
|
22
|
-
sessionToken: "dummySessionToken",
|
|
23
|
-
};
|
|
24
|
-
describe("given an empty set of options", () => {
|
|
25
|
-
it("should fetch some PublicKeyCredentialCreationOptions", async () => {
|
|
26
|
-
fetchMock.mockGlobal().postOnce(expectedRoute, mockResponse);
|
|
27
|
-
const result = await pipe(fetchOptions({}), Micro.provideContext(ctx), Micro.runPromise);
|
|
28
|
-
expect(result.sessionToken).toBeTruthy();
|
|
29
|
-
expect(result.optionsJSON).toBeTruthy();
|
|
30
|
-
});
|
|
31
|
-
});
|
|
32
|
-
describe("given a userId", () => {
|
|
33
|
-
const userId = "dummyUserId";
|
|
34
|
-
it("should send it to the backend", async () => {
|
|
35
|
-
fetchMock.mockGlobal().postOnce(expectedRoute, mockResponse);
|
|
36
|
-
await pipe(fetchOptions({ userId }), Micro.provideContext(ctx), Micro.runPromise);
|
|
37
|
-
expect(fetchMock).toHavePosted(expectedRoute, { body: { userId } });
|
|
38
|
-
});
|
|
39
|
-
});
|
|
40
|
-
describe("given a list of allowCredentials", () => {
|
|
41
|
-
const allowCredentials = ["dummyCredential"];
|
|
42
|
-
it("should send them to the backend", async () => {
|
|
43
|
-
fetchMock.mockGlobal().postOnce(expectedRoute, mockResponse);
|
|
44
|
-
await pipe(fetchOptions({ allowCredentials }), Micro.provideContext(ctx), Micro.runPromise);
|
|
45
|
-
expect(fetchMock).toHavePosted(expectedRoute, {
|
|
46
|
-
body: { allowCredentials },
|
|
47
|
-
});
|
|
48
|
-
});
|
|
49
|
-
});
|
|
50
|
-
describe("given a userVerification", () => {
|
|
51
|
-
const userVerification = "required";
|
|
52
|
-
it("should send it to the backend", async () => {
|
|
53
|
-
fetchMock.mockGlobal().postOnce(expectedRoute, mockResponse);
|
|
54
|
-
await pipe(fetchOptions({ userVerification }), Micro.provideContext(ctx), Micro.runPromise);
|
|
55
|
-
expect(fetchMock).toHavePosted(expectedRoute, {
|
|
56
|
-
body: { userVerification },
|
|
57
|
-
});
|
|
58
|
-
});
|
|
59
|
-
});
|
|
60
|
-
it("should invoke the onEvent handler", async () => {
|
|
61
|
-
fetchMock.mockGlobal().postOnce(expectedRoute, mockResponse);
|
|
62
|
-
const onEvent = vi.fn();
|
|
63
|
-
await pipe(fetchOptions({ onEvent }), Micro.provideContext(ctx), Micro.runPromise);
|
|
64
|
-
expect(onEvent).toHaveBeenCalledWith("optionsRequest");
|
|
65
|
-
});
|
|
66
|
-
});
|
|
67
|
-
describe(startAuthentication.name, () => {
|
|
68
|
-
describe("given valid options", () => {
|
|
69
|
-
const authenticationHelperTest = {
|
|
70
|
-
browserSupportsWebAuthn: () => true,
|
|
71
|
-
startAuthentication: () => Promise.resolve({}),
|
|
72
|
-
};
|
|
73
|
-
it("should invoke the underlying startAuthentication function", async () => {
|
|
74
|
-
await pipe(startAuthentication({}, {
|
|
75
|
-
useBrowserAutofill: false,
|
|
76
|
-
}), Micro.provideService(Logger, loggerTest), Micro.provideService(AuthenticationHelper, authenticationHelperTest), Micro.runPromise);
|
|
77
|
-
});
|
|
78
|
-
});
|
|
79
|
-
describe("if the device does not support passkeys", () => {
|
|
80
|
-
const authenticationHelperTest = {
|
|
81
|
-
browserSupportsWebAuthn: () => false,
|
|
82
|
-
startAuthentication: () => Promise.resolve({}),
|
|
83
|
-
};
|
|
84
|
-
it("should return an error", async () => {
|
|
85
|
-
const result = await pipe(startAuthentication({}, {
|
|
86
|
-
useBrowserAutofill: false,
|
|
87
|
-
}), Micro.flip, Micro.provideService(Logger, loggerTest), Micro.provideService(AuthenticationHelper, authenticationHelperTest), Micro.runPromise);
|
|
88
|
-
expect(result).toBeInstanceOf(PasskeyUnsupportedError);
|
|
89
|
-
});
|
|
90
|
-
});
|
|
91
|
-
});
|
|
92
|
-
describe(verifyCredential.name, () => {
|
|
93
|
-
const endpoint = "https://api.passlock.dev";
|
|
94
|
-
const tenancyId = "dummyTenancyId";
|
|
95
|
-
const ctx = pipe(Context.make(Endpoint, { endpoint }), Context.add(Logger, loggerTest), Context.add(TenancyId, { tenancyId }));
|
|
96
|
-
const expectedRoute = `${endpoint}/${tenancyId}/passkey/authentication/verification`;
|
|
97
|
-
describe("when the passkey exists", () => {
|
|
98
|
-
const mockResponse = {
|
|
99
|
-
_tag: "AuthenticationSuccess",
|
|
100
|
-
code: "dummyCode",
|
|
101
|
-
id_token: "dummyIdToken",
|
|
102
|
-
principal: {
|
|
103
|
-
authenticatorId: "dummyPasskeyId",
|
|
104
|
-
},
|
|
105
|
-
};
|
|
106
|
-
it("should return a successful response", async () => {
|
|
107
|
-
fetchMock.mockGlobal().postOnce(expectedRoute, mockResponse);
|
|
108
|
-
const result = await pipe(verifyCredential("dummySessionToken", {}, {}), Micro.provideContext(ctx), Micro.runPromise);
|
|
109
|
-
expect(result).toStrictEqual(mockResponse);
|
|
110
|
-
});
|
|
111
|
-
});
|
|
112
|
-
describe("when the backend says the passkey does not exist", () => {
|
|
113
|
-
it("should return an error", async () => {
|
|
114
|
-
const mockResponse = {
|
|
115
|
-
_tag: "@error/PasskeyNotFound",
|
|
116
|
-
credentialId: "dummyWebAuthnId",
|
|
117
|
-
message: "oops",
|
|
118
|
-
rpId: "localhost",
|
|
119
|
-
};
|
|
120
|
-
fetchMock.mockGlobal().postOnce(expectedRoute, { body: mockResponse, status: 400 });
|
|
121
|
-
const error = await pipe(verifyCredential("dummySessionToken", {}, {}), Micro.flip, Micro.provideContext(ctx), Micro.runPromise);
|
|
122
|
-
expect(error).toStrictEqual(mockResponse);
|
|
123
|
-
});
|
|
124
|
-
});
|
|
125
|
-
});
|
|
126
|
-
describe(authenticatePasskey.name, () => {
|
|
127
|
-
const endpoint = "https://api.passlock.dev";
|
|
128
|
-
const tenancyId = "dummyTenancyId";
|
|
129
|
-
const authenticationHelperTest = {
|
|
130
|
-
browserSupportsWebAuthn: () => true,
|
|
131
|
-
startAuthentication: () => Promise.resolve({}),
|
|
132
|
-
};
|
|
133
|
-
const ctx = pipe(Context.make(Endpoint, { endpoint }), Context.add(Logger, loggerTest), Context.add(TenancyId, { tenancyId }), Context.add(AuthenticationHelper, authenticationHelperTest));
|
|
134
|
-
const optionsRoute = `${endpoint}/${tenancyId}/passkey/authentication/options`;
|
|
135
|
-
const optionsResponse = {
|
|
136
|
-
optionsJSON: {},
|
|
137
|
-
sessionToken: "dummySessionToken",
|
|
138
|
-
};
|
|
139
|
-
const verificationRoute = `${endpoint}/${tenancyId}/passkey/authentication/verification`;
|
|
140
|
-
const verificationResponse = {
|
|
141
|
-
_tag: "AuthenticationSuccess",
|
|
142
|
-
code: "dummyCode",
|
|
143
|
-
id_token: "dummyIdToken",
|
|
144
|
-
principal: {
|
|
145
|
-
authenticatorId: "dummyPasskeyId",
|
|
146
|
-
},
|
|
147
|
-
};
|
|
148
|
-
it("should fetch the options and kick off the authentication", async () => {
|
|
149
|
-
fetchMock.mockGlobal().postOnce(optionsRoute, optionsResponse);
|
|
150
|
-
fetchMock.mockGlobal().postOnce(verificationRoute, verificationResponse);
|
|
151
|
-
pipe(authenticatePasskey({ tenancyId }), Micro.provideContext(ctx), Micro.runPromise);
|
|
152
|
-
});
|
|
153
|
-
});
|
|
154
|
-
afterAll(() => {
|
|
155
|
-
fetchMock.unmockGlobal();
|
|
156
|
-
});
|
|
157
|
-
//# sourceMappingURL=authentication.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"authentication.test.js","sourceRoot":"","sources":["../../src/passkey/authentication.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
import type { PasslockOptions } from "../shared/options";
|
|
2
|
-
import type { UserVerification } from "./shared";
|
|
3
|
-
import * as Helper from "@simplewebauthn/browser";
|
|
4
|
-
import { type PublicKeyCredentialCreationOptionsJSON, type RegistrationResponseJSON } from "@simplewebauthn/browser";
|
|
5
|
-
import { Context, Micro } from "effect";
|
|
6
|
-
import { Logger } from "../logger";
|
|
7
|
-
import { Endpoint, type UnexpectedError } from "../shared/network";
|
|
8
|
-
import { TenancyId } from "../shared/tenancy";
|
|
9
|
-
import { OtherPasskeyError, PasskeyUnsupportedError } from "./errors";
|
|
10
|
-
interface OptionsResponse {
|
|
11
|
-
sessionToken: string;
|
|
12
|
-
optionsJSON: PublicKeyCredentialCreationOptionsJSON;
|
|
13
|
-
}
|
|
14
|
-
declare const RegistrationHelper_base: Context.TagClass<RegistrationHelper, "RegistrationHelper", {
|
|
15
|
-
browserSupportsWebAuthn: typeof Helper.browserSupportsWebAuthn;
|
|
16
|
-
startRegistration: typeof Helper.startRegistration;
|
|
17
|
-
}>;
|
|
18
|
-
export declare class RegistrationHelper extends RegistrationHelper_base {
|
|
19
|
-
static Default: {
|
|
20
|
-
browserSupportsWebAuthn: typeof Helper.browserSupportsWebAuthn;
|
|
21
|
-
startRegistration: typeof Helper.startRegistration;
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
export declare const isDuplicatePasskey: (err: unknown) => err is DuplicatePasskeyError;
|
|
25
|
-
declare const DuplicatePasskeyError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => Micro.YieldableError & {
|
|
26
|
-
readonly _tag: "@error/DuplicatePasskey";
|
|
27
|
-
} & Readonly<A>;
|
|
28
|
-
/**
|
|
29
|
-
* Raised if excludeCredentials or userId was provided and the
|
|
30
|
-
* device recognises one of the passkey ids i.e. the user currently
|
|
31
|
-
* has a passkey registered on the current device for a given userId.
|
|
32
|
-
*/
|
|
33
|
-
export declare class DuplicatePasskeyError extends DuplicatePasskeyError_base<{
|
|
34
|
-
readonly message: string;
|
|
35
|
-
}> {
|
|
36
|
-
static isDuplicatePasskey: (err: unknown) => err is DuplicatePasskeyError;
|
|
37
|
-
}
|
|
38
|
-
export declare const registrationEvent: readonly ["optionsRequest", "createCredential", "saveCredential"];
|
|
39
|
-
export type RegistrationEvent = (typeof registrationEvent)[number];
|
|
40
|
-
export type OnEventFn = (event: RegistrationEvent) => void;
|
|
41
|
-
/**
|
|
42
|
-
* Passkey registration options
|
|
43
|
-
*/
|
|
44
|
-
export interface RegistrationOptions extends PasslockOptions {
|
|
45
|
-
/**
|
|
46
|
-
* The username associated with the newly reguistered passkey..
|
|
47
|
-
*
|
|
48
|
-
* @see {@link https://passlock.dev/getting-started/passkey-registration/#passkey-username|username}
|
|
49
|
-
*/
|
|
50
|
-
username: string;
|
|
51
|
-
/**
|
|
52
|
-
* Human palateable username
|
|
53
|
-
*/
|
|
54
|
-
userDisplayName?: string | undefined;
|
|
55
|
-
/**
|
|
56
|
-
* Passlock userId. Essentially a shortcut to look up any
|
|
57
|
-
* currently registered passkeys (excludeCredentials) for a given user.
|
|
58
|
-
*/
|
|
59
|
-
userId?: string | undefined;
|
|
60
|
-
/**
|
|
61
|
-
* Prevents the user registering a passkey if they already have one
|
|
62
|
-
* (for the same user account) registered on the current device.
|
|
63
|
-
*
|
|
64
|
-
* @see {@link https://passlock.dev/passkeys/registration/#excludecredentials|excludeCredentials}
|
|
65
|
-
*/
|
|
66
|
-
excludeCredentials?: Array<string> | undefined;
|
|
67
|
-
/**
|
|
68
|
-
* Whether the device should re-authenticate the user locally before registering the passkey.
|
|
69
|
-
*
|
|
70
|
-
* @see {@link https://passlock.dev/passkeys/user-verification/|userVerification}
|
|
71
|
-
*/
|
|
72
|
-
userVerification?: UserVerification | undefined;
|
|
73
|
-
/**
|
|
74
|
-
* Receive notifications about key stages in the registration process.
|
|
75
|
-
* For example, you might use event notifications to toggle loading icons or
|
|
76
|
-
* to disable certain form fields.
|
|
77
|
-
* @param event
|
|
78
|
-
* @returns
|
|
79
|
-
*/
|
|
80
|
-
onEvent?: OnEventFn;
|
|
81
|
-
timeout?: number | undefined;
|
|
82
|
-
}
|
|
83
|
-
export declare const fetchOptions: (options: Omit<RegistrationOptions, keyof PasslockOptions>) => Micro.Micro<OptionsResponse, UnexpectedError, Logger | Endpoint | TenancyId>;
|
|
84
|
-
declare const RegistrationSuccessTag: "RegistrationSuccess";
|
|
85
|
-
type RegistrationSuccessTag = typeof RegistrationSuccessTag;
|
|
86
|
-
/**
|
|
87
|
-
* Represents the outcome of a successfull passkey registration.
|
|
88
|
-
* Submit the code and/or id_token to your backend, then either
|
|
89
|
-
* exchange the code with the passlock REST API or decode and
|
|
90
|
-
* verify the id_token (JWT).
|
|
91
|
-
*
|
|
92
|
-
* Note: The @passlock/node library includes utilities to do this
|
|
93
|
-
* for you.
|
|
94
|
-
*/
|
|
95
|
-
export interface RegistrationSuccess {
|
|
96
|
-
_tag: RegistrationSuccessTag;
|
|
97
|
-
principal: {
|
|
98
|
-
authenticatorId: string;
|
|
99
|
-
userId: string;
|
|
100
|
-
};
|
|
101
|
-
/**
|
|
102
|
-
* A signed JWT representing the newly registered passkey.
|
|
103
|
-
* Decode and verify this in your backend or use one of the @passlock/node
|
|
104
|
-
* helper utilities.
|
|
105
|
-
*
|
|
106
|
-
* @see {@link https://passlock.dev/principal/idtoken-verification/|id_token}
|
|
107
|
-
*/
|
|
108
|
-
id_token: string;
|
|
109
|
-
/**
|
|
110
|
-
* Call the Passlock API to exchange this code for details about the newly
|
|
111
|
-
* registered passkey.
|
|
112
|
-
*
|
|
113
|
-
* @see {@link https://passlock.dev/principal/code-exchange//|code exchange}
|
|
114
|
-
*/
|
|
115
|
-
code: string;
|
|
116
|
-
}
|
|
117
|
-
export declare const isRegistrationSuccess: (payload: unknown) => payload is RegistrationSuccess;
|
|
118
|
-
export declare const startRegistration: (optionsJSON: PublicKeyCredentialCreationOptionsJSON, { onEvent }: {
|
|
119
|
-
onEvent?: OnEventFn | undefined;
|
|
120
|
-
}) => Micro.Micro<Helper.RegistrationResponseJSON, PasskeyUnsupportedError | OtherPasskeyError | DuplicatePasskeyError, Logger | RegistrationHelper>;
|
|
121
|
-
export declare const verifyCredential: (sessionToken: string, response: RegistrationResponseJSON, { onEvent }: {
|
|
122
|
-
onEvent?: OnEventFn | undefined;
|
|
123
|
-
}) => Micro.Micro<RegistrationSuccess, UnexpectedError, Logger | Endpoint | TenancyId>;
|
|
124
|
-
/**
|
|
125
|
-
* Potential errors associated with Passkey registration
|
|
126
|
-
*/
|
|
127
|
-
export type RegistrationError = PasskeyUnsupportedError | DuplicatePasskeyError | OtherPasskeyError | UnexpectedError;
|
|
128
|
-
/**
|
|
129
|
-
* Register a passkey on the local device and store the
|
|
130
|
-
* associated public key in the Passlock vault.
|
|
131
|
-
* @param options
|
|
132
|
-
* @returns
|
|
133
|
-
*/
|
|
134
|
-
export declare const registerPasskey: (options: RegistrationOptions) => Micro.Micro<RegistrationSuccess, RegistrationError, Logger | RegistrationHelper>;
|
|
135
|
-
export {};
|
|
136
|
-
//# sourceMappingURL=registration.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"registration.d.ts","sourceRoot":"","sources":["../../src/passkey/registration.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"registration.js","sourceRoot":"","sources":["../../src/passkey/registration.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,MAAM,yBAAyB,CAAA;AACjD,OAAO,EAGL,aAAa,GACd,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAClC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAwB,MAAM,mBAAmB,CAAA;AAC9F,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAC7C,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAA;AAOrE,MAAM,OAAO,kBAAmB,SAAQ,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAMtE;IACD,MAAM,CAAC,OAAO,GAAG;QACf,uBAAuB,EAAE,MAAM,CAAC,uBAAuB;QACvD,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;KACA,CAAA;;AAG/C,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,GAAY,EAAgC,EAAE,CAC/E,GAAG,YAAY,qBAAqB,CAAA;AAEtC;;;;GAIG;AACH,MAAM,OAAO,qBAAsB,SAAQ,KAAK,CAAC,WAAW,CAAC,yBAAyB,CAEpF;IACA,MAAM,CAAC,kBAAkB,GAAG,kBAAkB,CAAA;;AAGhD,MAAM,iBAAiB,GAAG,CAAC,OAAgB,EAA8B,EAAE;IACzE,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IAC7C,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,KAAK,CAAA;IAElC,IAAI,CAAC,CAAC,aAAa,IAAI,OAAO,CAAC;QAAE,OAAO,KAAK,CAAA;IAC7C,IAAI,OAAO,OAAO,CAAC,WAAW,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IACzD,IAAI,OAAO,CAAC,WAAW,KAAK,IAAI;QAAE,OAAO,KAAK,CAAA;IAE9C,IAAI,CAAC,CAAC,cAAc,IAAI,OAAO,CAAC;QAAE,OAAO,KAAK,CAAA;IAC9C,IAAI,OAAO,OAAO,CAAC,YAAY,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IAE1D,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,gBAAgB,EAAE,kBAAkB,EAAE,gBAAgB,CAAU,CAAA;AAiDlG,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,OAAyD,EAAE,EAAE,CACxF,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;IACjB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IAC3C,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IACnD,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IAErD,MAAM,EACJ,QAAQ,EACR,eAAe,EACf,MAAM,EACN,kBAAkB,EAClB,gBAAgB,EAChB,OAAO,EACP,OAAO,GACR,GAAG,OAAO,CAAA;IAEX,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,SAAS,+BAA+B,EAAE,QAAQ,CAAC,CAAA;IAE1E,OAAO,EAAE,CAAC,gBAAgB,CAAC,CAAA;IAC3B,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,qDAAqD,CAAC,CAAA;IAE5E,MAAM,OAAO,GAAG;QACd,kBAAkB;QAClB,OAAO;QACP,eAAe;QACf,MAAM;QACN,QAAQ;QACR,gBAAgB;KACjB,CAAA;IAED,OAAO,KAAK,CAAC,CAAC,WAAW,CAAC;QACxB,KAAK,EAAE,sBAAsB;QAC7B,OAAO;QACP,iBAAiB,EAAE,iBAAiB;QACpC,GAAG;KACJ,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEJ,MAAM,sBAAsB,GAAG,qBAA8B,CAAA;AAmC7D,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,OAAgB,EAAkC,EAAE;IACxF,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IAC7C,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,KAAK,CAAA;IAElC,IAAI,CAAC,CAAC,MAAM,IAAI,OAAO,CAAC;QAAE,OAAO,KAAK,CAAA;IACtC,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IAClD,IAAI,OAAO,CAAC,IAAI,KAAK,sBAAsB;QAAE,OAAO,KAAK,CAAA;IAEzD,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,WAAmD,EACnD,EAAE,OAAO,EAAuC,EAChD,EAAE,CACF,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;IACjB,OAAO,EAAE,CAAC,kBAAkB,CAAC,CAAA;IAC7B,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IAC3C,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAA;IAEtD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAA;IAEvD,MAAM,SAAS,GAAG,MAAM,CAAC,uBAAuB,EAAE,CAAA;IAClD,IAAI,CAAC,SAAS;QACZ,KAAK,CAAC,CAAC,IAAI,uBAAuB,CAAC;YACjC,OAAO,EAAE,kCAAkC;SAC5C,CAAC,CAAA;IAEJ,OAAO,KAAK,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC;QAC7B,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;YACf,IACE,KAAK,YAAY,aAAa;gBAC9B,KAAK,CAAC,IAAI,KAAK,2CAA2C,EAC1D,CAAC;gBACD,OAAO,IAAI,qBAAqB,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;YAC9D,CAAC;iBAAM,IAAI,KAAK,YAAY,aAAa,EAAE,CAAC;gBAC1C,OAAO,IAAI,iBAAiB,CAAC;oBAC3B,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,OAAO,EAAE,KAAK,CAAC,OAAO;iBACvB,CAAC,CAAA;YACJ,CAAC;iBAAM,CAAC;gBACN,OAAO,IAAI,iBAAiB,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC,CAAA;YACtE,CAAC;QACH,CAAC;QACD,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,WAAW,EAAE,CAAC;KACrD,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEJ,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,YAAoB,EACpB,QAAkC,EAClC,EAAE,OAAO,EAAuC,EAChD,EAAE,CACF,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;IACjB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IAC3C,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IACnD,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IAErD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,SAAS,oCAAoC,EAAE,QAAQ,CAAC,CAAA;IAE/E,OAAO,EAAE,CAAC,gBAAgB,CAAC,CAAA;IAC3B,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAA;IAE9D,MAAM,OAAO,GAAG;QACd,QAAQ;QACR,YAAY;KACb,CAAA;IAED,MAAM,oBAAoB,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC;QAC9C,KAAK,EAAE,2BAA2B;QAClC,OAAO;QACP,iBAAiB,EAAE,qBAAqB;QACxC,GAAG;KACJ,CAAC,CAAA;IAEF,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CACnB,8BAA8B,oBAAoB,CAAC,SAAS,CAAC,eAAe,EAAE,CAC/E,CAAA;IAED,OAAO,oBAAoB,CAAA;AAC7B,CAAC,CAAC,CAAA;AAWJ;;;;;GAKG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,OAA4B,EACsD,EAAE;IACpF,MAAM,QAAQ,GAAG,aAAa,CAAC,OAAO,CAAC,CAAA;IAEvC,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;QAChC,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAA;QAClE,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,iBAAiB,CAAC,WAAW,EAAE;YACrD,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC,CAAA;QACF,OAAO,KAAK,CAAC,CAAC,gBAAgB,CAAC,YAAY,EAAE,QAAQ,EAAE;YACrD,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,OAAO,IAAI,CACT,MAAM,EACN,KAAK,CAAC,cAAc,CAAC,SAAS,EAAE,OAAO,CAAC,EACxC,KAAK,CAAC,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CACzC,CAAA;AACH,CAAC,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"registration.test.d.ts","sourceRoot":"","sources":["../../src/passkey/registration.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,161 +0,0 @@
|
|
|
1
|
-
import fetchMock from "@fetch-mock/vitest";
|
|
2
|
-
import { Context, Micro, pipe } from "effect";
|
|
3
|
-
import { afterAll, describe, expect, it, vi } from "vitest";
|
|
4
|
-
import { Logger } from "../logger";
|
|
5
|
-
import { Endpoint } from "../shared/network";
|
|
6
|
-
import { TenancyId } from "../shared/tenancy";
|
|
7
|
-
import { PasskeyUnsupportedError } from "./errors";
|
|
8
|
-
import { fetchOptions, RegistrationHelper, registerPasskey, startRegistration, verifyCredential, } from "./registration";
|
|
9
|
-
const loggerTest = {
|
|
10
|
-
logDebug: () => Micro.void,
|
|
11
|
-
logError: () => Micro.void,
|
|
12
|
-
logInfo: () => Micro.void,
|
|
13
|
-
logWarn: () => Micro.void,
|
|
14
|
-
};
|
|
15
|
-
describe(fetchOptions.name, () => {
|
|
16
|
-
const endpoint = "https://api.passlock.dev";
|
|
17
|
-
const tenancyId = "dummyTenancyId";
|
|
18
|
-
const username = "dummyUsername";
|
|
19
|
-
const userDisplayName = "dummyDisplayName";
|
|
20
|
-
const userId = "dummyUserId";
|
|
21
|
-
const ctx = pipe(Context.make(Endpoint, { endpoint }), Context.add(Logger, loggerTest), Context.add(TenancyId, { tenancyId }));
|
|
22
|
-
const expectedRoute = `${endpoint}/${tenancyId}/passkey/registration/options`;
|
|
23
|
-
const mockResponse = {
|
|
24
|
-
optionsJSON: {},
|
|
25
|
-
sessionToken: "dummySessionToken",
|
|
26
|
-
};
|
|
27
|
-
describe("given an empty set of options", () => {
|
|
28
|
-
it("should fetch some PublicKeyCredentialCreationOptions", async () => {
|
|
29
|
-
fetchMock.mockGlobal().postOnce(expectedRoute, mockResponse);
|
|
30
|
-
const result = await pipe(fetchOptions({ username }), Micro.provideContext(ctx), Micro.runPromise);
|
|
31
|
-
expect(result.sessionToken).toBeTruthy();
|
|
32
|
-
expect(result.optionsJSON).toBeTruthy();
|
|
33
|
-
});
|
|
34
|
-
});
|
|
35
|
-
describe("given a username", () => {
|
|
36
|
-
it("should send it to the backend", async () => {
|
|
37
|
-
fetchMock.mockGlobal().postOnce(expectedRoute, mockResponse);
|
|
38
|
-
await pipe(fetchOptions({ username }), Micro.provideContext(ctx), Micro.runPromise);
|
|
39
|
-
expect(fetchMock).toHavePosted(expectedRoute, { body: { username } });
|
|
40
|
-
});
|
|
41
|
-
});
|
|
42
|
-
describe("given a userDisplayName", () => {
|
|
43
|
-
it("should send it to the backend", async () => {
|
|
44
|
-
fetchMock.mockGlobal().postOnce(expectedRoute, mockResponse);
|
|
45
|
-
await pipe(fetchOptions({ userDisplayName, username }), Micro.provideContext(ctx), Micro.runPromise);
|
|
46
|
-
expect(fetchMock).toHavePosted(expectedRoute, {
|
|
47
|
-
body: { userDisplayName, username },
|
|
48
|
-
});
|
|
49
|
-
});
|
|
50
|
-
});
|
|
51
|
-
describe("given a userId", () => {
|
|
52
|
-
it("should send it to the backend", async () => {
|
|
53
|
-
fetchMock.mockGlobal().postOnce(expectedRoute, mockResponse);
|
|
54
|
-
await pipe(fetchOptions({ userId, username }), Micro.provideContext(ctx), Micro.runPromise);
|
|
55
|
-
expect(fetchMock).toHavePosted(expectedRoute, {
|
|
56
|
-
body: { userId, username },
|
|
57
|
-
});
|
|
58
|
-
});
|
|
59
|
-
});
|
|
60
|
-
describe("given a list of excludeCredentials", () => {
|
|
61
|
-
const excludeCredentials = ["dummyCredential"];
|
|
62
|
-
it("should send them to the backend", async () => {
|
|
63
|
-
fetchMock.mockGlobal().postOnce(expectedRoute, mockResponse);
|
|
64
|
-
await pipe(fetchOptions({ excludeCredentials, username }), Micro.provideContext(ctx), Micro.runPromise);
|
|
65
|
-
expect(fetchMock).toHavePosted(expectedRoute, {
|
|
66
|
-
body: { excludeCredentials, username },
|
|
67
|
-
});
|
|
68
|
-
});
|
|
69
|
-
});
|
|
70
|
-
describe("given a userVerification", () => {
|
|
71
|
-
const userVerification = "required";
|
|
72
|
-
it("should send it to the backend", async () => {
|
|
73
|
-
fetchMock.mockGlobal().postOnce(expectedRoute, mockResponse);
|
|
74
|
-
await pipe(fetchOptions({ username, userVerification }), Micro.provideContext(ctx), Micro.runPromise);
|
|
75
|
-
expect(fetchMock).toHavePosted(expectedRoute, {
|
|
76
|
-
body: { username, userVerification },
|
|
77
|
-
});
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
it("should invoke the onEvent handler", async () => {
|
|
81
|
-
fetchMock.mockGlobal().postOnce(expectedRoute, mockResponse);
|
|
82
|
-
const onEvent = vi.fn();
|
|
83
|
-
await pipe(fetchOptions({ onEvent, username }), Micro.provideContext(ctx), Micro.runPromise);
|
|
84
|
-
expect(onEvent).toHaveBeenCalledWith("optionsRequest");
|
|
85
|
-
});
|
|
86
|
-
});
|
|
87
|
-
describe(startRegistration.name, () => {
|
|
88
|
-
describe("given valid options", () => {
|
|
89
|
-
const registrationHelperTest = {
|
|
90
|
-
browserSupportsWebAuthn: () => true,
|
|
91
|
-
startRegistration: () => Promise.resolve({}),
|
|
92
|
-
};
|
|
93
|
-
it("should invoke the underlying startRegistration function", async () => {
|
|
94
|
-
await pipe(startRegistration({}, {}), Micro.provideService(Logger, loggerTest), Micro.provideService(RegistrationHelper, registrationHelperTest), Micro.runPromise);
|
|
95
|
-
});
|
|
96
|
-
});
|
|
97
|
-
describe("if the device does not support passkeys", () => {
|
|
98
|
-
const registrationHelperTest = {
|
|
99
|
-
browserSupportsWebAuthn: () => false,
|
|
100
|
-
startRegistration: () => Promise.resolve({}),
|
|
101
|
-
};
|
|
102
|
-
it("should return an error", async () => {
|
|
103
|
-
const result = await pipe(startRegistration({}, {}), Micro.flip, Micro.provideService(Logger, loggerTest), Micro.provideService(RegistrationHelper, registrationHelperTest), Micro.runPromise);
|
|
104
|
-
expect(result).toBeInstanceOf(PasskeyUnsupportedError);
|
|
105
|
-
});
|
|
106
|
-
});
|
|
107
|
-
});
|
|
108
|
-
describe(verifyCredential.name, () => {
|
|
109
|
-
const endpoint = "https://api.passlock.dev";
|
|
110
|
-
const tenancyId = "dummyTenancyId";
|
|
111
|
-
const ctx = pipe(Context.make(Endpoint, { endpoint }), Context.add(Logger, loggerTest), Context.add(TenancyId, { tenancyId }));
|
|
112
|
-
const expectedRoute = `${endpoint}/${tenancyId}/passkey/registration/verification`;
|
|
113
|
-
describe("when the passkey exists", () => {
|
|
114
|
-
const mockResponse = {
|
|
115
|
-
_tag: "RegistrationSuccess",
|
|
116
|
-
code: "dummyCode",
|
|
117
|
-
id_token: "dummyIdToken",
|
|
118
|
-
principal: {
|
|
119
|
-
authenticatorId: "dummyPasskeyId",
|
|
120
|
-
},
|
|
121
|
-
};
|
|
122
|
-
it("should return a successful response", async () => {
|
|
123
|
-
fetchMock.mockGlobal().postOnce(expectedRoute, mockResponse);
|
|
124
|
-
const result = await pipe(verifyCredential("dummySessionToken", {}, {}), Micro.provideContext(ctx), Micro.runPromise);
|
|
125
|
-
expect(result).toStrictEqual(mockResponse);
|
|
126
|
-
});
|
|
127
|
-
});
|
|
128
|
-
});
|
|
129
|
-
describe(registerPasskey.name, () => {
|
|
130
|
-
const endpoint = "https://api.passlock.dev";
|
|
131
|
-
const tenancyId = "dummyTenancyId";
|
|
132
|
-
const username = "dummyUsername";
|
|
133
|
-
const registrationHelperTest = {
|
|
134
|
-
browserSupportsWebAuthn: () => true,
|
|
135
|
-
startRegistration: () => Promise.resolve({}),
|
|
136
|
-
};
|
|
137
|
-
const ctx = pipe(Context.make(Endpoint, { endpoint }), Context.add(Logger, loggerTest), Context.add(TenancyId, { tenancyId }), Context.add(RegistrationHelper, registrationHelperTest));
|
|
138
|
-
const optionsRoute = `${endpoint}/${tenancyId}/passkey/registration/options`;
|
|
139
|
-
const optionsResponse = {
|
|
140
|
-
optionsJSON: {},
|
|
141
|
-
sessionToken: "dummySessionToken",
|
|
142
|
-
};
|
|
143
|
-
const verificationRoute = `${endpoint}/${tenancyId}/passkey/registration/verification`;
|
|
144
|
-
const verificationResponse = {
|
|
145
|
-
_tag: "RegistrationSuccess",
|
|
146
|
-
code: "dummyCode",
|
|
147
|
-
id_token: "dummyIdToken",
|
|
148
|
-
principal: {
|
|
149
|
-
authenticatorId: "dummyPasskeyId",
|
|
150
|
-
},
|
|
151
|
-
};
|
|
152
|
-
it("should fetch the options and kick off the registration", async () => {
|
|
153
|
-
fetchMock.mockGlobal().postOnce(optionsRoute, optionsResponse);
|
|
154
|
-
fetchMock.mockGlobal().postOnce(verificationRoute, verificationResponse);
|
|
155
|
-
pipe(registerPasskey({ tenancyId, username }), Micro.provideContext(ctx), Micro.runPromise);
|
|
156
|
-
});
|
|
157
|
-
});
|
|
158
|
-
afterAll(() => {
|
|
159
|
-
fetchMock.unmockGlobal();
|
|
160
|
-
});
|
|
161
|
-
//# sourceMappingURL=registration.test.js.map
|