@robelest/convex-auth 0.0.4-preview.13 → 0.0.4-preview.16
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 +140 -9
- package/dist/bin.cjs +5957 -5478
- package/dist/client/index.d.ts +3 -7
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +27 -26
- package/dist/client/index.js.map +1 -1
- package/dist/component/_generated/api.d.ts +14 -0
- package/dist/component/_generated/api.d.ts.map +1 -1
- package/dist/component/_generated/api.js.map +1 -1
- package/dist/component/_generated/component.d.ts +1672 -24
- package/dist/component/_generated/component.d.ts.map +1 -1
- package/dist/component/convex.config.d.ts +2 -2
- package/dist/component/convex.config.d.ts.map +1 -1
- package/dist/component/index.d.ts +1 -1
- package/dist/component/index.js +2 -2
- package/dist/component/model.d.ts +153 -0
- package/dist/component/model.d.ts.map +1 -0
- package/dist/component/model.js +343 -0
- package/dist/component/model.js.map +1 -0
- package/dist/component/providers/sso.d.ts +1 -1
- package/dist/component/public/enterprise.d.ts +54 -0
- package/dist/component/public/enterprise.d.ts.map +1 -0
- package/dist/component/public/enterprise.js +515 -0
- package/dist/component/public/enterprise.js.map +1 -0
- package/dist/component/public/factors.d.ts +52 -0
- package/dist/component/public/factors.d.ts.map +1 -0
- package/dist/component/public/factors.js +285 -0
- package/dist/component/public/factors.js.map +1 -0
- package/dist/component/public/groups.d.ts +116 -0
- package/dist/component/public/groups.d.ts.map +1 -0
- package/dist/component/public/groups.js +596 -0
- package/dist/component/public/groups.js.map +1 -0
- package/dist/component/public/identity.d.ts +93 -0
- package/dist/component/public/identity.d.ts.map +1 -0
- package/dist/component/public/identity.js +426 -0
- package/dist/component/public/identity.js.map +1 -0
- package/dist/component/public/keys.d.ts +41 -0
- package/dist/component/public/keys.d.ts.map +1 -0
- package/dist/component/public/keys.js +157 -0
- package/dist/component/public/keys.js.map +1 -0
- package/dist/component/public/shared.d.ts +26 -0
- package/dist/component/public/shared.d.ts.map +1 -0
- package/dist/component/public/shared.js +32 -0
- package/dist/component/public/shared.js.map +1 -0
- package/dist/component/public.d.ts +9 -321
- package/dist/component/public.d.ts.map +1 -1
- package/dist/component/public.js +6 -2145
- package/dist/component/schema.d.ts +406 -260
- package/dist/component/schema.js +37 -32
- package/dist/component/schema.js.map +1 -1
- package/dist/component/server/auth.d.ts +161 -15
- package/dist/component/server/auth.d.ts.map +1 -1
- package/dist/component/server/auth.js +100 -7
- package/dist/component/server/auth.js.map +1 -1
- package/dist/component/server/cookies.js +3 -0
- package/dist/component/server/cookies.js.map +1 -1
- package/dist/component/server/db.js +1 -0
- package/dist/component/server/db.js.map +1 -1
- package/dist/component/server/device.js +3 -1
- package/dist/component/server/device.js.map +1 -1
- package/dist/component/server/domains/core.js +629 -0
- package/dist/component/server/domains/core.js.map +1 -0
- package/dist/component/server/domains/sso.js +884 -0
- package/dist/component/server/domains/sso.js.map +1 -0
- package/dist/component/server/factory.d.ts +136 -0
- package/dist/component/server/factory.d.ts.map +1 -0
- package/dist/component/server/factory.js +1134 -0
- package/dist/component/server/factory.js.map +1 -0
- package/dist/component/server/fx.js +2 -1
- package/dist/component/server/fx.js.map +1 -1
- package/dist/component/server/http.js +287 -0
- package/dist/component/server/http.js.map +1 -0
- package/dist/component/server/identity.js +13 -0
- package/dist/component/server/identity.js.map +1 -0
- package/dist/component/server/keys.js +4 -0
- package/dist/component/server/keys.js.map +1 -1
- package/dist/component/server/mutations/account.js +1 -1
- package/dist/component/server/mutations/index.js +2 -2
- package/dist/component/server/mutations/index.js.map +1 -1
- package/dist/component/server/mutations/invalidate.js +1 -1
- package/dist/component/server/mutations/oauth.js +10 -7
- package/dist/component/server/mutations/oauth.js.map +1 -1
- package/dist/component/server/mutations/refresh.js +1 -1
- package/dist/component/server/mutations/register.js +1 -1
- package/dist/component/server/mutations/retrieve.js +1 -1
- package/dist/component/server/mutations/signature.js +1 -1
- package/dist/component/server/mutations/store.js +6 -3
- package/dist/component/server/mutations/store.js.map +1 -1
- package/dist/component/server/mutations/verify.js +1 -1
- package/dist/component/server/oauth.js +3 -0
- package/dist/component/server/oauth.js.map +1 -1
- package/dist/component/server/passkey.js +3 -2
- package/dist/component/server/passkey.js.map +1 -1
- package/dist/component/server/provider.js +2 -0
- package/dist/component/server/provider.js.map +1 -1
- package/dist/component/server/providers.js +10 -0
- package/dist/component/server/providers.js.map +1 -1
- package/dist/component/server/ratelimit.js +3 -0
- package/dist/component/server/ratelimit.js.map +1 -1
- package/dist/component/server/redirects.js +2 -0
- package/dist/component/server/redirects.js.map +1 -1
- package/dist/component/server/refresh.js +5 -0
- package/dist/component/server/refresh.js.map +1 -1
- package/dist/component/server/sessions.js +5 -0
- package/dist/component/server/sessions.js.map +1 -1
- package/dist/component/server/signin.js +2 -1
- package/dist/component/server/signin.js.map +1 -1
- package/dist/component/server/sso.js +166 -19
- package/dist/component/server/sso.js.map +1 -1
- package/dist/component/server/tokens.js +1 -0
- package/dist/component/server/tokens.js.map +1 -1
- package/dist/component/server/totp.js +4 -2
- package/dist/component/server/totp.js.map +1 -1
- package/dist/component/server/types.d.ts +106 -38
- package/dist/component/server/types.d.ts.map +1 -1
- package/dist/component/server/types.js.map +1 -1
- package/dist/component/server/users.js +1 -0
- package/dist/component/server/users.js.map +1 -1
- package/dist/component/server/utils.js +44 -2
- package/dist/component/server/utils.js.map +1 -1
- package/dist/providers/anonymous.d.ts +1 -1
- package/dist/providers/credentials.d.ts +1 -1
- package/dist/providers/password.d.ts +1 -1
- package/dist/providers/sso.d.ts +1 -1
- package/dist/providers/sso.js.map +1 -1
- package/dist/server/auth.d.ts +163 -17
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +100 -7
- package/dist/server/auth.js.map +1 -1
- package/dist/server/cookies.d.ts +1 -38
- package/dist/server/cookies.js +3 -0
- package/dist/server/cookies.js.map +1 -1
- package/dist/server/db.d.ts +1 -125
- package/dist/server/db.js +1 -0
- package/dist/server/db.js.map +1 -1
- package/dist/server/device.d.ts +1 -24
- package/dist/server/device.js +3 -1
- package/dist/server/device.js.map +1 -1
- package/dist/server/domains/core.d.ts +434 -0
- package/dist/server/domains/core.d.ts.map +1 -0
- package/dist/server/domains/core.js +629 -0
- package/dist/server/domains/core.js.map +1 -0
- package/dist/server/domains/sso.d.ts +409 -0
- package/dist/server/domains/sso.d.ts.map +1 -0
- package/dist/server/domains/sso.js +884 -0
- package/dist/server/domains/sso.js.map +1 -0
- package/dist/server/enterpriseValidators.d.ts +1 -0
- package/dist/server/enterpriseValidators.js +60 -0
- package/dist/server/enterpriseValidators.js.map +1 -0
- package/dist/server/factory.d.ts +136 -0
- package/dist/server/factory.d.ts.map +1 -0
- package/dist/server/factory.js +1134 -0
- package/dist/server/factory.js.map +1 -0
- package/dist/server/fx.d.ts +1 -16
- package/dist/server/fx.d.ts.map +1 -1
- package/dist/server/fx.js +1 -0
- package/dist/server/fx.js.map +1 -1
- package/dist/server/http.d.ts +59 -0
- package/dist/server/http.d.ts.map +1 -0
- package/dist/server/http.js +287 -0
- package/dist/server/http.js.map +1 -0
- package/dist/server/identity.d.ts +1 -0
- package/dist/server/identity.js +13 -0
- package/dist/server/identity.js.map +1 -0
- package/dist/server/index.d.ts +468 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +530 -36
- package/dist/server/index.js.map +1 -1
- package/dist/server/keys.d.ts +1 -57
- package/dist/server/keys.js +4 -0
- package/dist/server/keys.js.map +1 -1
- package/dist/server/mutations/account.d.ts +7 -7
- package/dist/server/mutations/account.d.ts.map +1 -1
- package/dist/server/mutations/code.d.ts +13 -13
- package/dist/server/mutations/code.d.ts.map +1 -1
- package/dist/server/mutations/index.d.ts +107 -107
- package/dist/server/mutations/index.d.ts.map +1 -1
- package/dist/server/mutations/index.js +1 -1
- package/dist/server/mutations/index.js.map +1 -1
- package/dist/server/mutations/invalidate.d.ts +5 -5
- package/dist/server/mutations/invalidate.d.ts.map +1 -1
- package/dist/server/mutations/oauth.d.ts +10 -10
- package/dist/server/mutations/oauth.d.ts.map +1 -1
- package/dist/server/mutations/oauth.js +9 -6
- package/dist/server/mutations/oauth.js.map +1 -1
- package/dist/server/mutations/refresh.d.ts +4 -4
- package/dist/server/mutations/register.d.ts +12 -12
- package/dist/server/mutations/register.d.ts.map +1 -1
- package/dist/server/mutations/retrieve.d.ts +7 -7
- package/dist/server/mutations/signature.d.ts +5 -5
- package/dist/server/mutations/signin.d.ts +6 -6
- package/dist/server/mutations/signin.d.ts.map +1 -1
- package/dist/server/mutations/signout.d.ts +1 -1
- package/dist/server/mutations/store.d.ts +3 -2
- package/dist/server/mutations/store.d.ts.map +1 -1
- package/dist/server/mutations/store.js +6 -3
- package/dist/server/mutations/store.js.map +1 -1
- package/dist/server/mutations/verifier.d.ts +1 -1
- package/dist/server/mutations/verify.d.ts +11 -11
- package/dist/server/mutations/verify.d.ts.map +1 -1
- package/dist/server/oauth.d.ts +1 -59
- package/dist/server/oauth.js +3 -0
- package/dist/server/oauth.js.map +1 -1
- package/dist/server/passkey.d.ts.map +1 -1
- package/dist/server/passkey.js +3 -2
- package/dist/server/passkey.js.map +1 -1
- package/dist/server/provider.d.ts +1 -14
- package/dist/server/provider.d.ts.map +1 -1
- package/dist/server/provider.js +2 -0
- package/dist/server/provider.js.map +1 -1
- package/dist/server/providers.js +10 -0
- package/dist/server/providers.js.map +1 -1
- package/dist/server/ratelimit.d.ts +1 -22
- package/dist/server/ratelimit.js +3 -0
- package/dist/server/ratelimit.js.map +1 -1
- package/dist/server/redirects.d.ts +1 -10
- package/dist/server/redirects.js +2 -0
- package/dist/server/redirects.js.map +1 -1
- package/dist/server/refresh.d.ts +1 -37
- package/dist/server/refresh.js +5 -0
- package/dist/server/refresh.js.map +1 -1
- package/dist/server/sessions.d.ts +1 -28
- package/dist/server/sessions.js +5 -0
- package/dist/server/sessions.js.map +1 -1
- package/dist/server/signin.d.ts +1 -55
- package/dist/server/signin.js +2 -1
- package/dist/server/signin.js.map +1 -1
- package/dist/server/sso.d.ts +1 -348
- package/dist/server/sso.js +165 -18
- package/dist/server/sso.js.map +1 -1
- package/dist/server/templates.d.ts +1 -21
- package/dist/server/templates.js +1 -0
- package/dist/server/templates.js.map +1 -1
- package/dist/server/tokens.d.ts +1 -11
- package/dist/server/tokens.js +1 -0
- package/dist/server/tokens.js.map +1 -1
- package/dist/server/totp.d.ts +1 -23
- package/dist/server/totp.js +4 -2
- package/dist/server/totp.js.map +1 -1
- package/dist/server/types.d.ts +114 -77
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/types.js.map +1 -1
- package/dist/server/users.d.ts +1 -31
- package/dist/server/users.js +1 -0
- package/dist/server/users.js.map +1 -1
- package/dist/server/utils.d.ts +1 -27
- package/dist/server/utils.js +44 -2
- package/dist/server/utils.js.map +1 -1
- package/dist/server/version.d.ts +1 -1
- package/dist/server/version.js +1 -1
- package/dist/server/version.js.map +1 -1
- package/package.json +4 -5
- package/src/cli/bin.ts +5 -0
- package/src/cli/index.ts +22 -9
- package/src/cli/keys.ts +3 -0
- package/src/client/index.ts +36 -37
- package/src/component/_generated/api.ts +14 -0
- package/src/component/_generated/component.ts +2106 -9
- package/src/component/index.ts +3 -1
- package/src/component/model.ts +441 -0
- package/src/component/public/enterprise.ts +753 -0
- package/src/component/public/factors.ts +332 -0
- package/src/component/public/groups.ts +932 -0
- package/src/component/public/identity.ts +566 -0
- package/src/component/public/keys.ts +209 -0
- package/src/component/public/shared.ts +119 -0
- package/src/component/public.ts +5 -2965
- package/src/component/schema.ts +68 -63
- package/src/providers/sso.ts +1 -1
- package/src/server/auth.ts +413 -18
- package/src/server/cookies.ts +3 -0
- package/src/server/db.ts +3 -0
- package/src/server/device.ts +3 -1
- package/src/server/domains/core.ts +1071 -0
- package/src/server/domains/sso.ts +1749 -0
- package/src/server/enterpriseValidators.ts +93 -0
- package/src/server/factory.ts +2181 -0
- package/src/server/fx.ts +1 -0
- package/src/server/http.ts +529 -0
- package/src/server/identity.ts +18 -0
- package/src/server/index.ts +806 -40
- package/src/server/keys.ts +4 -0
- package/src/server/mutations/index.ts +1 -1
- package/src/server/mutations/oauth.ts +36 -8
- package/src/server/mutations/store.ts +6 -3
- package/src/server/oauth.ts +6 -0
- package/src/server/passkey.ts +3 -2
- package/src/server/provider.ts +2 -0
- package/src/server/providers.ts +20 -0
- package/src/server/ratelimit.ts +3 -0
- package/src/server/redirects.ts +2 -0
- package/src/server/refresh.ts +5 -0
- package/src/server/sessions.ts +5 -0
- package/src/server/signin.ts +1 -0
- package/src/server/sso.ts +259 -17
- package/src/server/templates.ts +1 -0
- package/src/server/tokens.ts +1 -0
- package/src/server/totp.ts +4 -2
- package/src/server/types.ts +178 -83
- package/src/server/users.ts +1 -0
- package/src/server/utils.ts +71 -1
- package/src/server/version.ts +1 -1
- package/dist/component/public.js.map +0 -1
- package/dist/component/server/implementation.d.ts +0 -1264
- package/dist/component/server/implementation.d.ts.map +0 -1
- package/dist/component/server/implementation.js +0 -2365
- package/dist/component/server/implementation.js.map +0 -1
- package/dist/server/cookies.d.ts.map +0 -1
- package/dist/server/db.d.ts.map +0 -1
- package/dist/server/device.d.ts.map +0 -1
- package/dist/server/implementation.d.ts +0 -1264
- package/dist/server/implementation.d.ts.map +0 -1
- package/dist/server/implementation.js +0 -2365
- package/dist/server/implementation.js.map +0 -1
- package/dist/server/keys.d.ts.map +0 -1
- package/dist/server/oauth.d.ts.map +0 -1
- package/dist/server/ratelimit.d.ts.map +0 -1
- package/dist/server/redirects.d.ts.map +0 -1
- package/dist/server/refresh.d.ts.map +0 -1
- package/dist/server/sessions.d.ts.map +0 -1
- package/dist/server/signin.d.ts.map +0 -1
- package/dist/server/sso.d.ts.map +0 -1
- package/dist/server/templates.d.ts.map +0 -1
- package/dist/server/tokens.d.ts.map +0 -1
- package/dist/server/totp.d.ts.map +0 -1
- package/dist/server/users.d.ts.map +0 -1
- package/dist/server/utils.d.ts.map +0 -1
- package/src/server/implementation.ts +0 -5336
package/src/server/types.ts
CHANGED
|
@@ -12,8 +12,17 @@ import {
|
|
|
12
12
|
RegisteredQuery,
|
|
13
13
|
TableNamesInDataModel,
|
|
14
14
|
} from "convex/server";
|
|
15
|
+
import type { Infer } from "convex/values";
|
|
15
16
|
import { GenericId, Value } from "convex/values";
|
|
16
17
|
|
|
18
|
+
import {
|
|
19
|
+
vApiKeyDoc,
|
|
20
|
+
vAuthVerifierDoc,
|
|
21
|
+
vDeviceCodeDoc,
|
|
22
|
+
vPasskeyDoc,
|
|
23
|
+
vTotpFactorDoc,
|
|
24
|
+
vUserDoc,
|
|
25
|
+
} from "../component/model";
|
|
17
26
|
import schema from "../component/schema";
|
|
18
27
|
import { CredentialsUserConfig } from "../providers/credentials";
|
|
19
28
|
|
|
@@ -24,6 +33,30 @@ import { CredentialsUserConfig } from "../providers/credentials";
|
|
|
24
33
|
/** A value that is either `T` or a `PromiseLike<T>`. */
|
|
25
34
|
export type Awaitable<T> = T | PromiseLike<T>;
|
|
26
35
|
|
|
36
|
+
export type AuthRoleDefinition = {
|
|
37
|
+
id?: string;
|
|
38
|
+
label?: string;
|
|
39
|
+
grants: string[];
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
export type AuthAuthorizationConfig = {
|
|
43
|
+
roles: Record<string, AuthRoleDefinition>;
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
export type AuthRoleId<
|
|
47
|
+
TAuthorization extends AuthAuthorizationConfig | undefined,
|
|
48
|
+
> = TAuthorization extends { roles: infer TRoles extends Record<string, any> }
|
|
49
|
+
? keyof TRoles & string
|
|
50
|
+
: string;
|
|
51
|
+
|
|
52
|
+
export type AuthGrant<
|
|
53
|
+
TAuthorization extends AuthAuthorizationConfig | undefined,
|
|
54
|
+
> = TAuthorization extends {
|
|
55
|
+
roles: infer TRoles extends Record<string, { grants: readonly any[] }>;
|
|
56
|
+
}
|
|
57
|
+
? TRoles[keyof TRoles]["grants"][number] & string
|
|
58
|
+
: string;
|
|
59
|
+
|
|
27
60
|
/**
|
|
28
61
|
* The config for the Convex Auth library, passed to `createAuth`.
|
|
29
62
|
*/
|
|
@@ -238,6 +271,18 @@ export type ConvexAuthConfig = {
|
|
|
238
271
|
},
|
|
239
272
|
) => Promise<void>;
|
|
240
273
|
};
|
|
274
|
+
/**
|
|
275
|
+
* Application-defined role and grant model used by membership access checks.
|
|
276
|
+
*/
|
|
277
|
+
authorization?: {
|
|
278
|
+
roles: Record<
|
|
279
|
+
string,
|
|
280
|
+
{
|
|
281
|
+
label?: string;
|
|
282
|
+
grants: string[];
|
|
283
|
+
}
|
|
284
|
+
>;
|
|
285
|
+
};
|
|
241
286
|
};
|
|
242
287
|
|
|
243
288
|
/**
|
|
@@ -282,6 +327,62 @@ export interface SSOProviderConfig {
|
|
|
282
327
|
type: "sso";
|
|
283
328
|
}
|
|
284
329
|
|
|
330
|
+
export type EnterpriseAccountLinkingPolicy = "verifiedEmail" | "none";
|
|
331
|
+
|
|
332
|
+
export type EnterpriseScimReuseUserPolicy = "externalId" | "none";
|
|
333
|
+
|
|
334
|
+
export type EnterpriseJitProvisioningMode =
|
|
335
|
+
| "off"
|
|
336
|
+
| "createUser"
|
|
337
|
+
| "createUserAndMembership";
|
|
338
|
+
|
|
339
|
+
export type EnterpriseDeprovisionMode = "soft" | "hard";
|
|
340
|
+
|
|
341
|
+
export interface EnterprisePolicy {
|
|
342
|
+
version: 1;
|
|
343
|
+
identity: {
|
|
344
|
+
accountLinking: {
|
|
345
|
+
oidc: EnterpriseAccountLinkingPolicy;
|
|
346
|
+
saml: EnterpriseAccountLinkingPolicy;
|
|
347
|
+
};
|
|
348
|
+
};
|
|
349
|
+
provisioning: {
|
|
350
|
+
scimReuse: {
|
|
351
|
+
user: EnterpriseScimReuseUserPolicy;
|
|
352
|
+
};
|
|
353
|
+
jit: {
|
|
354
|
+
mode: EnterpriseJitProvisioningMode;
|
|
355
|
+
defaultRoleIds: string[];
|
|
356
|
+
};
|
|
357
|
+
deprovision: {
|
|
358
|
+
mode: EnterpriseDeprovisionMode;
|
|
359
|
+
};
|
|
360
|
+
};
|
|
361
|
+
extend?: Record<string, unknown>;
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
export interface EnterprisePolicyPatch {
|
|
365
|
+
identity?: {
|
|
366
|
+
accountLinking?: {
|
|
367
|
+
oidc?: EnterpriseAccountLinkingPolicy;
|
|
368
|
+
saml?: EnterpriseAccountLinkingPolicy;
|
|
369
|
+
};
|
|
370
|
+
};
|
|
371
|
+
provisioning?: {
|
|
372
|
+
scimReuse?: {
|
|
373
|
+
user?: EnterpriseScimReuseUserPolicy;
|
|
374
|
+
};
|
|
375
|
+
jit?: {
|
|
376
|
+
mode?: EnterpriseJitProvisioningMode;
|
|
377
|
+
defaultRoleIds?: string[];
|
|
378
|
+
};
|
|
379
|
+
deprovision?: {
|
|
380
|
+
mode?: EnterpriseDeprovisionMode;
|
|
381
|
+
};
|
|
382
|
+
};
|
|
383
|
+
extend?: Record<string, unknown>;
|
|
384
|
+
}
|
|
385
|
+
|
|
285
386
|
/**
|
|
286
387
|
* Email provider config for magic link / OTP sign-in.
|
|
287
388
|
*/
|
|
@@ -567,6 +668,7 @@ export type AuthServerHelpers = {
|
|
|
567
668
|
ctx: GenericActionCtx<any>,
|
|
568
669
|
args: AuthCreateAccountArgs,
|
|
569
670
|
) => Promise<{
|
|
671
|
+
ok: true;
|
|
570
672
|
account: GenericDoc<GenericDataModel, "Account">;
|
|
571
673
|
user: GenericDoc<GenericDataModel, "User">;
|
|
572
674
|
}>;
|
|
@@ -580,7 +682,7 @@ export type AuthServerHelpers = {
|
|
|
580
682
|
update: (
|
|
581
683
|
ctx: GenericActionCtx<any>,
|
|
582
684
|
args: AuthUpdateAccountArgs,
|
|
583
|
-
) => Promise<
|
|
685
|
+
) => Promise<{ ok: true; accountId: GenericId<"Account"> }>;
|
|
584
686
|
};
|
|
585
687
|
session: {
|
|
586
688
|
current: (ctx: {
|
|
@@ -589,7 +691,32 @@ export type AuthServerHelpers = {
|
|
|
589
691
|
invalidate: (
|
|
590
692
|
ctx: GenericActionCtx<any>,
|
|
591
693
|
args: AuthInvalidateSessionsArgs,
|
|
592
|
-
) => Promise<
|
|
694
|
+
) => Promise<{
|
|
695
|
+
ok: true;
|
|
696
|
+
userId: GenericId<"User">;
|
|
697
|
+
except: GenericId<"Session">[];
|
|
698
|
+
}>;
|
|
699
|
+
};
|
|
700
|
+
access: {
|
|
701
|
+
check: (
|
|
702
|
+
ctx: GenericActionCtx<any>,
|
|
703
|
+
args: {
|
|
704
|
+
userId: GenericId<"User">;
|
|
705
|
+
groupId: GenericId<"Group">;
|
|
706
|
+
grants: string[];
|
|
707
|
+
maxDepth?: number;
|
|
708
|
+
},
|
|
709
|
+
) => Promise<{
|
|
710
|
+
ok: boolean;
|
|
711
|
+
grants: string[];
|
|
712
|
+
missingGrants: string[];
|
|
713
|
+
roleIds: string[];
|
|
714
|
+
matchedGroupId: GenericId<"Group"> | null;
|
|
715
|
+
membership: GenericDoc<GenericDataModel, "GroupMember"> | null;
|
|
716
|
+
isDirect: boolean;
|
|
717
|
+
isInherited: boolean;
|
|
718
|
+
depth: number | null;
|
|
719
|
+
}>;
|
|
593
720
|
};
|
|
594
721
|
provider: {
|
|
595
722
|
signIn: (
|
|
@@ -621,7 +748,7 @@ export type ConvexAuthMaterializedConfig = {
|
|
|
621
748
|
providers: AuthProviderMaterializedConfig[];
|
|
622
749
|
} & Pick<
|
|
623
750
|
ConvexAuthConfig,
|
|
624
|
-
"component" | "session" | "jwt" | "signIn" | "callbacks"
|
|
751
|
+
"component" | "session" | "jwt" | "signIn" | "callbacks" | "authorization"
|
|
625
752
|
>;
|
|
626
753
|
|
|
627
754
|
export interface SAMLAttributeMapping {
|
|
@@ -857,12 +984,12 @@ export type GroupOrderBy = "_creationTime" | "name" | "slug" | "type";
|
|
|
857
984
|
export type MemberWhere = {
|
|
858
985
|
groupId?: string;
|
|
859
986
|
userId?: string;
|
|
860
|
-
|
|
987
|
+
roleId?: string;
|
|
861
988
|
status?: string;
|
|
862
989
|
};
|
|
863
990
|
|
|
864
991
|
/** Sortable fields for `auth.member.list()`. */
|
|
865
|
-
export type MemberOrderBy = "_creationTime" | "
|
|
992
|
+
export type MemberOrderBy = "_creationTime" | "status";
|
|
866
993
|
|
|
867
994
|
/** Filter fields for `auth.invite.list()`. All optional. */
|
|
868
995
|
export type InviteWhere = {
|
|
@@ -871,7 +998,7 @@ export type InviteWhere = {
|
|
|
871
998
|
status?: "pending" | "accepted" | "revoked" | "expired";
|
|
872
999
|
email?: string;
|
|
873
1000
|
invitedByUserId?: string;
|
|
874
|
-
|
|
1001
|
+
roleId?: string;
|
|
875
1002
|
acceptedByUserId?: string;
|
|
876
1003
|
};
|
|
877
1004
|
|
|
@@ -1055,6 +1182,28 @@ export type AuthComponentApi = {
|
|
|
1055
1182
|
enterpriseDomainAdd: FunctionReference<"mutation", "internal", any, any>;
|
|
1056
1183
|
enterpriseDomainList: FunctionReference<"query", "internal", any, any>;
|
|
1057
1184
|
enterpriseDomainDelete: FunctionReference<"mutation", "internal", any, any>;
|
|
1185
|
+
enterpriseDomainVerificationGet: FunctionReference<
|
|
1186
|
+
"query",
|
|
1187
|
+
"internal",
|
|
1188
|
+
any,
|
|
1189
|
+
any
|
|
1190
|
+
>;
|
|
1191
|
+
enterpriseDomainVerificationUpsert: FunctionReference<
|
|
1192
|
+
"mutation",
|
|
1193
|
+
"internal",
|
|
1194
|
+
any,
|
|
1195
|
+
any
|
|
1196
|
+
>;
|
|
1197
|
+
enterpriseDomainVerificationDelete: FunctionReference<
|
|
1198
|
+
"mutation",
|
|
1199
|
+
"internal",
|
|
1200
|
+
any,
|
|
1201
|
+
any
|
|
1202
|
+
>;
|
|
1203
|
+
enterpriseDomainVerify: FunctionReference<"mutation", "internal", any, any>;
|
|
1204
|
+
enterpriseSecretUpsert: FunctionReference<"mutation", "internal", any, any>;
|
|
1205
|
+
enterpriseSecretGet: FunctionReference<"query", "internal", any, any>;
|
|
1206
|
+
enterpriseSecretDelete: FunctionReference<"mutation", "internal", any, any>;
|
|
1058
1207
|
enterpriseScimConfigUpsert: FunctionReference<
|
|
1059
1208
|
"mutation",
|
|
1060
1209
|
"internal",
|
|
@@ -1080,6 +1229,12 @@ export type AuthComponentApi = {
|
|
|
1080
1229
|
any,
|
|
1081
1230
|
any
|
|
1082
1231
|
>;
|
|
1232
|
+
enterpriseScimIdentityGetByEnterpriseAndUser: FunctionReference<
|
|
1233
|
+
"query",
|
|
1234
|
+
"internal",
|
|
1235
|
+
any,
|
|
1236
|
+
any
|
|
1237
|
+
>;
|
|
1083
1238
|
enterpriseScimIdentityGetByMappedGroup: FunctionReference<
|
|
1084
1239
|
"query",
|
|
1085
1240
|
"internal",
|
|
@@ -1123,6 +1278,12 @@ export type AuthComponentApi = {
|
|
|
1123
1278
|
any,
|
|
1124
1279
|
any
|
|
1125
1280
|
>;
|
|
1281
|
+
enterpriseWebhookEndpointGet: FunctionReference<
|
|
1282
|
+
"query",
|
|
1283
|
+
"internal",
|
|
1284
|
+
any,
|
|
1285
|
+
any
|
|
1286
|
+
>;
|
|
1126
1287
|
enterpriseWebhookEndpointUpdate: FunctionReference<
|
|
1127
1288
|
"mutation",
|
|
1128
1289
|
"internal",
|
|
@@ -1243,80 +1404,25 @@ export type SessionInfoWithTokens = {
|
|
|
1243
1404
|
// code can work with typed results from cross-component queries/mutations
|
|
1244
1405
|
// instead of casting to `any` at every field access.
|
|
1245
1406
|
|
|
1246
|
-
export
|
|
1247
|
-
_id: string;
|
|
1248
|
-
_creationTime: number;
|
|
1249
|
-
userId: string;
|
|
1250
|
-
secret: ArrayBuffer;
|
|
1251
|
-
digits: number;
|
|
1252
|
-
period: number;
|
|
1253
|
-
verified: boolean;
|
|
1254
|
-
name?: string;
|
|
1255
|
-
createdAt: number;
|
|
1256
|
-
lastUsedAt?: number;
|
|
1257
|
-
}
|
|
1407
|
+
export type TotpDoc = Infer<typeof vTotpFactorDoc>;
|
|
1258
1408
|
|
|
1259
|
-
export
|
|
1260
|
-
_id: string;
|
|
1261
|
-
_creationTime: number;
|
|
1262
|
-
userId: string;
|
|
1263
|
-
credentialId: string;
|
|
1264
|
-
publicKey: ArrayBuffer;
|
|
1265
|
-
algorithm: number;
|
|
1266
|
-
counter: number;
|
|
1267
|
-
transports?: string[];
|
|
1268
|
-
deviceType: string;
|
|
1269
|
-
backedUp: boolean;
|
|
1270
|
-
name?: string;
|
|
1271
|
-
createdAt: number;
|
|
1272
|
-
lastUsedAt?: number;
|
|
1273
|
-
}
|
|
1409
|
+
export type PasskeyDoc = Infer<typeof vPasskeyDoc>;
|
|
1274
1410
|
|
|
1275
|
-
export
|
|
1276
|
-
_id: string;
|
|
1277
|
-
_creationTime: number;
|
|
1278
|
-
signature?: string;
|
|
1279
|
-
sessionId?: string;
|
|
1280
|
-
}
|
|
1411
|
+
export type VerifierDoc = Infer<typeof vAuthVerifierDoc>;
|
|
1281
1412
|
|
|
1282
1413
|
/**
|
|
1283
|
-
*
|
|
1414
|
+
* Cross-component user document shape inferred from the component validator.
|
|
1284
1415
|
*
|
|
1285
|
-
* Used by internal typed wrappers (`queryUserById`, etc.)
|
|
1286
|
-
*
|
|
1287
|
-
*
|
|
1288
|
-
*
|
|
1289
|
-
* which preserves typed `Id<"User">`.
|
|
1416
|
+
* Used by internal typed wrappers (`queryUserById`, etc.) so server code stays
|
|
1417
|
+
* aligned with the component runtime contract. Not intended for consumer use —
|
|
1418
|
+
* consumers should use `UserDoc` (exported from
|
|
1419
|
+
* `@robelest/convex-auth/component`).
|
|
1290
1420
|
*
|
|
1291
1421
|
* @internal
|
|
1292
1422
|
*/
|
|
1293
|
-
export
|
|
1294
|
-
_id: string;
|
|
1295
|
-
_creationTime: number;
|
|
1296
|
-
email?: string;
|
|
1297
|
-
emailVerificationTime?: number;
|
|
1298
|
-
phone?: string;
|
|
1299
|
-
phoneVerificationTime?: number;
|
|
1300
|
-
name?: string;
|
|
1301
|
-
image?: string;
|
|
1302
|
-
isAnonymous?: boolean;
|
|
1303
|
-
}
|
|
1423
|
+
export type CrossComponentUserDoc = Infer<typeof vUserDoc>;
|
|
1304
1424
|
|
|
1305
|
-
export
|
|
1306
|
-
_id: string;
|
|
1307
|
-
_creationTime: number;
|
|
1308
|
-
userId: string;
|
|
1309
|
-
prefix: string;
|
|
1310
|
-
hashedKey: string;
|
|
1311
|
-
name: string;
|
|
1312
|
-
scopes: Array<{ resource: string; actions: string[] }>;
|
|
1313
|
-
rateLimit?: { maxRequests: number; windowMs: number };
|
|
1314
|
-
rateLimitState?: { attemptsLeft: number; lastAttemptTime: number };
|
|
1315
|
-
expiresAt?: number;
|
|
1316
|
-
lastUsedAt?: number;
|
|
1317
|
-
createdAt: number;
|
|
1318
|
-
revoked: boolean;
|
|
1319
|
-
}
|
|
1425
|
+
export type KeyDoc = Infer<typeof vApiKeyDoc>;
|
|
1320
1426
|
|
|
1321
1427
|
// ---------------------------------------------------------------------------
|
|
1322
1428
|
// Cross-component wrapper context
|
|
@@ -1555,18 +1661,7 @@ export async function mutateKeyDelete(
|
|
|
1555
1661
|
|
|
1556
1662
|
// -- Device authorization queries / mutations --
|
|
1557
1663
|
|
|
1558
|
-
export
|
|
1559
|
-
_id: string;
|
|
1560
|
-
_creationTime: number;
|
|
1561
|
-
deviceCodeHash: string;
|
|
1562
|
-
userCode: string;
|
|
1563
|
-
expiresAt: number;
|
|
1564
|
-
interval: number;
|
|
1565
|
-
status: "pending" | "authorized" | "denied";
|
|
1566
|
-
userId?: string;
|
|
1567
|
-
sessionId?: string;
|
|
1568
|
-
lastPolledAt?: number;
|
|
1569
|
-
}
|
|
1664
|
+
export type DeviceDoc = Infer<typeof vDeviceCodeDoc>;
|
|
1570
1665
|
|
|
1571
1666
|
export async function mutateDeviceInsert(
|
|
1572
1667
|
ctx: ComponentCallCtx,
|
package/src/server/users.ts
CHANGED
package/src/server/utils.ts
CHANGED
|
@@ -3,7 +3,11 @@ import {
|
|
|
3
3
|
generateRandomString as osloGenerateRandomString,
|
|
4
4
|
} from "@oslojs/crypto/random";
|
|
5
5
|
import { sha256 as rawSha256 } from "@oslojs/crypto/sha2";
|
|
6
|
-
import {
|
|
6
|
+
import {
|
|
7
|
+
decodeBase64urlIgnorePadding,
|
|
8
|
+
encodeBase64urlNoPadding,
|
|
9
|
+
encodeHexLowerCase,
|
|
10
|
+
} from "@oslojs/encoding";
|
|
7
11
|
|
|
8
12
|
import { AuthError } from "./fx";
|
|
9
13
|
|
|
@@ -13,6 +17,7 @@ import { AuthError } from "./fx";
|
|
|
13
17
|
* Uses `AuthError.toConvexError()` directly since this is a synchronous guard
|
|
14
18
|
* called inline in many expressions — not suitable for Fx pipeline wrapping.
|
|
15
19
|
*/
|
|
20
|
+
/** @internal */
|
|
16
21
|
export function requireEnv(name: string) {
|
|
17
22
|
const value = process.env[name];
|
|
18
23
|
if (value === undefined) {
|
|
@@ -25,6 +30,7 @@ export function requireEnv(name: string) {
|
|
|
25
30
|
return value;
|
|
26
31
|
}
|
|
27
32
|
|
|
33
|
+
/** @internal */
|
|
28
34
|
export function isLocalHost(host?: string) {
|
|
29
35
|
if (host === undefined) {
|
|
30
36
|
return false;
|
|
@@ -45,13 +51,17 @@ export function isLocalHost(host?: string) {
|
|
|
45
51
|
|
|
46
52
|
// Internal server utilities (merged from former internalUtils.ts)
|
|
47
53
|
|
|
54
|
+
/** @internal */
|
|
48
55
|
export const TOKEN_SUB_CLAIM_DIVIDER = "|";
|
|
56
|
+
/** @internal */
|
|
49
57
|
export const REFRESH_TOKEN_DIVIDER = "|";
|
|
50
58
|
|
|
59
|
+
/** @internal */
|
|
51
60
|
export async function sha256(input: string) {
|
|
52
61
|
return encodeHexLowerCase(rawSha256(new TextEncoder().encode(input)));
|
|
53
62
|
}
|
|
54
63
|
|
|
64
|
+
/** @internal */
|
|
55
65
|
export function generateRandomString(length: number, alphabet: string) {
|
|
56
66
|
const random: RandomReader = {
|
|
57
67
|
read(bytes) {
|
|
@@ -62,10 +72,12 @@ export function generateRandomString(length: number, alphabet: string) {
|
|
|
62
72
|
return osloGenerateRandomString(random, alphabet, length);
|
|
63
73
|
}
|
|
64
74
|
|
|
75
|
+
/** @internal */
|
|
65
76
|
export function errorMessage(error: unknown) {
|
|
66
77
|
return error instanceof Error ? error.message : String(error);
|
|
67
78
|
}
|
|
68
79
|
|
|
80
|
+
/** @internal */
|
|
69
81
|
export function logError(error: unknown) {
|
|
70
82
|
logWithLevel(
|
|
71
83
|
LOG_LEVELS.ERROR,
|
|
@@ -75,6 +87,7 @@ export function logError(error: unknown) {
|
|
|
75
87
|
);
|
|
76
88
|
}
|
|
77
89
|
|
|
90
|
+
/** @internal */
|
|
78
91
|
export const LOG_LEVELS = {
|
|
79
92
|
ERROR: "ERROR",
|
|
80
93
|
WARN: "WARN",
|
|
@@ -83,6 +96,7 @@ export const LOG_LEVELS = {
|
|
|
83
96
|
} as const;
|
|
84
97
|
type LogLevel = keyof typeof LOG_LEVELS;
|
|
85
98
|
|
|
99
|
+
/** @internal */
|
|
86
100
|
export function logWithLevel(level: LogLevel, ...args: unknown[]) {
|
|
87
101
|
const configuredLogLevel =
|
|
88
102
|
LOG_LEVELS[
|
|
@@ -111,6 +125,7 @@ export function logWithLevel(level: LogLevel, ...args: unknown[]) {
|
|
|
111
125
|
}
|
|
112
126
|
|
|
113
127
|
const UNREDACTED_LENGTH = 5;
|
|
128
|
+
/** @internal */
|
|
114
129
|
export function maybeRedact(value: string) {
|
|
115
130
|
if (value === "") {
|
|
116
131
|
return "";
|
|
@@ -129,3 +144,58 @@ export function maybeRedact(value: string) {
|
|
|
129
144
|
return value;
|
|
130
145
|
}
|
|
131
146
|
}
|
|
147
|
+
|
|
148
|
+
const SECRET_KEY_ENV = "AUTH_SECRET_ENCRYPTION_KEY";
|
|
149
|
+
const SECRET_IV_LENGTH = 12;
|
|
150
|
+
|
|
151
|
+
function toArrayBuffer(bytes: Uint8Array) {
|
|
152
|
+
return bytes.buffer.slice(
|
|
153
|
+
bytes.byteOffset,
|
|
154
|
+
bytes.byteOffset + bytes.byteLength,
|
|
155
|
+
) as ArrayBuffer;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
async function getSecretCryptoKey() {
|
|
159
|
+
const material = requireEnv(SECRET_KEY_ENV);
|
|
160
|
+
const rawKey = rawSha256(new TextEncoder().encode(material));
|
|
161
|
+
return await crypto.subtle.importKey(
|
|
162
|
+
"raw",
|
|
163
|
+
toArrayBuffer(rawKey),
|
|
164
|
+
{ name: "AES-GCM" },
|
|
165
|
+
false,
|
|
166
|
+
["encrypt", "decrypt"],
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/** @internal */
|
|
171
|
+
export async function encryptSecret(value: string) {
|
|
172
|
+
const key = await getSecretCryptoKey();
|
|
173
|
+
const iv = crypto.getRandomValues(new Uint8Array(SECRET_IV_LENGTH));
|
|
174
|
+
const encrypted = await crypto.subtle.encrypt(
|
|
175
|
+
{ name: "AES-GCM", iv: toArrayBuffer(iv) },
|
|
176
|
+
key,
|
|
177
|
+
toArrayBuffer(new TextEncoder().encode(value)),
|
|
178
|
+
);
|
|
179
|
+
return `${encodeBase64urlNoPadding(iv)}.${encodeBase64urlNoPadding(new Uint8Array(encrypted))}`;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/** @internal */
|
|
183
|
+
export async function decryptSecret(ciphertext: string) {
|
|
184
|
+
const [ivEncoded, payloadEncoded] = ciphertext.split(".");
|
|
185
|
+
if (!ivEncoded || !payloadEncoded) {
|
|
186
|
+
throw new AuthError(
|
|
187
|
+
"INVALID_PARAMETERS",
|
|
188
|
+
"Stored enterprise secret is malformed.",
|
|
189
|
+
).toConvexError();
|
|
190
|
+
}
|
|
191
|
+
const key = await getSecretCryptoKey();
|
|
192
|
+
const decrypted = await crypto.subtle.decrypt(
|
|
193
|
+
{
|
|
194
|
+
name: "AES-GCM",
|
|
195
|
+
iv: toArrayBuffer(decodeBase64urlIgnorePadding(ivEncoded)),
|
|
196
|
+
},
|
|
197
|
+
key,
|
|
198
|
+
toArrayBuffer(decodeBase64urlIgnorePadding(payloadEncoded)),
|
|
199
|
+
);
|
|
200
|
+
return new TextDecoder().decode(decrypted);
|
|
201
|
+
}
|
package/src/server/version.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// Auto-generated by scripts/generate-version.js — do not edit.
|
|
2
|
-
export const AUTH_VERSION = "0.0.4-preview.
|
|
2
|
+
export const AUTH_VERSION = "0.0.4-preview.16";
|