@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/Totp.js
ADDED
|
@@ -0,0 +1,477 @@
|
|
|
1
|
+
import { Brand, Context, Data, Effect, Layer, Option, Redacted } from "effect";
|
|
2
|
+
import { Crypto } from "./Crypto.js";
|
|
3
|
+
import { CredentialId } from "./Identifiers.js";
|
|
4
|
+
import { currentUnixMillis } from "./Internal.js";
|
|
5
|
+
export const TotpSecret = Brand.nominal();
|
|
6
|
+
export const defaultTotpAlgorithm = "SHA1";
|
|
7
|
+
export const defaultTotpDigits = 6;
|
|
8
|
+
export const defaultTotpPeriod = 30;
|
|
9
|
+
export const defaultTotpSecretBytes = 20;
|
|
10
|
+
export const defaultTotpWindow = 1;
|
|
11
|
+
export class TotpError extends Data.TaggedError("TotpError") {
|
|
12
|
+
}
|
|
13
|
+
export class Totp extends Context.Service()("auth/Totp") {
|
|
14
|
+
}
|
|
15
|
+
(function (Totp) {
|
|
16
|
+
Totp.make = (service) => Totp.of(service);
|
|
17
|
+
})(Totp || (Totp = {}));
|
|
18
|
+
const textEncoder = new TextEncoder();
|
|
19
|
+
const base32Alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
|
|
20
|
+
const totpError = (operation, message, cause) => new TotpError({
|
|
21
|
+
operation,
|
|
22
|
+
message,
|
|
23
|
+
...(cause === undefined ? {} : { cause }),
|
|
24
|
+
});
|
|
25
|
+
const validateSecretBytes = (bytes, operation) => Number.isInteger(bytes) && bytes >= 10 && bytes <= 128
|
|
26
|
+
? Effect.succeed(bytes)
|
|
27
|
+
: Effect.fail(totpError(operation, "TOTP secret bytes must be an integer between 10 and 128"));
|
|
28
|
+
const validateDigits = (digits, operation) => Number.isInteger(digits) && digits >= 6 && digits <= 10
|
|
29
|
+
? Effect.succeed(digits)
|
|
30
|
+
: Effect.fail(totpError(operation, "TOTP digits must be an integer between 6 and 10"));
|
|
31
|
+
const validatePeriod = (period, operation) => Number.isInteger(period) && period >= 5 && period <= 600
|
|
32
|
+
? Effect.succeed(period)
|
|
33
|
+
: Effect.fail(totpError(operation, "TOTP period must be an integer between 5 and 600 seconds"));
|
|
34
|
+
const validateWindow = (window) => Number.isInteger(window) && window >= 0 && window <= 10
|
|
35
|
+
? Effect.succeed(window)
|
|
36
|
+
: Effect.fail(totpError("verify", "TOTP window must be an integer between 0 and 10"));
|
|
37
|
+
const validateIssuerOrAccount = (value, field) => {
|
|
38
|
+
const trimmed = value.trim();
|
|
39
|
+
return trimmed.length > 0
|
|
40
|
+
? Effect.succeed(trimmed)
|
|
41
|
+
: Effect.fail(totpError("otpauth-uri", `TOTP ${field} must not be empty`));
|
|
42
|
+
};
|
|
43
|
+
const hashName = (algorithm) => {
|
|
44
|
+
switch (algorithm) {
|
|
45
|
+
case "SHA1": {
|
|
46
|
+
return "SHA-1";
|
|
47
|
+
}
|
|
48
|
+
case "SHA256": {
|
|
49
|
+
return "SHA-256";
|
|
50
|
+
}
|
|
51
|
+
case "SHA512": {
|
|
52
|
+
return "SHA-512";
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
const base32Encode = (bytes) => {
|
|
57
|
+
let bits = 0;
|
|
58
|
+
let value = 0;
|
|
59
|
+
let output = "";
|
|
60
|
+
for (const byte of bytes) {
|
|
61
|
+
value = (value << 8) | byte;
|
|
62
|
+
bits += 8;
|
|
63
|
+
while (bits >= 5) {
|
|
64
|
+
output += base32Alphabet[(value >>> (bits - 5)) & 31];
|
|
65
|
+
bits -= 5;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (bits > 0) {
|
|
69
|
+
output += base32Alphabet[(value << (5 - bits)) & 31];
|
|
70
|
+
}
|
|
71
|
+
return TotpSecret(output);
|
|
72
|
+
};
|
|
73
|
+
const normalizeSecretValue = (secret, operation) => {
|
|
74
|
+
const withoutGroups = secret.trim().toUpperCase().replaceAll(/[\s-]/g, "");
|
|
75
|
+
const normalized = withoutGroups.replace(/=+$/, "");
|
|
76
|
+
if (normalized.length === 0) {
|
|
77
|
+
return Effect.fail(totpError(operation, "TOTP secret must not be empty"));
|
|
78
|
+
}
|
|
79
|
+
if (normalized.includes("=") || !/^[A-Z2-7]+$/.test(normalized)) {
|
|
80
|
+
return Effect.fail(totpError(operation, "TOTP secret must be base32"));
|
|
81
|
+
}
|
|
82
|
+
return Effect.succeed(TotpSecret(normalized));
|
|
83
|
+
};
|
|
84
|
+
const base32Decode = (secret, operation) => Effect.gen(function* () {
|
|
85
|
+
const normalized = yield* normalizeSecretValue(secret, operation);
|
|
86
|
+
let bits = 0;
|
|
87
|
+
let value = 0;
|
|
88
|
+
const output = [];
|
|
89
|
+
for (const character of normalized) {
|
|
90
|
+
const index = base32Alphabet.indexOf(character);
|
|
91
|
+
if (index === -1) {
|
|
92
|
+
return yield* totpError(operation, "TOTP secret must be base32");
|
|
93
|
+
}
|
|
94
|
+
value = (value << 5) | index;
|
|
95
|
+
bits += 5;
|
|
96
|
+
if (bits >= 8) {
|
|
97
|
+
output.push((value >>> (bits - 8)) & 255);
|
|
98
|
+
bits -= 8;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return Uint8Array.from(output);
|
|
102
|
+
});
|
|
103
|
+
const counterBytes = (counter) => {
|
|
104
|
+
const bytes = new Uint8Array(8);
|
|
105
|
+
let value = BigInt(counter);
|
|
106
|
+
for (let index = 7; index >= 0; index -= 1) {
|
|
107
|
+
bytes[index] = Number(value & 0xffn);
|
|
108
|
+
value >>= 8n;
|
|
109
|
+
}
|
|
110
|
+
return bytes;
|
|
111
|
+
};
|
|
112
|
+
const getSubtleCrypto = (dependencies, operation) => Effect.try({
|
|
113
|
+
try: () => {
|
|
114
|
+
const webCrypto = dependencies.webCrypto ?? globalThis.crypto;
|
|
115
|
+
if (webCrypto?.subtle === undefined) {
|
|
116
|
+
throw new Error("Web Crypto subtle API is not available");
|
|
117
|
+
}
|
|
118
|
+
return webCrypto.subtle;
|
|
119
|
+
},
|
|
120
|
+
catch: (cause) => totpError(operation, "Failed to access Web Crypto subtle API", cause),
|
|
121
|
+
});
|
|
122
|
+
const generateHotpCode = (dependencies, input, operation) => Effect.gen(function* () {
|
|
123
|
+
const subtle = yield* getSubtleCrypto(dependencies, operation);
|
|
124
|
+
const secretBytes = yield* base32Decode(input.secret, operation);
|
|
125
|
+
const signature = yield* Effect.tryPromise({
|
|
126
|
+
try: async () => {
|
|
127
|
+
const key = await subtle.importKey("raw", secretBytes, { name: "HMAC", hash: hashName(input.algorithm) }, false, ["sign"]);
|
|
128
|
+
return new Uint8Array(await subtle.sign("HMAC", key, counterBytes(input.counter)));
|
|
129
|
+
},
|
|
130
|
+
catch: (cause) => totpError(operation, "Failed to calculate TOTP HMAC", cause),
|
|
131
|
+
});
|
|
132
|
+
const offset = signature.at(-1) & 0x0f;
|
|
133
|
+
const binary = (signature[offset] & 0x7f) * 2 ** 24 +
|
|
134
|
+
signature[offset + 1] * 2 ** 16 +
|
|
135
|
+
signature[offset + 2] * 2 ** 8 +
|
|
136
|
+
signature[offset + 3];
|
|
137
|
+
const modulo = 10 ** input.digits;
|
|
138
|
+
return String(binary % modulo).padStart(input.digits, "0");
|
|
139
|
+
});
|
|
140
|
+
const timeCounter = (now, period) => Math.floor(Number(now) / 1000 / period);
|
|
141
|
+
const normalizeCode = (code) => Redacted.value(code).replaceAll(/\s/g, "");
|
|
142
|
+
export const makeTotp = (dependencies) => Totp.make({
|
|
143
|
+
generateSecret: Effect.fn("auth.totp.generate_secret")(function* (input) {
|
|
144
|
+
const bytes = yield* validateSecretBytes(input?.bytes ?? defaultTotpSecretBytes, "generate-secret");
|
|
145
|
+
const secretBytes = yield* dependencies.crypto.randomBytes(bytes).pipe(Effect.mapError((cause) => totpError("generate-secret", "Failed to generate TOTP secret", cause)));
|
|
146
|
+
return Redacted.make(base32Encode(secretBytes));
|
|
147
|
+
}),
|
|
148
|
+
normalizeSecret: Effect.fn("auth.totp.normalize_secret")(function* (secret) {
|
|
149
|
+
const normalized = yield* normalizeSecretValue(Redacted.value(secret), "normalize-secret");
|
|
150
|
+
return Redacted.make(normalized);
|
|
151
|
+
}),
|
|
152
|
+
otpauthUri: Effect.fn("auth.totp.otpauth_uri")(function* (input) {
|
|
153
|
+
const issuer = yield* validateIssuerOrAccount(input.issuer, "issuer");
|
|
154
|
+
const accountName = yield* validateIssuerOrAccount(input.accountName, "accountName");
|
|
155
|
+
const digits = yield* validateDigits(input.digits ?? defaultTotpDigits, "otpauth-uri");
|
|
156
|
+
const period = yield* validatePeriod(input.period ?? defaultTotpPeriod, "otpauth-uri");
|
|
157
|
+
const algorithm = input.algorithm ?? defaultTotpAlgorithm;
|
|
158
|
+
const secret = yield* normalizeSecretValue(Redacted.value(input.secret), "otpauth-uri");
|
|
159
|
+
const params = new URLSearchParams({
|
|
160
|
+
secret,
|
|
161
|
+
issuer,
|
|
162
|
+
algorithm,
|
|
163
|
+
digits: String(digits),
|
|
164
|
+
period: String(period),
|
|
165
|
+
});
|
|
166
|
+
return Redacted.make(`otpauth://totp/${encodeURIComponent(issuer)}:${encodeURIComponent(accountName)}?${params}`);
|
|
167
|
+
}),
|
|
168
|
+
generateCode: Effect.fn("auth.totp.generate_code")(function* (input) {
|
|
169
|
+
const now = input.now ?? (yield* currentUnixMillis);
|
|
170
|
+
const digits = yield* validateDigits(input.digits ?? defaultTotpDigits, "generate-code");
|
|
171
|
+
const period = yield* validatePeriod(input.period ?? defaultTotpPeriod, "generate-code");
|
|
172
|
+
const secret = yield* normalizeSecretValue(Redacted.value(input.secret), "generate-code");
|
|
173
|
+
const code = yield* generateHotpCode(dependencies, {
|
|
174
|
+
secret,
|
|
175
|
+
counter: timeCounter(now, period),
|
|
176
|
+
algorithm: input.algorithm ?? defaultTotpAlgorithm,
|
|
177
|
+
digits,
|
|
178
|
+
}, "generate-code");
|
|
179
|
+
return Redacted.make(code);
|
|
180
|
+
}),
|
|
181
|
+
verify: Effect.fn("auth.totp.verify")(function* (input) {
|
|
182
|
+
const now = input.now ?? (yield* currentUnixMillis);
|
|
183
|
+
const digits = yield* validateDigits(input.digits ?? defaultTotpDigits, "verify");
|
|
184
|
+
const period = yield* validatePeriod(input.period ?? defaultTotpPeriod, "verify");
|
|
185
|
+
const window = yield* validateWindow(input.window ?? defaultTotpWindow);
|
|
186
|
+
const secret = yield* normalizeSecretValue(Redacted.value(input.secret), "verify");
|
|
187
|
+
const code = normalizeCode(input.code);
|
|
188
|
+
if (!new RegExp(`^\\d{${digits}}$`).test(code)) {
|
|
189
|
+
return { valid: false };
|
|
190
|
+
}
|
|
191
|
+
const counter = timeCounter(now, period);
|
|
192
|
+
const codeBytes = textEncoder.encode(code);
|
|
193
|
+
for (let delta = -window; delta <= window; delta += 1) {
|
|
194
|
+
const candidateCounter = counter + delta;
|
|
195
|
+
if (candidateCounter < 0) {
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
const expected = yield* generateHotpCode(dependencies, {
|
|
199
|
+
secret,
|
|
200
|
+
counter: candidateCounter,
|
|
201
|
+
algorithm: input.algorithm ?? defaultTotpAlgorithm,
|
|
202
|
+
digits,
|
|
203
|
+
}, "verify");
|
|
204
|
+
const valid = yield* dependencies.crypto
|
|
205
|
+
.timingSafeEqual({
|
|
206
|
+
left: codeBytes,
|
|
207
|
+
right: textEncoder.encode(expected),
|
|
208
|
+
})
|
|
209
|
+
.pipe(Effect.mapError((cause) => totpError("verify", "Failed to compare TOTP codes", cause)));
|
|
210
|
+
if (valid) {
|
|
211
|
+
return {
|
|
212
|
+
valid: true,
|
|
213
|
+
delta: Object.is(delta, -0) ? 0 : delta,
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return { valid: false };
|
|
218
|
+
}),
|
|
219
|
+
});
|
|
220
|
+
export const TotpLive = Layer.effect(Totp)(Effect.gen(function* () {
|
|
221
|
+
const crypto = yield* Crypto;
|
|
222
|
+
return makeTotp({ crypto });
|
|
223
|
+
}));
|
|
224
|
+
export class TotpFactorStoreError extends Data.TaggedError("TotpFactorStoreError") {
|
|
225
|
+
}
|
|
226
|
+
export class TotpFactorStore extends Context.Service()("auth/TotpFactorStore") {
|
|
227
|
+
}
|
|
228
|
+
(function (TotpFactorStore) {
|
|
229
|
+
TotpFactorStore.make = (service) => TotpFactorStore.of(service);
|
|
230
|
+
})(TotpFactorStore || (TotpFactorStore = {}));
|
|
231
|
+
const cloneMetadata = (metadata) => metadata === undefined ? undefined : structuredClone(metadata);
|
|
232
|
+
const cloneTotpFactor = (record) => ({
|
|
233
|
+
...record,
|
|
234
|
+
secret: Redacted.make(Redacted.value(record.secret)),
|
|
235
|
+
...(record.metadata === undefined
|
|
236
|
+
? {}
|
|
237
|
+
: { metadata: cloneMetadata(record.metadata) }),
|
|
238
|
+
});
|
|
239
|
+
export const makeTotpFactorStoreMemory = () => {
|
|
240
|
+
const factors = new Map();
|
|
241
|
+
return TotpFactorStore.make({
|
|
242
|
+
insert: (row) => Effect.sync(() => {
|
|
243
|
+
factors.set(row.id, cloneTotpFactor(row));
|
|
244
|
+
}),
|
|
245
|
+
findById: (id) => Effect.sync(() => {
|
|
246
|
+
const row = factors.get(id);
|
|
247
|
+
return row === undefined ? Option.none() : Option.some(cloneTotpFactor(row));
|
|
248
|
+
}),
|
|
249
|
+
listByUser: (input) => Effect.sync(() => [...factors.values()]
|
|
250
|
+
.filter((row) => row.userId === input.userId &&
|
|
251
|
+
(input.includeRevoked === true || row.revokedAt === undefined) &&
|
|
252
|
+
(input.includeUnconfirmed === true || row.confirmedAt !== undefined))
|
|
253
|
+
.map(cloneTotpFactor)),
|
|
254
|
+
confirm: (input) => Effect.sync(() => {
|
|
255
|
+
const row = factors.get(input.id);
|
|
256
|
+
if (row === undefined || row.revokedAt !== undefined) {
|
|
257
|
+
return Option.none();
|
|
258
|
+
}
|
|
259
|
+
const updated = {
|
|
260
|
+
...row,
|
|
261
|
+
confirmedAt: input.confirmedAt,
|
|
262
|
+
metadata: input.metadata ?? row.metadata,
|
|
263
|
+
};
|
|
264
|
+
factors.set(input.id, updated);
|
|
265
|
+
return Option.some(cloneTotpFactor(updated));
|
|
266
|
+
}),
|
|
267
|
+
markUsed: (input) => Effect.sync(() => {
|
|
268
|
+
const row = factors.get(input.id);
|
|
269
|
+
if (row === undefined ||
|
|
270
|
+
row.revokedAt !== undefined ||
|
|
271
|
+
row.confirmedAt === undefined) {
|
|
272
|
+
return Option.none();
|
|
273
|
+
}
|
|
274
|
+
const updated = {
|
|
275
|
+
...row,
|
|
276
|
+
lastUsedAt: input.lastUsedAt,
|
|
277
|
+
metadata: input.metadata ?? row.metadata,
|
|
278
|
+
};
|
|
279
|
+
factors.set(input.id, updated);
|
|
280
|
+
return Option.some(cloneTotpFactor(updated));
|
|
281
|
+
}),
|
|
282
|
+
revoke: (input) => Effect.sync(() => {
|
|
283
|
+
const row = factors.get(input.id);
|
|
284
|
+
if (row !== undefined) {
|
|
285
|
+
factors.set(input.id, {
|
|
286
|
+
...row,
|
|
287
|
+
revokedAt: input.revokedAt,
|
|
288
|
+
metadata: input.reason === undefined
|
|
289
|
+
? row.metadata
|
|
290
|
+
: { ...row.metadata, revokeReason: input.reason },
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
}),
|
|
294
|
+
});
|
|
295
|
+
};
|
|
296
|
+
export const TotpFactorStoreMemoryLive = Layer.sync(TotpFactorStore)(makeTotpFactorStoreMemory);
|
|
297
|
+
export class TotpFactorManagementError extends Data.TaggedError("TotpFactorManagementError") {
|
|
298
|
+
}
|
|
299
|
+
export class TotpFactorManagement extends Context.Service()("auth/TotpFactorManagement") {
|
|
300
|
+
}
|
|
301
|
+
(function (TotpFactorManagement) {
|
|
302
|
+
TotpFactorManagement.make = (service) => TotpFactorManagement.of(service);
|
|
303
|
+
})(TotpFactorManagement || (TotpFactorManagement = {}));
|
|
304
|
+
const totpFactorInfo = (factor) => ({
|
|
305
|
+
id: factor.id,
|
|
306
|
+
algorithm: factor.algorithm,
|
|
307
|
+
digits: factor.digits,
|
|
308
|
+
period: factor.period,
|
|
309
|
+
createdAt: factor.createdAt,
|
|
310
|
+
...(factor.confirmedAt === undefined
|
|
311
|
+
? {}
|
|
312
|
+
: { confirmedAt: factor.confirmedAt }),
|
|
313
|
+
...(factor.lastUsedAt === undefined
|
|
314
|
+
? {}
|
|
315
|
+
: { lastUsedAt: factor.lastUsedAt }),
|
|
316
|
+
...(factor.revokedAt === undefined ? {} : { revokedAt: factor.revokedAt }),
|
|
317
|
+
...(factor.metadata === undefined ? {} : { metadata: factor.metadata }),
|
|
318
|
+
});
|
|
319
|
+
const totpFactorManagementError = (operation, message, cause) => new TotpFactorManagementError({
|
|
320
|
+
operation,
|
|
321
|
+
message,
|
|
322
|
+
...(cause === undefined ? {} : { cause }),
|
|
323
|
+
});
|
|
324
|
+
const makeTotpFactorId = (dependencies, operation) => dependencies.crypto.randomToken(dependencies.factorIdBytes ?? 16).pipe(Effect.map(CredentialId), Effect.mapError((cause) => totpFactorManagementError(operation, "Failed to generate TOTP factor id", cause)));
|
|
325
|
+
const loadOwnedTotpFactor = (dependencies, operation, input) => Effect.gen(function* () {
|
|
326
|
+
const factor = yield* dependencies.factorStore.findById(input.factorId).pipe(Effect.mapError((cause) => totpFactorManagementError(operation, "Failed to load TOTP factor", cause)));
|
|
327
|
+
if (Option.isNone(factor) || factor.value.userId !== input.userId) {
|
|
328
|
+
return yield* totpFactorManagementError(operation, "TOTP factor not found");
|
|
329
|
+
}
|
|
330
|
+
return factor.value;
|
|
331
|
+
});
|
|
332
|
+
const totpVerifyInput = (factor, input) => ({
|
|
333
|
+
secret: factor.secret,
|
|
334
|
+
code: input.code,
|
|
335
|
+
now: input.now,
|
|
336
|
+
algorithm: factor.algorithm,
|
|
337
|
+
digits: factor.digits,
|
|
338
|
+
period: factor.period,
|
|
339
|
+
...(input.window === undefined ? {} : { window: input.window }),
|
|
340
|
+
});
|
|
341
|
+
export const makeTotpFactorManagement = (dependencies) => TotpFactorManagement.make({
|
|
342
|
+
startEnrollment: Effect.fn("auth.totp.factor_management.start_enrollment")(function* (input) {
|
|
343
|
+
const operation = "start-enrollment";
|
|
344
|
+
const now = input.now ?? (yield* currentUnixMillis);
|
|
345
|
+
const algorithm = input.algorithm ?? defaultTotpAlgorithm;
|
|
346
|
+
const digits = input.digits ?? defaultTotpDigits;
|
|
347
|
+
const period = input.period ?? defaultTotpPeriod;
|
|
348
|
+
const secret = yield* (input.secretBytes === undefined
|
|
349
|
+
? dependencies.totp.generateSecret()
|
|
350
|
+
: dependencies.totp.generateSecret({ bytes: input.secretBytes })).pipe(Effect.mapError((cause) => totpFactorManagementError(operation, "Failed to generate TOTP secret", cause)));
|
|
351
|
+
const uri = yield* dependencies.totp
|
|
352
|
+
.otpauthUri({
|
|
353
|
+
secret,
|
|
354
|
+
issuer: input.issuer,
|
|
355
|
+
accountName: input.accountName,
|
|
356
|
+
algorithm,
|
|
357
|
+
digits,
|
|
358
|
+
period,
|
|
359
|
+
})
|
|
360
|
+
.pipe(Effect.mapError((cause) => totpFactorManagementError(operation, "Failed to build TOTP enrollment URI", cause)));
|
|
361
|
+
const factor = {
|
|
362
|
+
id: input.factorId ?? (yield* makeTotpFactorId(dependencies, operation)),
|
|
363
|
+
userId: input.userId,
|
|
364
|
+
secret,
|
|
365
|
+
algorithm,
|
|
366
|
+
digits,
|
|
367
|
+
period,
|
|
368
|
+
createdAt: now,
|
|
369
|
+
...(input.metadata === undefined ? {} : { metadata: input.metadata }),
|
|
370
|
+
};
|
|
371
|
+
yield* dependencies.factorStore.insert(factor).pipe(Effect.mapError((cause) => totpFactorManagementError(operation, "Failed to store TOTP factor", cause)));
|
|
372
|
+
return {
|
|
373
|
+
factor: totpFactorInfo(factor),
|
|
374
|
+
secret,
|
|
375
|
+
uri,
|
|
376
|
+
};
|
|
377
|
+
}),
|
|
378
|
+
confirmEnrollment: Effect.fn("auth.totp.factor_management.confirm_enrollment")(function* (input) {
|
|
379
|
+
const operation = "confirm-enrollment";
|
|
380
|
+
const now = input.now ?? (yield* currentUnixMillis);
|
|
381
|
+
const factor = yield* loadOwnedTotpFactor(dependencies, operation, input);
|
|
382
|
+
if (factor.revokedAt !== undefined) {
|
|
383
|
+
return yield* totpFactorManagementError(operation, "TOTP factor not found");
|
|
384
|
+
}
|
|
385
|
+
if (factor.confirmedAt !== undefined) {
|
|
386
|
+
return yield* totpFactorManagementError(operation, "TOTP factor already confirmed");
|
|
387
|
+
}
|
|
388
|
+
const verified = yield* dependencies.totp
|
|
389
|
+
.verify(totpVerifyInput(factor, { code: input.code, now, window: input.window }))
|
|
390
|
+
.pipe(Effect.mapError((cause) => totpFactorManagementError(operation, "Failed to verify TOTP enrollment code", cause)));
|
|
391
|
+
if (!verified.valid) {
|
|
392
|
+
return yield* totpFactorManagementError(operation, "Invalid TOTP code");
|
|
393
|
+
}
|
|
394
|
+
const confirmed = yield* dependencies.factorStore
|
|
395
|
+
.confirm({
|
|
396
|
+
id: input.factorId,
|
|
397
|
+
confirmedAt: now,
|
|
398
|
+
...(input.metadata === undefined ? {} : { metadata: input.metadata }),
|
|
399
|
+
})
|
|
400
|
+
.pipe(Effect.mapError((cause) => totpFactorManagementError(operation, "Failed to confirm TOTP factor", cause)));
|
|
401
|
+
if (Option.isNone(confirmed)) {
|
|
402
|
+
return yield* totpFactorManagementError(operation, "TOTP factor not found");
|
|
403
|
+
}
|
|
404
|
+
return totpFactorInfo(confirmed.value);
|
|
405
|
+
}),
|
|
406
|
+
verifyForUser: Effect.fn("auth.totp.factor_management.verify")(function* (input) {
|
|
407
|
+
const operation = "verify";
|
|
408
|
+
const now = input.now ?? (yield* currentUnixMillis);
|
|
409
|
+
const factors = yield* dependencies.factorStore
|
|
410
|
+
.listByUser({ userId: input.userId })
|
|
411
|
+
.pipe(Effect.mapError((cause) => totpFactorManagementError(operation, "Failed to list TOTP factors", cause)));
|
|
412
|
+
for (const factor of factors) {
|
|
413
|
+
const verified = yield* dependencies.totp
|
|
414
|
+
.verify(totpVerifyInput(factor, {
|
|
415
|
+
code: input.code,
|
|
416
|
+
now,
|
|
417
|
+
window: input.window,
|
|
418
|
+
}))
|
|
419
|
+
.pipe(Effect.mapError((cause) => totpFactorManagementError(operation, "Failed to verify TOTP code", cause)));
|
|
420
|
+
if (!verified.valid) {
|
|
421
|
+
continue;
|
|
422
|
+
}
|
|
423
|
+
const updated = yield* dependencies.factorStore
|
|
424
|
+
.markUsed({
|
|
425
|
+
id: factor.id,
|
|
426
|
+
lastUsedAt: now,
|
|
427
|
+
...(input.metadata === undefined ? {} : { metadata: input.metadata }),
|
|
428
|
+
})
|
|
429
|
+
.pipe(Effect.mapError((cause) => totpFactorManagementError(operation, "Failed to mark TOTP factor as used", cause)));
|
|
430
|
+
if (Option.isNone(updated)) {
|
|
431
|
+
return yield* totpFactorManagementError(operation, "TOTP factor not found");
|
|
432
|
+
}
|
|
433
|
+
return {
|
|
434
|
+
valid: true,
|
|
435
|
+
factor: totpFactorInfo(updated.value),
|
|
436
|
+
...(verified.delta === undefined ? {} : { delta: verified.delta }),
|
|
437
|
+
};
|
|
438
|
+
}
|
|
439
|
+
return { valid: false };
|
|
440
|
+
}),
|
|
441
|
+
listForUser: Effect.fn("auth.totp.factor_management.list")(function* (input) {
|
|
442
|
+
const factors = yield* dependencies.factorStore
|
|
443
|
+
.listByUser({
|
|
444
|
+
userId: input.userId,
|
|
445
|
+
...(input.includeRevoked === undefined
|
|
446
|
+
? {}
|
|
447
|
+
: { includeRevoked: input.includeRevoked }),
|
|
448
|
+
...(input.includeUnconfirmed === undefined
|
|
449
|
+
? {}
|
|
450
|
+
: { includeUnconfirmed: input.includeUnconfirmed }),
|
|
451
|
+
})
|
|
452
|
+
.pipe(Effect.mapError((cause) => totpFactorManagementError("list", "Failed to list TOTP factors", cause)));
|
|
453
|
+
return factors.map(totpFactorInfo);
|
|
454
|
+
}),
|
|
455
|
+
revokeForUser: Effect.fn("auth.totp.factor_management.revoke")(function* (input) {
|
|
456
|
+
const operation = "revoke";
|
|
457
|
+
const factor = yield* loadOwnedTotpFactor(dependencies, operation, input);
|
|
458
|
+
if (factor.revokedAt !== undefined) {
|
|
459
|
+
return;
|
|
460
|
+
}
|
|
461
|
+
const revokedAt = input.revokedAt ?? (yield* currentUnixMillis);
|
|
462
|
+
yield* dependencies.factorStore
|
|
463
|
+
.revoke({
|
|
464
|
+
id: input.factorId,
|
|
465
|
+
revokedAt,
|
|
466
|
+
...(input.reason === undefined ? {} : { reason: input.reason }),
|
|
467
|
+
})
|
|
468
|
+
.pipe(Effect.mapError((cause) => totpFactorManagementError(operation, "Failed to revoke TOTP factor", cause)));
|
|
469
|
+
}),
|
|
470
|
+
});
|
|
471
|
+
export const TotpFactorManagementLive = Layer.effect(TotpFactorManagement)(Effect.gen(function* () {
|
|
472
|
+
const totp = yield* Totp;
|
|
473
|
+
const crypto = yield* Crypto;
|
|
474
|
+
const factorStore = yield* TotpFactorStore;
|
|
475
|
+
return makeTotpFactorManagement({ totp, crypto, factorStore });
|
|
476
|
+
}));
|
|
477
|
+
//# sourceMappingURL=Totp.js.map
|
package/dist/Totp.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Totp.js","sourceRoot":"","sources":["../src/Totp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { Context, Duration, Effect, Layer, Redacted } from "effect";
|
|
2
|
+
import type * as OptionTypes from "effect/Option";
|
|
3
|
+
import { AuthSecrets } from "./AuthConfig.js";
|
|
4
|
+
import { Crypto } from "./Crypto.js";
|
|
5
|
+
import type { CryptoKey, CryptoService } from "./Crypto.js";
|
|
6
|
+
import type { UnixMillis, UserId } from "./Identifiers.js";
|
|
7
|
+
import type { LoginDeviceContext } from "./LoginApproval.js";
|
|
8
|
+
import type { SessionCookieSameSite } from "./Sessions.js";
|
|
9
|
+
export interface TrustedDeviceStatusInput {
|
|
10
|
+
readonly userId: UserId;
|
|
11
|
+
readonly token?: Redacted.Redacted<string>;
|
|
12
|
+
}
|
|
13
|
+
export interface TrustedDeviceTrustInput {
|
|
14
|
+
readonly userId: UserId;
|
|
15
|
+
readonly token?: Redacted.Redacted<string>;
|
|
16
|
+
readonly ttl?: Duration.Duration;
|
|
17
|
+
readonly metadata?: Readonly<Record<string, unknown>>;
|
|
18
|
+
}
|
|
19
|
+
export interface TrustedDeviceToken {
|
|
20
|
+
readonly userId: UserId;
|
|
21
|
+
readonly token: Redacted.Redacted<string>;
|
|
22
|
+
readonly expiresAt: UnixMillis;
|
|
23
|
+
}
|
|
24
|
+
export interface TrustedDeviceRecord {
|
|
25
|
+
readonly userId: UserId;
|
|
26
|
+
readonly tokenHash: string;
|
|
27
|
+
readonly createdAt: UnixMillis;
|
|
28
|
+
readonly lastSeenAt: UnixMillis;
|
|
29
|
+
readonly expiresAt: UnixMillis;
|
|
30
|
+
readonly metadata?: Readonly<Record<string, unknown>>;
|
|
31
|
+
}
|
|
32
|
+
export interface TrustedDeviceStoreFindInput {
|
|
33
|
+
readonly userId: UserId;
|
|
34
|
+
readonly tokenHash: string;
|
|
35
|
+
readonly now: UnixMillis;
|
|
36
|
+
}
|
|
37
|
+
export interface TrustedDeviceStoreUpsertInput {
|
|
38
|
+
readonly userId: UserId;
|
|
39
|
+
readonly tokenHash: string;
|
|
40
|
+
readonly now: UnixMillis;
|
|
41
|
+
readonly expiresAt: UnixMillis;
|
|
42
|
+
readonly metadata?: Readonly<Record<string, unknown>>;
|
|
43
|
+
}
|
|
44
|
+
export type TrustedDeviceErrorOperation = "status" | "trust" | "cookie";
|
|
45
|
+
declare const TrustedDeviceError_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 & {
|
|
46
|
+
readonly _tag: "TrustedDeviceError";
|
|
47
|
+
} & Readonly<A>;
|
|
48
|
+
export declare class TrustedDeviceError extends TrustedDeviceError_base<{
|
|
49
|
+
readonly operation: TrustedDeviceErrorOperation;
|
|
50
|
+
readonly message: string;
|
|
51
|
+
readonly cause?: unknown;
|
|
52
|
+
}> {
|
|
53
|
+
}
|
|
54
|
+
export interface TrustedDeviceStoreService {
|
|
55
|
+
readonly find: (input: TrustedDeviceStoreFindInput) => Effect.Effect<OptionTypes.Option<TrustedDeviceRecord>, TrustedDeviceError>;
|
|
56
|
+
readonly upsert: (input: TrustedDeviceStoreUpsertInput) => Effect.Effect<TrustedDeviceRecord, TrustedDeviceError>;
|
|
57
|
+
}
|
|
58
|
+
declare const TrustedDeviceStore_base: Context.ServiceClass<TrustedDeviceStore, "auth/TrustedDeviceStore", TrustedDeviceStoreService>;
|
|
59
|
+
export declare class TrustedDeviceStore extends TrustedDeviceStore_base {
|
|
60
|
+
}
|
|
61
|
+
export declare namespace TrustedDeviceStore {
|
|
62
|
+
const make: (service: TrustedDeviceStoreService) => TrustedDeviceStoreService;
|
|
63
|
+
}
|
|
64
|
+
export interface TrustedDeviceService {
|
|
65
|
+
readonly status: (input: TrustedDeviceStatusInput) => Effect.Effect<LoginDeviceContext, TrustedDeviceError>;
|
|
66
|
+
readonly trust: (input: TrustedDeviceTrustInput) => Effect.Effect<TrustedDeviceToken, TrustedDeviceError>;
|
|
67
|
+
}
|
|
68
|
+
declare const TrustedDevice_base: Context.ServiceClass<TrustedDevice, "auth/TrustedDevice", TrustedDeviceService>;
|
|
69
|
+
export declare class TrustedDevice extends TrustedDevice_base {
|
|
70
|
+
}
|
|
71
|
+
export declare namespace TrustedDevice {
|
|
72
|
+
const make: (service: TrustedDeviceService) => TrustedDeviceService;
|
|
73
|
+
}
|
|
74
|
+
export interface TrustedDeviceCookieCommitInput {
|
|
75
|
+
readonly token: TrustedDeviceToken;
|
|
76
|
+
}
|
|
77
|
+
export interface TrustedDeviceCookieService {
|
|
78
|
+
readonly read: (request: Request) => Effect.Effect<OptionTypes.Option<Redacted.Redacted<string>>, TrustedDeviceError>;
|
|
79
|
+
readonly commit: (input: TrustedDeviceCookieCommitInput) => Effect.Effect<string, TrustedDeviceError>;
|
|
80
|
+
readonly clear: Effect.Effect<string, TrustedDeviceError>;
|
|
81
|
+
}
|
|
82
|
+
declare const TrustedDeviceCookie_base: Context.ServiceClass<TrustedDeviceCookie, "auth/TrustedDeviceCookie", TrustedDeviceCookieService>;
|
|
83
|
+
export declare class TrustedDeviceCookie extends TrustedDeviceCookie_base {
|
|
84
|
+
}
|
|
85
|
+
export declare namespace TrustedDeviceCookie {
|
|
86
|
+
const make: (service: TrustedDeviceCookieService) => TrustedDeviceCookieService;
|
|
87
|
+
}
|
|
88
|
+
export interface TrustedDeviceOptions {
|
|
89
|
+
readonly secret: CryptoKey;
|
|
90
|
+
readonly ttl?: Duration.Duration;
|
|
91
|
+
readonly tokenBytes?: number;
|
|
92
|
+
}
|
|
93
|
+
export interface TrustedDeviceDependencies extends TrustedDeviceOptions {
|
|
94
|
+
readonly crypto: CryptoService;
|
|
95
|
+
readonly store: TrustedDeviceStoreService;
|
|
96
|
+
}
|
|
97
|
+
export interface TrustedDeviceCookieOptions {
|
|
98
|
+
readonly name?: string;
|
|
99
|
+
readonly secure?: boolean;
|
|
100
|
+
readonly httpOnly?: boolean;
|
|
101
|
+
readonly sameSite?: SessionCookieSameSite;
|
|
102
|
+
readonly path?: string;
|
|
103
|
+
readonly domain?: string;
|
|
104
|
+
}
|
|
105
|
+
export declare const defaultTrustedDeviceTtl: Duration.Duration;
|
|
106
|
+
export declare const defaultTrustedDeviceTokenBytes = 32;
|
|
107
|
+
export declare const makeTrustedDeviceStoreMemory: () => TrustedDeviceStoreService;
|
|
108
|
+
export declare const TrustedDeviceStoreMemoryLive: Layer.Layer<TrustedDeviceStore, never, never>;
|
|
109
|
+
export declare const makeTrustedDevice: (dependencies: TrustedDeviceDependencies) => TrustedDeviceService;
|
|
110
|
+
export declare function TrustedDeviceLive(options: TrustedDeviceOptions): Layer.Layer<TrustedDevice, never, Crypto | TrustedDeviceStore>;
|
|
111
|
+
export declare function TrustedDeviceLive(): Layer.Layer<TrustedDevice, never, Crypto | TrustedDeviceStore | AuthSecrets>;
|
|
112
|
+
export declare const makeTrustedDeviceCookie: (options?: TrustedDeviceCookieOptions) => TrustedDeviceCookieService;
|
|
113
|
+
export declare const TrustedDeviceCookieLive: (options?: TrustedDeviceCookieOptions) => Layer.Layer<TrustedDeviceCookie, never, never>;
|
|
114
|
+
export {};
|
|
115
|
+
//# sourceMappingURL=TrustedDevice.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TrustedDevice.d.ts","sourceRoot":"","sources":["../src/TrustedDevice.ts"],"names":[],"mappings":"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"}
|