@effect-auth/core 0.1.0-alpha.3 → 0.1.0-alpha.5
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 +148 -13
- package/dist/ApiKey.d.ts +207 -0
- package/dist/ApiKey.d.ts.map +1 -0
- package/dist/ApiKey.js +275 -0
- package/dist/ApiKey.js.map +1 -0
- package/dist/AuditLog.d.ts +204 -1
- package/dist/AuditLog.d.ts.map +1 -1
- package/dist/AuditLog.js +170 -0
- package/dist/AuditLog.js.map +1 -1
- package/dist/AuthConfig.d.ts +0 -9
- package/dist/AuthConfig.d.ts.map +1 -1
- package/dist/AuthConfig.js +1 -14
- package/dist/AuthConfig.js.map +1 -1
- package/dist/AuthFlow.d.ts +220 -51
- package/dist/AuthFlow.d.ts.map +1 -1
- package/dist/AuthFlow.js +550 -22
- package/dist/AuthFlow.js.map +1 -1
- package/dist/AuthKernel.d.ts +1 -1
- package/dist/Challenge.d.ts +5 -1
- package/dist/Challenge.d.ts.map +1 -1
- package/dist/Challenge.js +58 -48
- package/dist/Challenge.js.map +1 -1
- package/dist/Client.d.ts +263 -1
- package/dist/Client.d.ts.map +1 -1
- package/dist/Client.js +533 -1
- package/dist/Client.js.map +1 -1
- package/dist/D1Kysely.d.ts +1 -1
- package/dist/D1Kysely.d.ts.map +1 -1
- package/dist/EffectQbSqliteStorage.d.ts +115 -3
- package/dist/EffectQbSqliteStorage.d.ts.map +1 -1
- package/dist/EffectQbSqliteStorage.js +314 -4
- package/dist/EffectQbSqliteStorage.js.map +1 -1
- package/dist/EmailOtp.d.ts +5 -2
- package/dist/EmailOtp.d.ts.map +1 -1
- package/dist/EmailOtp.js +11 -4
- package/dist/EmailOtp.js.map +1 -1
- package/dist/EmailVerification.d.ts +2 -2
- package/dist/EmailVerification.d.ts.map +1 -1
- package/dist/EmailVerification.js +2 -3
- package/dist/EmailVerification.js.map +1 -1
- package/dist/HttpApi/Api.d.ts +1363 -19
- package/dist/HttpApi/Api.d.ts.map +1 -1
- package/dist/HttpApi/Api.js +1625 -20
- package/dist/HttpApi/Api.js.map +1 -1
- package/dist/HttpApi/Endpoints.d.ts +682 -0
- package/dist/HttpApi/Endpoints.d.ts.map +1 -1
- package/dist/HttpApi/Endpoints.js +252 -1
- package/dist/HttpApi/Endpoints.js.map +1 -1
- package/dist/HttpApi/Schemas.d.ts +841 -0
- package/dist/HttpApi/Schemas.d.ts.map +1 -1
- package/dist/HttpApi/Schemas.js +513 -1
- package/dist/HttpApi/Schemas.js.map +1 -1
- package/dist/HttpApi/Security.d.ts +13 -1
- package/dist/HttpApi/Security.d.ts.map +1 -1
- package/dist/HttpApi/Security.js +107 -16
- package/dist/HttpApi/Security.js.map +1 -1
- package/dist/HttpApi/Transport.d.ts +36 -2
- package/dist/HttpApi/Transport.d.ts.map +1 -1
- package/dist/HttpApi/Transport.js +151 -9
- package/dist/HttpApi/Transport.js.map +1 -1
- package/dist/Jwt.d.ts +271 -0
- package/dist/Jwt.d.ts.map +1 -0
- package/dist/Jwt.js +512 -0
- package/dist/Jwt.js.map +1 -0
- package/dist/KyselyStorage.d.ts +151 -1
- package/dist/KyselyStorage.d.ts.map +1 -1
- package/dist/KyselyStorage.js +1021 -4
- package/dist/KyselyStorage.js.map +1 -1
- package/dist/LoginApproval.d.ts +314 -0
- package/dist/LoginApproval.d.ts.map +1 -0
- package/dist/LoginApproval.js +551 -0
- package/dist/LoginApproval.js.map +1 -0
- package/dist/LoginNotification.d.ts +183 -0
- package/dist/LoginNotification.d.ts.map +1 -0
- package/dist/LoginNotification.js +329 -0
- package/dist/LoginNotification.js.map +1 -0
- package/dist/LoginRisk.d.ts +73 -0
- package/dist/LoginRisk.d.ts.map +1 -0
- package/dist/LoginRisk.js +57 -0
- package/dist/LoginRisk.js.map +1 -0
- package/dist/MagicLink.d.ts +85 -0
- package/dist/MagicLink.d.ts.map +1 -0
- package/dist/MagicLink.js +206 -0
- package/dist/MagicLink.js.map +1 -0
- package/dist/Mailer.d.ts +33 -2
- package/dist/Mailer.d.ts.map +1 -1
- package/dist/Mailer.js +107 -0
- package/dist/Mailer.js.map +1 -1
- package/dist/OAuth.d.ts +742 -0
- package/dist/OAuth.d.ts.map +1 -0
- package/dist/OAuth.js +1387 -0
- package/dist/OAuth.js.map +1 -0
- package/dist/Passkey.d.ts +334 -0
- package/dist/Passkey.d.ts.map +1 -0
- package/dist/Passkey.js +422 -0
- package/dist/Passkey.js.map +1 -0
- package/dist/Password.d.ts +138 -8
- package/dist/Password.d.ts.map +1 -1
- package/dist/Password.js +397 -8
- package/dist/Password.js.map +1 -1
- package/dist/RecoveryCode.d.ts +169 -0
- package/dist/RecoveryCode.d.ts.map +1 -0
- package/dist/RecoveryCode.js +299 -0
- package/dist/RecoveryCode.js.map +1 -0
- package/dist/RefreshToken.d.ts +222 -0
- package/dist/RefreshToken.d.ts.map +1 -0
- package/dist/RefreshToken.js +342 -0
- package/dist/RefreshToken.js.map +1 -0
- package/dist/Sessions.d.ts +52 -2
- package/dist/Sessions.d.ts.map +1 -1
- package/dist/Sessions.js +123 -1
- package/dist/Sessions.js.map +1 -1
- package/dist/StepUp.d.ts +44 -0
- package/dist/StepUp.d.ts.map +1 -0
- package/dist/StepUp.js +82 -0
- package/dist/StepUp.js.map +1 -0
- package/dist/Storage.d.ts +14 -1
- package/dist/Storage.d.ts.map +1 -1
- package/dist/Storage.js.map +1 -1
- package/dist/StorageMigrations.d.ts +10 -1
- package/dist/StorageMigrations.d.ts.map +1 -1
- package/dist/StorageMigrations.js +179 -0
- package/dist/StorageMigrations.js.map +1 -1
- package/dist/Testing.d.ts +1 -1
- package/dist/Totp.d.ts +220 -0
- package/dist/Totp.d.ts.map +1 -0
- package/dist/Totp.js +477 -0
- package/dist/Totp.js.map +1 -0
- package/dist/TrustedDevice.d.ts +115 -0
- package/dist/TrustedDevice.d.ts.map +1 -0
- package/dist/TrustedDevice.js +222 -0
- package/dist/TrustedDevice.js.map +1 -0
- package/dist/Webhook.d.ts +72 -0
- package/dist/Webhook.d.ts.map +1 -0
- package/dist/Webhook.js +82 -0
- package/dist/Webhook.js.map +1 -0
- package/dist/alchemy/cloudflare/Email.d.ts +25 -0
- package/dist/alchemy/cloudflare/Email.d.ts.map +1 -0
- package/dist/alchemy/cloudflare/Email.js +117 -0
- package/dist/alchemy/cloudflare/Email.js.map +1 -0
- package/dist/cloudflare/Email.d.ts +25 -0
- package/dist/cloudflare/Email.d.ts.map +1 -0
- package/dist/cloudflare/Email.js +153 -0
- package/dist/cloudflare/Email.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -1
- package/migrations/0003_auth_login_approval_review.sql +22 -0
- package/migrations/0004_auth_trusted_device.sql +12 -0
- package/migrations/0005_auth_passkey.sql +17 -0
- package/migrations/0006_auth_totp_factor.sql +17 -0
- package/migrations/0007_auth_recovery_code.sql +13 -0
- package/migrations/0008_auth_api_key.sql +17 -0
- package/migrations/0009_auth_refresh_token.sql +21 -0
- package/migrations/0010_auth_jwt_revocation.sql +8 -0
- package/migrations/0011_auth_oauth_account.sql +16 -0
- package/package.json +65 -1
package/dist/Passkey.js
ADDED
|
@@ -0,0 +1,422 @@
|
|
|
1
|
+
import { Brand, Context, Data, Duration, Effect, Layer, Option, Redacted } from "effect";
|
|
2
|
+
import { Challenge } from "./Challenge.js";
|
|
3
|
+
import { Crypto } from "./Crypto.js";
|
|
4
|
+
import { CredentialId } from "./Identifiers.js";
|
|
5
|
+
import { currentUnixMillis } from "./Internal.js";
|
|
6
|
+
export const PasskeyCredentialId = Brand.nominal();
|
|
7
|
+
export const passkeyRegistrationChallengeType = "passkey-registration";
|
|
8
|
+
export const passkeyAuthenticationChallengeType = "passkey-authentication";
|
|
9
|
+
export const defaultPasskeyChallengeBytes = 32;
|
|
10
|
+
export const defaultPasskeyChallengeTtl = Duration.minutes(5);
|
|
11
|
+
export class PasskeyCredentialStoreError extends Data.TaggedError("PasskeyCredentialStoreError") {
|
|
12
|
+
}
|
|
13
|
+
export class PasskeyCredentialStore extends Context.Service()("auth/PasskeyCredentialStore") {
|
|
14
|
+
}
|
|
15
|
+
(function (PasskeyCredentialStore) {
|
|
16
|
+
PasskeyCredentialStore.make = (service) => PasskeyCredentialStore.of(service);
|
|
17
|
+
})(PasskeyCredentialStore || (PasskeyCredentialStore = {}));
|
|
18
|
+
const cloneCredential = (record) => structuredClone(record);
|
|
19
|
+
export const makePasskeyCredentialStoreMemory = () => {
|
|
20
|
+
const credentials = new Map();
|
|
21
|
+
return PasskeyCredentialStore.make({
|
|
22
|
+
insert: (row) => Effect.sync(() => {
|
|
23
|
+
credentials.set(row.credentialId, cloneCredential(row));
|
|
24
|
+
}),
|
|
25
|
+
findByCredentialId: (credentialId) => Effect.sync(() => {
|
|
26
|
+
const row = credentials.get(credentialId);
|
|
27
|
+
return row === undefined ? Option.none() : Option.some(cloneCredential(row));
|
|
28
|
+
}),
|
|
29
|
+
listByUser: (input) => Effect.sync(() => [...credentials.values()]
|
|
30
|
+
.filter((row) => row.userId === input.userId &&
|
|
31
|
+
(input.includeRevoked === true || row.revokedAt === undefined))
|
|
32
|
+
.map(cloneCredential)),
|
|
33
|
+
updateSignCount: (input) => Effect.sync(() => {
|
|
34
|
+
const row = credentials.get(input.credentialId);
|
|
35
|
+
if (row === undefined || row.revokedAt !== undefined) {
|
|
36
|
+
return Option.none();
|
|
37
|
+
}
|
|
38
|
+
const updated = {
|
|
39
|
+
...row,
|
|
40
|
+
signCount: input.signCount,
|
|
41
|
+
lastUsedAt: input.lastUsedAt,
|
|
42
|
+
metadata: input.metadata ?? row.metadata,
|
|
43
|
+
};
|
|
44
|
+
credentials.set(input.credentialId, updated);
|
|
45
|
+
return Option.some(cloneCredential(updated));
|
|
46
|
+
}),
|
|
47
|
+
revoke: (input) => Effect.sync(() => {
|
|
48
|
+
const row = credentials.get(input.credentialId);
|
|
49
|
+
if (row !== undefined) {
|
|
50
|
+
credentials.set(input.credentialId, {
|
|
51
|
+
...row,
|
|
52
|
+
revokedAt: input.revokedAt,
|
|
53
|
+
metadata: input.reason === undefined
|
|
54
|
+
? row.metadata
|
|
55
|
+
: { ...row.metadata, revokeReason: input.reason },
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}),
|
|
59
|
+
});
|
|
60
|
+
};
|
|
61
|
+
export const PasskeyCredentialStoreMemoryLive = Layer.sync(PasskeyCredentialStore)(makePasskeyCredentialStoreMemory);
|
|
62
|
+
export class PasskeyCredentialManagementError extends Data.TaggedError("PasskeyCredentialManagementError") {
|
|
63
|
+
}
|
|
64
|
+
export class PasskeyCredentialManagement extends Context.Service()("auth/PasskeyCredentialManagement") {
|
|
65
|
+
}
|
|
66
|
+
(function (PasskeyCredentialManagement) {
|
|
67
|
+
PasskeyCredentialManagement.make = (service) => PasskeyCredentialManagement.of(service);
|
|
68
|
+
})(PasskeyCredentialManagement || (PasskeyCredentialManagement = {}));
|
|
69
|
+
const credentialInfo = (credential) => ({
|
|
70
|
+
credentialId: credential.credentialId,
|
|
71
|
+
...(credential.transports === undefined
|
|
72
|
+
? {}
|
|
73
|
+
: { transports: credential.transports }),
|
|
74
|
+
...(credential.backedUp === undefined ? {} : { backedUp: credential.backedUp }),
|
|
75
|
+
createdAt: credential.createdAt,
|
|
76
|
+
...(credential.lastUsedAt === undefined
|
|
77
|
+
? {}
|
|
78
|
+
: { lastUsedAt: credential.lastUsedAt }),
|
|
79
|
+
...(credential.revokedAt === undefined
|
|
80
|
+
? {}
|
|
81
|
+
: { revokedAt: credential.revokedAt }),
|
|
82
|
+
...(credential.metadata === undefined ? {} : { metadata: credential.metadata }),
|
|
83
|
+
});
|
|
84
|
+
const passkeyCredentialManagementError = (operation, message, cause) => new PasskeyCredentialManagementError({
|
|
85
|
+
operation,
|
|
86
|
+
message,
|
|
87
|
+
...(cause === undefined ? {} : { cause }),
|
|
88
|
+
});
|
|
89
|
+
export const makePasskeyCredentialManagement = (dependencies) => PasskeyCredentialManagement.make({
|
|
90
|
+
listForUser: Effect.fn("auth.passkey.credential_management.list")(function* (input) {
|
|
91
|
+
const credentials = yield* dependencies.credentialStore
|
|
92
|
+
.listByUser({
|
|
93
|
+
userId: input.userId,
|
|
94
|
+
...(input.includeRevoked === undefined
|
|
95
|
+
? {}
|
|
96
|
+
: { includeRevoked: input.includeRevoked }),
|
|
97
|
+
})
|
|
98
|
+
.pipe(Effect.mapError((cause) => passkeyCredentialManagementError("list", "Failed to list passkey credentials", cause)));
|
|
99
|
+
return credentials.map(credentialInfo);
|
|
100
|
+
}),
|
|
101
|
+
revokeForUser: Effect.fn("auth.passkey.credential_management.revoke")(function* (input) {
|
|
102
|
+
const credential = yield* dependencies.credentialStore
|
|
103
|
+
.findByCredentialId(input.credentialId)
|
|
104
|
+
.pipe(Effect.mapError((cause) => passkeyCredentialManagementError("revoke", "Failed to load passkey credential", cause)));
|
|
105
|
+
if (Option.isNone(credential) || credential.value.userId !== input.userId) {
|
|
106
|
+
return yield* passkeyCredentialManagementError("revoke", "Passkey credential not found");
|
|
107
|
+
}
|
|
108
|
+
if (credential.value.revokedAt !== undefined) {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const revokedAt = input.revokedAt ?? (yield* currentUnixMillis);
|
|
112
|
+
yield* dependencies.credentialStore
|
|
113
|
+
.revoke({
|
|
114
|
+
credentialId: input.credentialId,
|
|
115
|
+
revokedAt,
|
|
116
|
+
...(input.reason === undefined ? {} : { reason: input.reason }),
|
|
117
|
+
})
|
|
118
|
+
.pipe(Effect.mapError((cause) => passkeyCredentialManagementError("revoke", "Failed to revoke passkey credential", cause)));
|
|
119
|
+
}),
|
|
120
|
+
});
|
|
121
|
+
export const PasskeyCredentialManagementLive = Layer.effect(PasskeyCredentialManagement)(Effect.gen(function* () {
|
|
122
|
+
const credentialStore = yield* PasskeyCredentialStore;
|
|
123
|
+
return makePasskeyCredentialManagement({ credentialStore });
|
|
124
|
+
}));
|
|
125
|
+
export class PasskeyVerifierError extends Data.TaggedError("PasskeyVerifierError") {
|
|
126
|
+
}
|
|
127
|
+
export class PasskeyVerifier extends Context.Service()("auth/PasskeyVerifier") {
|
|
128
|
+
}
|
|
129
|
+
(function (PasskeyVerifier) {
|
|
130
|
+
PasskeyVerifier.make = (service) => PasskeyVerifier.of(service);
|
|
131
|
+
})(PasskeyVerifier || (PasskeyVerifier = {}));
|
|
132
|
+
export class PasskeyVerificationError extends Data.TaggedError("PasskeyVerificationError") {
|
|
133
|
+
}
|
|
134
|
+
export class PasskeyVerification extends Context.Service()("auth/PasskeyVerification") {
|
|
135
|
+
}
|
|
136
|
+
(function (PasskeyVerification) {
|
|
137
|
+
PasskeyVerification.make = (service) => PasskeyVerification.of(service);
|
|
138
|
+
})(PasskeyVerification || (PasskeyVerification = {}));
|
|
139
|
+
export class PasskeyOptionsError extends Data.TaggedError("PasskeyOptionsError") {
|
|
140
|
+
}
|
|
141
|
+
export class PasskeyOptions extends Context.Service()("auth/PasskeyOptions") {
|
|
142
|
+
}
|
|
143
|
+
(function (PasskeyOptions) {
|
|
144
|
+
PasskeyOptions.make = (service) => PasskeyOptions.of(service);
|
|
145
|
+
})(PasskeyOptions || (PasskeyOptions = {}));
|
|
146
|
+
const defaultPubKeyCredParams = [
|
|
147
|
+
{ type: "public-key", alg: -7 },
|
|
148
|
+
{ type: "public-key", alg: -257 },
|
|
149
|
+
];
|
|
150
|
+
const credentialDescriptor = (credential) => ({
|
|
151
|
+
type: "public-key",
|
|
152
|
+
id: credential.credentialId,
|
|
153
|
+
...(credential.transports === undefined
|
|
154
|
+
? {}
|
|
155
|
+
: { transports: credential.transports }),
|
|
156
|
+
});
|
|
157
|
+
const issuePasskeyChallenge = (dependencies, input) => Effect.gen(function* () {
|
|
158
|
+
const secret = Redacted.make(yield* dependencies.crypto.randomToken(input.challengeBytes ?? defaultPasskeyChallengeBytes));
|
|
159
|
+
const issued = yield* dependencies.challenge.issue({
|
|
160
|
+
type: input.type,
|
|
161
|
+
subject: input.subject,
|
|
162
|
+
ttl: input.ttl ?? defaultPasskeyChallengeTtl,
|
|
163
|
+
secret,
|
|
164
|
+
metadata: input.metadata,
|
|
165
|
+
});
|
|
166
|
+
return {
|
|
167
|
+
challengeId: issued.id,
|
|
168
|
+
challenge: Redacted.value(secret),
|
|
169
|
+
expiresAt: issued.expiresAt,
|
|
170
|
+
};
|
|
171
|
+
}).pipe(Effect.mapError((cause) => new PasskeyOptionsError({
|
|
172
|
+
message: "Failed to issue passkey challenge",
|
|
173
|
+
cause,
|
|
174
|
+
})));
|
|
175
|
+
const userCredentials = (credentialStore, userId) => credentialStore === undefined
|
|
176
|
+
? Effect.succeed([])
|
|
177
|
+
: credentialStore.listByUser({ userId }).pipe(Effect.mapError((cause) => new PasskeyOptionsError({
|
|
178
|
+
message: "Failed to load passkey credentials",
|
|
179
|
+
cause,
|
|
180
|
+
})));
|
|
181
|
+
const nonEmptyDescriptors = (descriptors) => descriptors.length === 0 ? undefined : descriptors;
|
|
182
|
+
const passkeyVerificationError = (operation, message, cause) => new PasskeyVerificationError({
|
|
183
|
+
operation,
|
|
184
|
+
message,
|
|
185
|
+
...(cause === undefined ? {} : { cause }),
|
|
186
|
+
});
|
|
187
|
+
const mergeMetadata = (...values) => {
|
|
188
|
+
let merged;
|
|
189
|
+
for (const value of values) {
|
|
190
|
+
if (value === undefined) {
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
merged ??= {};
|
|
194
|
+
Object.assign(merged, value);
|
|
195
|
+
}
|
|
196
|
+
return merged;
|
|
197
|
+
};
|
|
198
|
+
const validateSignCount = (operation, signCount) => Number.isInteger(signCount) && signCount >= 0
|
|
199
|
+
? Effect.succeed(signCount)
|
|
200
|
+
: Effect.fail(passkeyVerificationError(operation, "Invalid passkey sign count"));
|
|
201
|
+
const makeCredentialRecordId = (dependencies, operation) => dependencies.crypto
|
|
202
|
+
.randomToken(dependencies.credentialRecordIdBytes ?? 16)
|
|
203
|
+
.pipe(Effect.map(CredentialId), Effect.mapError((cause) => passkeyVerificationError(operation, "Failed to generate passkey credential record id", cause)));
|
|
204
|
+
const verifyStoredPasskeyChallenge = (dependencies, operation, input) => dependencies.challenge
|
|
205
|
+
.verify({
|
|
206
|
+
challengeId: input.challengeId,
|
|
207
|
+
type: input.type,
|
|
208
|
+
secret: Redacted.make(input.challenge),
|
|
209
|
+
})
|
|
210
|
+
.pipe(Effect.mapError((cause) => passkeyVerificationError(operation, "Invalid passkey challenge", cause)));
|
|
211
|
+
export const makePasskeyVerification = (dependencies) => PasskeyVerification.make({
|
|
212
|
+
finishRegistration: Effect.fn("auth.passkey.finish_registration")(function* (input) {
|
|
213
|
+
const operation = "finish-registration";
|
|
214
|
+
const verified = yield* dependencies.verifier
|
|
215
|
+
.verifyRegistration({
|
|
216
|
+
response: input.response,
|
|
217
|
+
relyingPartyId: input.relyingPartyId,
|
|
218
|
+
expectedOrigin: input.expectedOrigin,
|
|
219
|
+
userId: input.userId,
|
|
220
|
+
...(input.requireUserVerification === undefined
|
|
221
|
+
? {}
|
|
222
|
+
: { requireUserVerification: input.requireUserVerification }),
|
|
223
|
+
...(input.metadata === undefined ? {} : { metadata: input.metadata }),
|
|
224
|
+
})
|
|
225
|
+
.pipe(Effect.mapError((cause) => passkeyVerificationError(operation, "Failed to verify passkey registration response", cause)));
|
|
226
|
+
const signCount = yield* validateSignCount(operation, verified.signCount);
|
|
227
|
+
const existingCredential = yield* dependencies.credentialStore
|
|
228
|
+
.findByCredentialId(verified.credentialId)
|
|
229
|
+
.pipe(Effect.mapError((cause) => passkeyVerificationError(operation, "Failed to load passkey credential", cause)));
|
|
230
|
+
if (Option.isSome(existingCredential)) {
|
|
231
|
+
return yield* passkeyVerificationError(operation, "Passkey credential already exists");
|
|
232
|
+
}
|
|
233
|
+
const challenge = yield* verifyStoredPasskeyChallenge(dependencies, operation, {
|
|
234
|
+
challengeId: input.challengeId,
|
|
235
|
+
type: passkeyRegistrationChallengeType,
|
|
236
|
+
challenge: verified.challenge,
|
|
237
|
+
});
|
|
238
|
+
if (challenge.subject !== input.userId) {
|
|
239
|
+
return yield* passkeyVerificationError(operation, "Passkey registration subject mismatch");
|
|
240
|
+
}
|
|
241
|
+
const now = input.now ?? (yield* currentUnixMillis);
|
|
242
|
+
const credentialMetadata = mergeMetadata(input.metadata, verified.metadata);
|
|
243
|
+
const credential = {
|
|
244
|
+
id: input.recordId ??
|
|
245
|
+
(yield* makeCredentialRecordId(dependencies, operation)),
|
|
246
|
+
userId: input.userId,
|
|
247
|
+
credentialId: verified.credentialId,
|
|
248
|
+
publicKey: verified.publicKey,
|
|
249
|
+
signCount,
|
|
250
|
+
...(verified.transports === undefined
|
|
251
|
+
? {}
|
|
252
|
+
: { transports: verified.transports }),
|
|
253
|
+
...(verified.backedUp === undefined ? {} : { backedUp: verified.backedUp }),
|
|
254
|
+
createdAt: now,
|
|
255
|
+
...(credentialMetadata === undefined
|
|
256
|
+
? {}
|
|
257
|
+
: { metadata: credentialMetadata }),
|
|
258
|
+
};
|
|
259
|
+
yield* dependencies.credentialStore.insert(credential).pipe(Effect.mapError((cause) => passkeyVerificationError(operation, "Failed to store passkey credential", cause)));
|
|
260
|
+
return {
|
|
261
|
+
challengeId: challenge.id,
|
|
262
|
+
userId: input.userId,
|
|
263
|
+
credential,
|
|
264
|
+
};
|
|
265
|
+
}),
|
|
266
|
+
finishAuthentication: Effect.fn("auth.passkey.finish_authentication")(function* (input) {
|
|
267
|
+
const operation = "finish-authentication";
|
|
268
|
+
const credentialId = yield* dependencies.verifier
|
|
269
|
+
.readAuthenticationCredentialId({ response: input.response })
|
|
270
|
+
.pipe(Effect.mapError((cause) => passkeyVerificationError(operation, "Failed to read passkey credential id", cause)));
|
|
271
|
+
const credentialOption = yield* dependencies.credentialStore
|
|
272
|
+
.findByCredentialId(credentialId)
|
|
273
|
+
.pipe(Effect.mapError((cause) => passkeyVerificationError(operation, "Failed to load passkey credential", cause)));
|
|
274
|
+
if (Option.isNone(credentialOption)) {
|
|
275
|
+
return yield* passkeyVerificationError(operation, "Passkey credential not found");
|
|
276
|
+
}
|
|
277
|
+
const credential = credentialOption.value;
|
|
278
|
+
if (credential.revokedAt !== undefined) {
|
|
279
|
+
return yield* passkeyVerificationError(operation, "Passkey credential revoked");
|
|
280
|
+
}
|
|
281
|
+
if (input.userId !== undefined && credential.userId !== input.userId) {
|
|
282
|
+
return yield* passkeyVerificationError(operation, "Passkey credential user mismatch");
|
|
283
|
+
}
|
|
284
|
+
const verified = yield* dependencies.verifier
|
|
285
|
+
.verifyAuthentication({
|
|
286
|
+
response: input.response,
|
|
287
|
+
credential,
|
|
288
|
+
relyingPartyId: input.relyingPartyId,
|
|
289
|
+
expectedOrigin: input.expectedOrigin,
|
|
290
|
+
...(input.requireUserVerification === undefined
|
|
291
|
+
? {}
|
|
292
|
+
: { requireUserVerification: input.requireUserVerification }),
|
|
293
|
+
...(input.metadata === undefined ? {} : { metadata: input.metadata }),
|
|
294
|
+
})
|
|
295
|
+
.pipe(Effect.mapError((cause) => passkeyVerificationError(operation, "Failed to verify passkey authentication response", cause)));
|
|
296
|
+
const signCount = yield* validateSignCount(operation, verified.newSignCount);
|
|
297
|
+
if (verified.credentialId !== credential.credentialId) {
|
|
298
|
+
return yield* passkeyVerificationError(operation, "Passkey authentication credential mismatch");
|
|
299
|
+
}
|
|
300
|
+
const challenge = yield* verifyStoredPasskeyChallenge(dependencies, operation, {
|
|
301
|
+
challengeId: input.challengeId,
|
|
302
|
+
type: passkeyAuthenticationChallengeType,
|
|
303
|
+
challenge: verified.challenge,
|
|
304
|
+
});
|
|
305
|
+
if (input.userId !== undefined
|
|
306
|
+
? challenge.subject !== input.userId
|
|
307
|
+
: challenge.subject !== credential.userId &&
|
|
308
|
+
challenge.subject !== input.relyingPartyId) {
|
|
309
|
+
return yield* passkeyVerificationError(operation, "Passkey authentication subject mismatch");
|
|
310
|
+
}
|
|
311
|
+
const now = input.now ?? (yield* currentUnixMillis);
|
|
312
|
+
const credentialMetadata = mergeMetadata(credential.metadata, input.metadata, verified.metadata);
|
|
313
|
+
const updatedCredential = yield* dependencies.credentialStore
|
|
314
|
+
.updateSignCount({
|
|
315
|
+
credentialId: credential.credentialId,
|
|
316
|
+
signCount,
|
|
317
|
+
lastUsedAt: now,
|
|
318
|
+
...(credentialMetadata === undefined
|
|
319
|
+
? {}
|
|
320
|
+
: { metadata: credentialMetadata }),
|
|
321
|
+
})
|
|
322
|
+
.pipe(Effect.mapError((cause) => passkeyVerificationError(operation, "Failed to update passkey credential", cause)));
|
|
323
|
+
if (Option.isNone(updatedCredential)) {
|
|
324
|
+
return yield* passkeyVerificationError(operation, "Passkey credential unavailable");
|
|
325
|
+
}
|
|
326
|
+
return {
|
|
327
|
+
challengeId: challenge.id,
|
|
328
|
+
userId: updatedCredential.value.userId,
|
|
329
|
+
credential: updatedCredential.value,
|
|
330
|
+
};
|
|
331
|
+
}),
|
|
332
|
+
});
|
|
333
|
+
export const makePasskeyOptions = (dependencies) => PasskeyOptions.make({
|
|
334
|
+
startRegistration: Effect.fn("auth.passkey.start_registration")(function* (input) {
|
|
335
|
+
const credentials = yield* userCredentials(dependencies.credentialStore, input.userId);
|
|
336
|
+
const issued = yield* issuePasskeyChallenge(dependencies, {
|
|
337
|
+
type: passkeyRegistrationChallengeType,
|
|
338
|
+
subject: input.userId,
|
|
339
|
+
ttl: input.ttl,
|
|
340
|
+
challengeBytes: input.challengeBytes,
|
|
341
|
+
metadata: input.metadata,
|
|
342
|
+
});
|
|
343
|
+
const excludeCredentials = input.excludeCredentials ?? credentials.map(credentialDescriptor);
|
|
344
|
+
return {
|
|
345
|
+
challengeId: issued.challengeId,
|
|
346
|
+
expiresAt: issued.expiresAt,
|
|
347
|
+
publicKey: {
|
|
348
|
+
challenge: issued.challenge,
|
|
349
|
+
rp: input.relyingParty,
|
|
350
|
+
user: {
|
|
351
|
+
id: input.userId,
|
|
352
|
+
name: input.userName,
|
|
353
|
+
displayName: input.userDisplayName,
|
|
354
|
+
},
|
|
355
|
+
pubKeyCredParams: input.pubKeyCredParams ?? defaultPubKeyCredParams,
|
|
356
|
+
...(input.timeout === undefined ? {} : { timeout: input.timeout }),
|
|
357
|
+
...(nonEmptyDescriptors(excludeCredentials) === undefined
|
|
358
|
+
? {}
|
|
359
|
+
: { excludeCredentials }),
|
|
360
|
+
...(input.authenticatorSelection === undefined
|
|
361
|
+
? {}
|
|
362
|
+
: { authenticatorSelection: input.authenticatorSelection }),
|
|
363
|
+
...(input.attestation === undefined ? {} : { attestation: input.attestation }),
|
|
364
|
+
},
|
|
365
|
+
};
|
|
366
|
+
}),
|
|
367
|
+
startAuthentication: Effect.fn("auth.passkey.start_authentication")(function* (input) {
|
|
368
|
+
const credentials = input.allowCredentials ??
|
|
369
|
+
(input.userId === undefined
|
|
370
|
+
? []
|
|
371
|
+
: (yield* userCredentials(dependencies.credentialStore, input.userId)).map(credentialDescriptor));
|
|
372
|
+
const issued = yield* issuePasskeyChallenge(dependencies, {
|
|
373
|
+
type: passkeyAuthenticationChallengeType,
|
|
374
|
+
subject: input.userId ?? input.relyingPartyId,
|
|
375
|
+
ttl: input.ttl,
|
|
376
|
+
challengeBytes: input.challengeBytes,
|
|
377
|
+
metadata: input.metadata,
|
|
378
|
+
});
|
|
379
|
+
return {
|
|
380
|
+
challengeId: issued.challengeId,
|
|
381
|
+
expiresAt: issued.expiresAt,
|
|
382
|
+
publicKey: {
|
|
383
|
+
challenge: issued.challenge,
|
|
384
|
+
rpId: input.relyingPartyId,
|
|
385
|
+
...(input.timeout === undefined ? {} : { timeout: input.timeout }),
|
|
386
|
+
...(nonEmptyDescriptors(credentials) === undefined
|
|
387
|
+
? {}
|
|
388
|
+
: { allowCredentials: credentials }),
|
|
389
|
+
...(input.userVerification === undefined
|
|
390
|
+
? {}
|
|
391
|
+
: { userVerification: input.userVerification }),
|
|
392
|
+
},
|
|
393
|
+
};
|
|
394
|
+
}),
|
|
395
|
+
});
|
|
396
|
+
export const PasskeyOptionsLive = Layer.effect(PasskeyOptions)(Effect.gen(function* () {
|
|
397
|
+
const challenge = yield* Challenge;
|
|
398
|
+
const crypto = yield* Crypto;
|
|
399
|
+
const credentialStore = yield* Effect.serviceOption(PasskeyCredentialStore);
|
|
400
|
+
return makePasskeyOptions({
|
|
401
|
+
challenge,
|
|
402
|
+
crypto,
|
|
403
|
+
...(Option.isSome(credentialStore)
|
|
404
|
+
? { credentialStore: credentialStore.value }
|
|
405
|
+
: {}),
|
|
406
|
+
});
|
|
407
|
+
}));
|
|
408
|
+
export const PasskeyVerificationLive = (options) => Layer.effect(PasskeyVerification)(Effect.gen(function* () {
|
|
409
|
+
const challenge = yield* Challenge;
|
|
410
|
+
const crypto = yield* Crypto;
|
|
411
|
+
const credentialStore = yield* PasskeyCredentialStore;
|
|
412
|
+
const verifier = yield* PasskeyVerifier;
|
|
413
|
+
return makePasskeyVerification({
|
|
414
|
+
...options,
|
|
415
|
+
challenge,
|
|
416
|
+
crypto,
|
|
417
|
+
credentialStore,
|
|
418
|
+
verifier,
|
|
419
|
+
});
|
|
420
|
+
}));
|
|
421
|
+
export const PasskeyFeatureLive = PasskeyOptionsLive;
|
|
422
|
+
//# sourceMappingURL=Passkey.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Passkey.js","sourceRoot":"","sources":["../src/Passkey.ts"],"names":[],"mappings":"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"}
|
package/dist/Password.d.ts
CHANGED
|
@@ -1,19 +1,29 @@
|
|
|
1
|
-
import { Context, Effect, Layer, Redacted } from "effect";
|
|
1
|
+
import { Context, Duration, Effect, Layer, Redacted } from "effect";
|
|
2
2
|
import { AuthFlow } from "./AuthFlow.js";
|
|
3
|
-
import type {
|
|
3
|
+
import type { AuthFlowPrimaryFactorError, AuthFlowPrimaryFactorResult, AuthFlowService, AuthResultOf } from "./AuthFlow.js";
|
|
4
|
+
import { Challenge } from "./Challenge.js";
|
|
5
|
+
import type { ChallengeService } from "./Challenge.js";
|
|
4
6
|
import { Crypto } from "./Crypto.js";
|
|
5
7
|
import type { CryptoError, CryptoService } from "./Crypto.js";
|
|
6
|
-
import
|
|
7
|
-
import {
|
|
8
|
-
import type {
|
|
8
|
+
import { Email, UserId } from "./Identifiers.js";
|
|
9
|
+
import type { ChallengeId, UnixMillis } from "./Identifiers.js";
|
|
10
|
+
import type { LoginRequestContext } from "./LoginRisk.js";
|
|
11
|
+
import { AuthMailer } from "./Mailer.js";
|
|
12
|
+
import type { AuthMailerService } from "./Mailer.js";
|
|
13
|
+
import { CredentialStore, SessionStore, UserStore } from "./Storage.js";
|
|
14
|
+
import type { CredentialStoreService, SessionStoreService, StorageError, UserStoreService } from "./Storage.js";
|
|
9
15
|
export interface PasswordSignInInput {
|
|
10
16
|
readonly email: Email;
|
|
11
17
|
readonly password: Redacted.Redacted<string>;
|
|
18
|
+
readonly trustedDeviceToken?: Redacted.Redacted<string>;
|
|
19
|
+
readonly request?: LoginRequestContext;
|
|
20
|
+
readonly metadata?: Readonly<Record<string, unknown>>;
|
|
12
21
|
}
|
|
13
22
|
export interface PasswordSignUpInput {
|
|
14
23
|
readonly email: Email;
|
|
15
24
|
readonly password: Redacted.Redacted<string>;
|
|
16
25
|
readonly emailVerified?: boolean;
|
|
26
|
+
readonly request?: LoginRequestContext;
|
|
17
27
|
readonly metadata?: Readonly<Record<string, unknown>>;
|
|
18
28
|
}
|
|
19
29
|
export type PasswordHashOperation = "hash" | "verify";
|
|
@@ -54,7 +64,7 @@ export interface Pbkdf2PasswordHasherDependencies extends Pbkdf2PasswordHasherOp
|
|
|
54
64
|
}
|
|
55
65
|
export declare const makePbkdf2PasswordHasher: (dependencies: Pbkdf2PasswordHasherDependencies) => PasswordHasherService;
|
|
56
66
|
export declare const Pbkdf2PasswordHasherLive: (options?: Pbkdf2PasswordHasherOptions) => Layer.Layer<PasswordHasher, never, Crypto>;
|
|
57
|
-
export type PasswordSignInError = StorageError | PasswordHashError |
|
|
67
|
+
export type PasswordSignInError = StorageError | PasswordHashError | AuthFlowPrimaryFactorError;
|
|
58
68
|
export type PasswordSignInResult = AuthFlowPrimaryFactorResult<"password"> | AuthResultOf<"InvalidCredentials" | "AccountDisabled">;
|
|
59
69
|
export interface PasswordLoginService {
|
|
60
70
|
readonly signIn: (input: PasswordSignInInput) => Effect.Effect<PasswordSignInResult, PasswordSignInError>;
|
|
@@ -80,7 +90,7 @@ export declare class EmailAlreadyRegisteredError extends EmailAlreadyRegisteredE
|
|
|
80
90
|
readonly email: Email;
|
|
81
91
|
}> {
|
|
82
92
|
}
|
|
83
|
-
export type PasswordSignUpError = EmailAlreadyRegisteredError | StorageError | PasswordHashError | CryptoError |
|
|
93
|
+
export type PasswordSignUpError = EmailAlreadyRegisteredError | StorageError | PasswordHashError | CryptoError | AuthFlowPrimaryFactorError;
|
|
84
94
|
export type PasswordSignUpResult = AuthFlowPrimaryFactorResult<"password">;
|
|
85
95
|
export interface PasswordRegistrationService {
|
|
86
96
|
readonly signUp: (input: PasswordSignUpInput) => Effect.Effect<PasswordSignUpResult, PasswordSignUpError>;
|
|
@@ -102,6 +112,126 @@ export interface PasswordRegistrationDependencies {
|
|
|
102
112
|
}
|
|
103
113
|
export declare const makePasswordRegistration: (dependencies: PasswordRegistrationDependencies) => PasswordRegistrationService;
|
|
104
114
|
export declare const PasswordRegistrationLive: Layer.Layer<PasswordRegistration, never, Crypto | UserStore | CredentialStore | AuthFlow | PasswordHasher>;
|
|
105
|
-
export
|
|
115
|
+
export interface PasswordResetStartInput {
|
|
116
|
+
readonly email: Email;
|
|
117
|
+
readonly secret?: Redacted.Redacted<string>;
|
|
118
|
+
readonly ttl?: Duration.Duration;
|
|
119
|
+
readonly locale?: string;
|
|
120
|
+
readonly metadata?: Readonly<Record<string, unknown>>;
|
|
121
|
+
}
|
|
122
|
+
export interface PasswordResetStarted {
|
|
123
|
+
readonly email: Email;
|
|
124
|
+
readonly expiresAt: UnixMillis;
|
|
125
|
+
}
|
|
126
|
+
export interface PasswordResetVerifyInput {
|
|
127
|
+
readonly challengeId: ChallengeId;
|
|
128
|
+
readonly secret: Redacted.Redacted<string>;
|
|
129
|
+
readonly password: Redacted.Redacted<string>;
|
|
130
|
+
}
|
|
131
|
+
export interface PasswordResetUrlInput extends PasswordResetStarted {
|
|
132
|
+
readonly challengeId: ChallengeId;
|
|
133
|
+
readonly secret: Redacted.Redacted<string>;
|
|
134
|
+
readonly locale?: string;
|
|
135
|
+
readonly metadata?: Readonly<Record<string, unknown>>;
|
|
136
|
+
}
|
|
137
|
+
declare const PasswordResetStartError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
138
|
+
readonly _tag: "PasswordResetStartError";
|
|
139
|
+
} & Readonly<A>;
|
|
140
|
+
export declare class PasswordResetStartError extends PasswordResetStartError_base<{
|
|
141
|
+
readonly message: string;
|
|
142
|
+
readonly cause?: unknown;
|
|
143
|
+
}> {
|
|
144
|
+
}
|
|
145
|
+
declare const PasswordResetVerifyError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
146
|
+
readonly _tag: "PasswordResetVerifyError";
|
|
147
|
+
} & Readonly<A>;
|
|
148
|
+
export declare class PasswordResetVerifyError extends PasswordResetVerifyError_base<{
|
|
149
|
+
readonly message: string;
|
|
150
|
+
readonly cause?: unknown;
|
|
151
|
+
}> {
|
|
152
|
+
}
|
|
153
|
+
export type PasswordResetError = PasswordResetStartError | PasswordResetVerifyError;
|
|
154
|
+
export interface PasswordResetService {
|
|
155
|
+
readonly start: (input: PasswordResetStartInput) => Effect.Effect<PasswordResetStarted, PasswordResetStartError>;
|
|
156
|
+
readonly verify: (input: PasswordResetVerifyInput) => Effect.Effect<void, PasswordResetVerifyError>;
|
|
157
|
+
}
|
|
158
|
+
declare const PasswordReset_base: Context.ServiceClass<PasswordReset, "auth/password/Reset", PasswordResetService>;
|
|
159
|
+
export declare class PasswordReset extends PasswordReset_base {
|
|
160
|
+
}
|
|
161
|
+
export declare namespace PasswordReset {
|
|
162
|
+
const make: (service: PasswordResetService) => PasswordResetService;
|
|
163
|
+
}
|
|
164
|
+
export interface PasswordResetOptions {
|
|
165
|
+
readonly ttl?: Duration.Duration;
|
|
166
|
+
readonly secretBytes?: number;
|
|
167
|
+
readonly credentialIdBytes?: number;
|
|
168
|
+
readonly makeUrl: (input: PasswordResetUrlInput) => string;
|
|
169
|
+
}
|
|
170
|
+
export interface PasswordResetDependencies extends PasswordResetOptions {
|
|
171
|
+
readonly challenge: ChallengeService;
|
|
172
|
+
readonly users: UserStoreService;
|
|
173
|
+
readonly credentials: CredentialStoreService;
|
|
174
|
+
readonly hasher: PasswordHasherService;
|
|
175
|
+
readonly crypto: CryptoService;
|
|
176
|
+
readonly authMailer: AuthMailerService;
|
|
177
|
+
readonly sessionStore: SessionStoreService;
|
|
178
|
+
}
|
|
179
|
+
export interface PasswordResetFeatureOptions extends PasswordResetOptions {
|
|
180
|
+
readonly passwordHasher?: Pbkdf2PasswordHasherOptions;
|
|
181
|
+
}
|
|
182
|
+
export declare const defaultPasswordResetTtl: Duration.Duration;
|
|
183
|
+
export declare const defaultPasswordResetSecretBytes = 32;
|
|
184
|
+
export declare const makePasswordReset: (dependencies: PasswordResetDependencies) => PasswordResetService;
|
|
185
|
+
export declare const PasswordResetLive: (options: PasswordResetOptions) => Layer.Layer<PasswordReset, never, Crypto | UserStore | CredentialStore | SessionStore | AuthMailer | Challenge | PasswordHasher>;
|
|
186
|
+
export declare const PasswordResetFeatureLive: (options: PasswordResetFeatureOptions) => Layer.Layer<PasswordHasher | PasswordReset, never, Crypto | UserStore | CredentialStore | SessionStore | AuthMailer | Challenge>;
|
|
187
|
+
export interface PasswordSetInput {
|
|
188
|
+
readonly userId: UserId;
|
|
189
|
+
readonly password: Redacted.Redacted<string>;
|
|
190
|
+
readonly metadata?: Readonly<Record<string, unknown>>;
|
|
191
|
+
}
|
|
192
|
+
export interface PasswordChangeInput {
|
|
193
|
+
readonly userId: UserId;
|
|
194
|
+
readonly currentPassword: Redacted.Redacted<string>;
|
|
195
|
+
readonly newPassword: Redacted.Redacted<string>;
|
|
196
|
+
}
|
|
197
|
+
export type PasswordSetErrorReason = "password_exists" | "password_revoked" | "internal";
|
|
198
|
+
export type PasswordChangeErrorReason = "password_missing" | "password_revoked" | "invalid_current_password" | "internal";
|
|
199
|
+
declare const PasswordSetError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
200
|
+
readonly _tag: "PasswordSetError";
|
|
201
|
+
} & Readonly<A>;
|
|
202
|
+
export declare class PasswordSetError extends PasswordSetError_base<{
|
|
203
|
+
readonly reason: PasswordSetErrorReason;
|
|
204
|
+
readonly message: string;
|
|
205
|
+
readonly cause?: unknown;
|
|
206
|
+
}> {
|
|
207
|
+
}
|
|
208
|
+
declare const PasswordChangeError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
209
|
+
readonly _tag: "PasswordChangeError";
|
|
210
|
+
} & Readonly<A>;
|
|
211
|
+
export declare class PasswordChangeError extends PasswordChangeError_base<{
|
|
212
|
+
readonly reason: PasswordChangeErrorReason;
|
|
213
|
+
readonly message: string;
|
|
214
|
+
readonly cause?: unknown;
|
|
215
|
+
}> {
|
|
216
|
+
}
|
|
217
|
+
export interface PasswordManagementService {
|
|
218
|
+
readonly set: (input: PasswordSetInput) => Effect.Effect<void, PasswordSetError>;
|
|
219
|
+
readonly change: (input: PasswordChangeInput) => Effect.Effect<void, PasswordChangeError>;
|
|
220
|
+
}
|
|
221
|
+
declare const PasswordManagement_base: Context.ServiceClass<PasswordManagement, "auth/password/Management", PasswordManagementService>;
|
|
222
|
+
export declare class PasswordManagement extends PasswordManagement_base {
|
|
223
|
+
}
|
|
224
|
+
export declare namespace PasswordManagement {
|
|
225
|
+
const make: (service: PasswordManagementService) => PasswordManagementService;
|
|
226
|
+
}
|
|
227
|
+
export interface PasswordManagementDependencies {
|
|
228
|
+
readonly credentials: CredentialStoreService;
|
|
229
|
+
readonly hasher: PasswordHasherService;
|
|
230
|
+
readonly crypto: CryptoService;
|
|
231
|
+
readonly credentialIdBytes?: number;
|
|
232
|
+
}
|
|
233
|
+
export declare const makePasswordManagement: (dependencies: PasswordManagementDependencies) => PasswordManagementService;
|
|
234
|
+
export declare const PasswordManagementLive: Layer.Layer<PasswordManagement, never, Crypto | CredentialStore | PasswordHasher>;
|
|
235
|
+
export declare const PasswordFeatureLive: (options?: Pbkdf2PasswordHasherOptions) => Layer.Layer<PasswordHasher | PasswordLogin | PasswordRegistration | PasswordManagement, never, Crypto | UserStore | CredentialStore | AuthFlow>;
|
|
106
236
|
export {};
|
|
107
237
|
//# sourceMappingURL=Password.d.ts.map
|