@atlasauth/backend 0.24.0 → 0.25.0
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/CHANGELOG.md +7 -0
- package/dist/client/abac.d.ts +132 -0
- package/dist/client/abac.js +48 -0
- package/dist/client/abac.js.map +1 -0
- package/dist/client/access-policies.d.ts +100 -0
- package/dist/client/access-policies.js +29 -0
- package/dist/client/access-policies.js.map +1 -0
- package/dist/client/action-gallery.d.ts +1 -1
- package/dist/client/action-gallery.js.map +1 -1
- package/dist/client/actions.d.ts +129 -6
- package/dist/client/actions.js +4 -0
- package/dist/client/actions.js.map +1 -1
- package/dist/client/analytics-reports.d.ts +215 -0
- package/dist/client/analytics-reports.js +56 -0
- package/dist/client/analytics-reports.js.map +1 -0
- package/dist/client/app-catalog.d.ts +74 -0
- package/dist/client/app-catalog.js +30 -0
- package/dist/client/app-catalog.js.map +1 -0
- package/dist/client/attack-protection.d.ts +10 -0
- package/dist/client/attack-protection.js +8 -0
- package/dist/client/attack-protection.js.map +1 -1
- package/dist/client/audit-events.d.ts +71 -0
- package/dist/client/audit-events.js +28 -0
- package/dist/client/audit-events.js.map +1 -1
- package/dist/client/credentials.d.ts +8 -0
- package/dist/client/credentials.js.map +1 -1
- package/dist/client/delegated-ui-proxy.d.ts +25 -0
- package/dist/client/delegated-ui-proxy.js +46 -0
- package/dist/client/delegated-ui-proxy.js.map +1 -0
- package/dist/client/devices.d.ts +44 -0
- package/dist/client/devices.js +26 -0
- package/dist/client/devices.js.map +1 -0
- package/dist/client/email-templates.d.ts +1 -1
- package/dist/client/email-templates.js.map +1 -1
- package/dist/client/flags.d.ts +101 -0
- package/dist/client/flags.js +104 -0
- package/dist/client/flags.js.map +1 -0
- package/dist/client/groups.d.ts +146 -0
- package/dist/client/groups.js +67 -0
- package/dist/client/groups.js.map +1 -0
- package/dist/client/identity-verification.d.ts +62 -0
- package/dist/client/identity-verification.js +39 -0
- package/dist/client/identity-verification.js.map +1 -0
- package/dist/client/index.d.ts +943 -2
- package/dist/client/index.js +73 -0
- package/dist/client/index.js.map +1 -1
- package/dist/client/journeys.d.ts +108 -0
- package/dist/client/journeys.js +35 -0
- package/dist/client/journeys.js.map +1 -0
- package/dist/client/log-streams.d.ts +1 -1
- package/dist/client/marketing.d.ts +67 -0
- package/dist/client/marketing.js +26 -0
- package/dist/client/marketing.js.map +1 -0
- package/dist/client/mcp-gateways.d.ts +54 -0
- package/dist/client/mcp-gateways.js +25 -0
- package/dist/client/mcp-gateways.js.map +1 -0
- package/dist/client/messaging.d.ts +14 -3
- package/dist/client/messaging.js.map +1 -1
- package/dist/client/mfa-factors.d.ts +120 -0
- package/dist/client/mfa-factors.js +73 -0
- package/dist/client/mfa-factors.js.map +1 -0
- package/dist/client/migrations.d.ts +1 -1
- package/dist/client/migrations.js.map +1 -1
- package/dist/client/network-acls.d.ts +6 -1
- package/dist/client/network-acls.js.map +1 -1
- package/dist/client/network-zones.d.ts +56 -0
- package/dist/client/network-zones.js +29 -0
- package/dist/client/network-zones.js.map +1 -0
- package/dist/client/notifications.d.ts +1 -1
- package/dist/client/notifications.js.map +1 -1
- package/dist/client/oauth-clients.d.ts +183 -3
- package/dist/client/oauth-clients.js +64 -0
- package/dist/client/oauth-clients.js.map +1 -1
- package/dist/client/org-role-grants.d.ts +57 -0
- package/dist/client/org-role-grants.js +40 -0
- package/dist/client/org-role-grants.js.map +1 -0
- package/dist/client/organizations.d.ts +52 -0
- package/dist/client/organizations.js +44 -0
- package/dist/client/organizations.js.map +1 -1
- package/dist/client/page-templates.d.ts +78 -0
- package/dist/client/page-templates.js +31 -0
- package/dist/client/page-templates.js.map +1 -0
- package/dist/client/passkey-api.d.ts +73 -0
- package/dist/client/passkey-api.js +34 -0
- package/dist/client/passkey-api.js.map +1 -0
- package/dist/client/resources.d.ts +149 -0
- package/dist/client/resources.js +73 -0
- package/dist/client/resources.js.map +1 -0
- package/dist/client/risk-based-mfa.d.ts +147 -0
- package/dist/client/risk-based-mfa.js +30 -0
- package/dist/client/risk-based-mfa.js.map +1 -1
- package/dist/client/roles.d.ts +4 -0
- package/dist/client/roles.js.map +1 -1
- package/dist/client/service-connectors.d.ts +83 -0
- package/dist/client/service-connectors.js +33 -0
- package/dist/client/service-connectors.js.map +1 -0
- package/dist/client/ssf.d.ts +111 -0
- package/dist/client/ssf.js +49 -0
- package/dist/client/ssf.js.map +1 -0
- package/dist/client/sso-onboarding.d.ts +6 -0
- package/dist/client/sso-onboarding.js.map +1 -1
- package/dist/client/users.d.ts +302 -0
- package/dist/client/users.js +125 -0
- package/dist/client/users.js.map +1 -1
- package/dist/client/vault.d.ts +85 -0
- package/dist/client/vault.js +50 -0
- package/dist/client/vault.js.map +1 -0
- package/dist/client/vc.d.ts +128 -0
- package/dist/client/vc.js +43 -0
- package/dist/client/vc.js.map +1 -0
- package/dist/client/webhooks.d.ts +31 -2
- package/dist/client/webhooks.js.map +1 -1
- package/dist/client/workflows.d.ts +131 -0
- package/dist/client/workflows.js +36 -0
- package/dist/client/workflows.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +8 -2
- package/dist/index.js.map +1 -1
- package/dist/magic-did.d.ts +5 -0
- package/dist/magic-did.js +49 -0
- package/dist/magic-did.js.map +1 -0
- package/dist/migration-bridge.d.ts +9 -0
- package/dist/migration-bridge.js +28 -2
- package/dist/migration-bridge.js.map +1 -1
- package/dist/migration-presets-g3.d.ts +2 -0
- package/dist/migration-presets-g3.js +254 -0
- package/dist/migration-presets-g3.js.map +1 -0
- package/dist/migration-presets-g4/authentik.d.ts +14 -0
- package/dist/migration-presets-g4/authentik.js +37 -0
- package/dist/migration-presets-g4/authentik.js.map +1 -0
- package/dist/migration-presets-g4/fusionauth.d.ts +2 -0
- package/dist/migration-presets-g4/fusionauth.js +52 -0
- package/dist/migration-presets-g4/fusionauth.js.map +1 -0
- package/dist/migration-presets-g4/hanko.d.ts +12 -0
- package/dist/migration-presets-g4/hanko.js +46 -0
- package/dist/migration-presets-g4/hanko.js.map +1 -0
- package/dist/migration-presets-g4/keycloak.d.ts +16 -0
- package/dist/migration-presets-g4/keycloak.js +37 -0
- package/dist/migration-presets-g4/keycloak.js.map +1 -0
- package/dist/migration-presets-g4/logto.d.ts +12 -0
- package/dist/migration-presets-g4/logto.js +35 -0
- package/dist/migration-presets-g4/logto.js.map +1 -0
- package/dist/migration-presets-g4/ory.d.ts +2 -0
- package/dist/migration-presets-g4/ory.js +67 -0
- package/dist/migration-presets-g4/ory.js.map +1 -0
- package/dist/migration-presets-g4/supertokens.d.ts +13 -0
- package/dist/migration-presets-g4/supertokens.js +35 -0
- package/dist/migration-presets-g4/supertokens.js.map +1 -0
- package/dist/migration-presets-g4/zitadel.d.ts +2 -0
- package/dist/migration-presets-g4/zitadel.js +36 -0
- package/dist/migration-presets-g4/zitadel.js.map +1 -0
- package/dist/migration-presets-g4.d.ts +10 -0
- package/dist/migration-presets-g4.js +30 -0
- package/dist/migration-presets-g4.js.map +1 -0
- package/dist/migration-presets.d.ts +6 -0
- package/dist/migration-presets.js +102 -6
- package/dist/migration-presets.js.map +1 -1
- package/dist/request-auth.d.ts +32 -0
- package/dist/request-auth.js +72 -0
- package/dist/request-auth.js.map +1 -0
- package/dist/verify.d.ts +2 -0
- package/dist/verify.js.map +1 -1
- package/dist/workos-session.d.ts +30 -0
- package/dist/workos-session.js +123 -0
- package/dist/workos-session.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { type RequestFn } from './request';
|
|
2
|
+
import type { ListPage } from './types';
|
|
3
|
+
export type PageTemplatePage = 'sign-in' | 'sign-up' | 'user-profile';
|
|
4
|
+
export type TemplateTone = 'default' | 'muted' | 'accent' | 'success' | 'danger';
|
|
5
|
+
type Align = 'left' | 'center' | 'right';
|
|
6
|
+
/** One component. Strings are escaped; links are https, mailto: or a path; there is no raw HTML, CSS or script. */
|
|
7
|
+
export type TemplateNode = {
|
|
8
|
+
type: 'heading';
|
|
9
|
+
text: string;
|
|
10
|
+
level?: 2 | 3;
|
|
11
|
+
align?: Align;
|
|
12
|
+
} | {
|
|
13
|
+
type: 'text';
|
|
14
|
+
text: string;
|
|
15
|
+
tone?: TemplateTone;
|
|
16
|
+
size?: 'sm' | 'md';
|
|
17
|
+
align?: Align;
|
|
18
|
+
} | {
|
|
19
|
+
type: 'image';
|
|
20
|
+
src?: string;
|
|
21
|
+
asset_id?: string;
|
|
22
|
+
alt: string;
|
|
23
|
+
width?: number;
|
|
24
|
+
align?: Align;
|
|
25
|
+
} | {
|
|
26
|
+
type: 'link';
|
|
27
|
+
label: string;
|
|
28
|
+
href: string;
|
|
29
|
+
} | {
|
|
30
|
+
type: 'button_link';
|
|
31
|
+
label: string;
|
|
32
|
+
href: string;
|
|
33
|
+
} | {
|
|
34
|
+
type: 'list';
|
|
35
|
+
items: string[];
|
|
36
|
+
} | {
|
|
37
|
+
type: 'divider';
|
|
38
|
+
} | {
|
|
39
|
+
type: 'spacer';
|
|
40
|
+
size?: 'sm' | 'md' | 'lg';
|
|
41
|
+
} | {
|
|
42
|
+
type: 'columns';
|
|
43
|
+
columns: TemplateNode[][];
|
|
44
|
+
};
|
|
45
|
+
export interface PageTemplateDefinition {
|
|
46
|
+
version?: 1;
|
|
47
|
+
regions: Partial<Record<'header' | 'above_form' | 'below_form' | 'footer', TemplateNode[]>>;
|
|
48
|
+
}
|
|
49
|
+
export interface PageTemplateSlot {
|
|
50
|
+
version: number;
|
|
51
|
+
updated_at: number;
|
|
52
|
+
definition: PageTemplateDefinition;
|
|
53
|
+
}
|
|
54
|
+
export interface PageTemplate {
|
|
55
|
+
object: 'page_template';
|
|
56
|
+
page: PageTemplatePage;
|
|
57
|
+
live: PageTemplateSlot | null;
|
|
58
|
+
draft: PageTemplateSlot | null;
|
|
59
|
+
}
|
|
60
|
+
export interface PageTemplatePreview {
|
|
61
|
+
object: 'page_template_preview';
|
|
62
|
+
page: PageTemplatePage;
|
|
63
|
+
url: string;
|
|
64
|
+
expires_at: number;
|
|
65
|
+
}
|
|
66
|
+
export declare function pageTemplatesResource(request: RequestFn): {
|
|
67
|
+
list(): Promise<ListPage<PageTemplate>>;
|
|
68
|
+
get(page: PageTemplatePage): Promise<PageTemplate>;
|
|
69
|
+
/** Save the page's draft. The live page is unchanged until you promote. */
|
|
70
|
+
saveDraft(page: PageTemplatePage, definition: PageTemplateDefinition): Promise<PageTemplate>;
|
|
71
|
+
/** A signed link (one hour) to the hosted page with the draft applied. */
|
|
72
|
+
preview(page: PageTemplatePage): Promise<PageTemplatePreview>;
|
|
73
|
+
/** Make the draft the live template. */
|
|
74
|
+
promote(page: PageTemplatePage): Promise<PageTemplate>;
|
|
75
|
+
/** Drop the draft, or take the live template down. */
|
|
76
|
+
discard(page: PageTemplatePage, status: "draft" | "live"): Promise<PageTemplate>;
|
|
77
|
+
};
|
|
78
|
+
export {};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.pageTemplatesResource = pageTemplatesResource;
|
|
4
|
+
const request_1 = require("./request");
|
|
5
|
+
function pageTemplatesResource(request) {
|
|
6
|
+
return {
|
|
7
|
+
list() {
|
|
8
|
+
return request({ method: 'GET', path: '/v1/instance/page_templates' });
|
|
9
|
+
},
|
|
10
|
+
get(page) {
|
|
11
|
+
return request({ method: 'GET', path: `/v1/instance/page_templates/${(0, request_1.enc)(page)}` });
|
|
12
|
+
},
|
|
13
|
+
/** Save the page's draft. The live page is unchanged until you promote. */
|
|
14
|
+
saveDraft(page, definition) {
|
|
15
|
+
return request({ method: 'PUT', path: `/v1/instance/page_templates/${(0, request_1.enc)(page)}`, body: { definition } });
|
|
16
|
+
},
|
|
17
|
+
/** A signed link (one hour) to the hosted page with the draft applied. */
|
|
18
|
+
preview(page) {
|
|
19
|
+
return request({ method: 'POST', path: `/v1/instance/page_templates/${(0, request_1.enc)(page)}/preview` });
|
|
20
|
+
},
|
|
21
|
+
/** Make the draft the live template. */
|
|
22
|
+
promote(page) {
|
|
23
|
+
return request({ method: 'POST', path: `/v1/instance/page_templates/${(0, request_1.enc)(page)}/promote` });
|
|
24
|
+
},
|
|
25
|
+
/** Drop the draft, or take the live template down. */
|
|
26
|
+
discard(page, status) {
|
|
27
|
+
return request({ method: 'DELETE', path: `/v1/instance/page_templates/${(0, request_1.enc)(page)}`, query: { status } });
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=page-templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-templates.js","sourceRoot":"","sources":["../../src/client/page-templates.ts"],"names":[],"mappings":";;AA4CA,sDAyBC;AArED,uCAAgD;AA4ChD,SAAgB,qBAAqB,CAAC,OAAkB;IACtD,OAAO;QACL,IAAI;YACF,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,6BAA6B,EAAE,CAAC,CAAC;QACzE,CAAC;QACD,GAAG,CAAC,IAAsB;YACxB,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,+BAA+B,IAAA,aAAG,EAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACtF,CAAC;QACD,2EAA2E;QAC3E,SAAS,CAAC,IAAsB,EAAE,UAAkC;YAClE,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,+BAA+B,IAAA,aAAG,EAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;QAC5G,CAAC;QACD,0EAA0E;QAC1E,OAAO,CAAC,IAAsB;YAC5B,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,+BAA+B,IAAA,aAAG,EAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QAC/F,CAAC;QACD,wCAAwC;QACxC,OAAO,CAAC,IAAsB;YAC5B,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,+BAA+B,IAAA,aAAG,EAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QAC/F,CAAC;QACD,sDAAsD;QACtD,OAAO,CAAC,IAAsB,EAAE,MAAwB;YACtD,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,+BAA+B,IAAA,aAAG,EAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QAC5G,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { type RequestFn } from './request';
|
|
2
|
+
import type { ListPage } from './types';
|
|
3
|
+
export interface ExternalPasskey {
|
|
4
|
+
object: 'external_passkey';
|
|
5
|
+
id: string;
|
|
6
|
+
user_id: string;
|
|
7
|
+
credential_id: string;
|
|
8
|
+
name: string | null;
|
|
9
|
+
aaguid: string | null;
|
|
10
|
+
backed_up: boolean;
|
|
11
|
+
transports: string[];
|
|
12
|
+
last_used_at: number | null;
|
|
13
|
+
created_at: number;
|
|
14
|
+
}
|
|
15
|
+
export interface PasskeyRegistrationFinalize {
|
|
16
|
+
user_id: string;
|
|
17
|
+
challenge: string;
|
|
18
|
+
attestation_object: string;
|
|
19
|
+
client_data_json: string;
|
|
20
|
+
name?: string;
|
|
21
|
+
transports?: string[];
|
|
22
|
+
}
|
|
23
|
+
export interface PasskeyLoginFinalize {
|
|
24
|
+
handle: string;
|
|
25
|
+
challenge: string;
|
|
26
|
+
credential_id: string;
|
|
27
|
+
authenticator_data: string;
|
|
28
|
+
client_data_json: string;
|
|
29
|
+
signature: string;
|
|
30
|
+
/** Require the passkey to belong to this user. */
|
|
31
|
+
user_id?: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Passkeys for a user store you own: Atlas runs the WebAuthn ceremony, you keep
|
|
35
|
+
* the users and the session. Pass `options` to navigator.credentials.create()/get().
|
|
36
|
+
*/
|
|
37
|
+
export declare function passkeyApiResource(request: RequestFn): {
|
|
38
|
+
registrationInit(body: {
|
|
39
|
+
user_id: string;
|
|
40
|
+
username?: string;
|
|
41
|
+
display_name?: string;
|
|
42
|
+
}): Promise<{
|
|
43
|
+
object: "passkey_registration_options";
|
|
44
|
+
options: Record<string, unknown>;
|
|
45
|
+
}>;
|
|
46
|
+
registrationFinalize(body: PasskeyRegistrationFinalize): Promise<ExternalPasskey>;
|
|
47
|
+
loginInit(body?: {
|
|
48
|
+
user_id?: string;
|
|
49
|
+
}): Promise<{
|
|
50
|
+
object: "passkey_login_options";
|
|
51
|
+
handle: string;
|
|
52
|
+
options: Record<string, unknown>;
|
|
53
|
+
}>;
|
|
54
|
+
loginFinalize(body: PasskeyLoginFinalize): Promise<{
|
|
55
|
+
object: "passkey_login_result";
|
|
56
|
+
verified: true;
|
|
57
|
+
user_id: string;
|
|
58
|
+
credential_id: string;
|
|
59
|
+
passkey_id: string;
|
|
60
|
+
user_verified: boolean;
|
|
61
|
+
cloned_warning: boolean;
|
|
62
|
+
}>;
|
|
63
|
+
list(userId: string): Promise<ListPage<ExternalPasskey>>;
|
|
64
|
+
delete(userId: string, id: string): Promise<{
|
|
65
|
+
object: "external_passkey";
|
|
66
|
+
id: string;
|
|
67
|
+
deleted: true;
|
|
68
|
+
}>;
|
|
69
|
+
usage(): Promise<{
|
|
70
|
+
object: "passkey_api_usage";
|
|
71
|
+
passkeys: number;
|
|
72
|
+
}>;
|
|
73
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.passkeyApiResource = passkeyApiResource;
|
|
4
|
+
const request_1 = require("./request");
|
|
5
|
+
/**
|
|
6
|
+
* Passkeys for a user store you own: Atlas runs the WebAuthn ceremony, you keep
|
|
7
|
+
* the users and the session. Pass `options` to navigator.credentials.create()/get().
|
|
8
|
+
*/
|
|
9
|
+
function passkeyApiResource(request) {
|
|
10
|
+
return {
|
|
11
|
+
registrationInit(body) {
|
|
12
|
+
return request({ method: 'POST', path: '/v1/passkey_api/registration/init', body });
|
|
13
|
+
},
|
|
14
|
+
registrationFinalize(body) {
|
|
15
|
+
return request({ method: 'POST', path: '/v1/passkey_api/registration/finalize', body });
|
|
16
|
+
},
|
|
17
|
+
loginInit(body = {}) {
|
|
18
|
+
return request({ method: 'POST', path: '/v1/passkey_api/login/init', body });
|
|
19
|
+
},
|
|
20
|
+
loginFinalize(body) {
|
|
21
|
+
return request({ method: 'POST', path: '/v1/passkey_api/login/finalize', body });
|
|
22
|
+
},
|
|
23
|
+
list(userId) {
|
|
24
|
+
return request({ method: 'GET', path: `/v1/passkey_api/users/${(0, request_1.enc)(userId)}/passkeys` });
|
|
25
|
+
},
|
|
26
|
+
delete(userId, id) {
|
|
27
|
+
return request({ method: 'DELETE', path: `/v1/passkey_api/users/${(0, request_1.enc)(userId)}/passkeys/${(0, request_1.enc)(id)}` });
|
|
28
|
+
},
|
|
29
|
+
usage() {
|
|
30
|
+
return request({ method: 'GET', path: '/v1/passkey_api/usage' });
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=passkey-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"passkey-api.js","sourceRoot":"","sources":["../../src/client/passkey-api.ts"],"names":[],"mappings":";;AAwCA,gDAgCC;AAxED,uCAAgD;AAoChD;;;GAGG;AACH,SAAgB,kBAAkB,CAAC,OAAkB;IACnD,OAAO;QACL,gBAAgB,CAAC,IAAmE;YAClF,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,mCAAmC,EAAE,IAAI,EAAE,CAAC,CAAC;QACtF,CAAC;QACD,oBAAoB,CAAC,IAAiC;YACpD,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,uCAAuC,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1F,CAAC;QACD,SAAS,CAAC,OAA6B,EAAE;YACvC,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,4BAA4B,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/E,CAAC;QACD,aAAa,CAAC,IAA0B;YAStC,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,gCAAgC,EAAE,IAAI,EAAE,CAAC,CAAC;QACnF,CAAC;QACD,IAAI,CAAC,MAAc;YACjB,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,yBAAyB,IAAA,aAAG,EAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QAC3F,CAAC;QACD,MAAM,CAAC,MAAc,EAAE,EAAU;YAC/B,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,yBAAyB,IAAA,aAAG,EAAC,MAAM,CAAC,aAAa,IAAA,aAAG,EAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACzG,CAAC;QACD,KAAK;YACH,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC,CAAC;QACnE,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { type RequestFn } from './request';
|
|
2
|
+
import type { ListPage } from './types';
|
|
3
|
+
export interface ResourceRoleDef {
|
|
4
|
+
key: string;
|
|
5
|
+
name?: string;
|
|
6
|
+
/** `*` grants every permission. */
|
|
7
|
+
permissions: string[];
|
|
8
|
+
/** Other roles of the same type this role also grants. */
|
|
9
|
+
includes?: string[];
|
|
10
|
+
}
|
|
11
|
+
export interface ResourceType {
|
|
12
|
+
object: 'resource_type';
|
|
13
|
+
key: string;
|
|
14
|
+
name: string;
|
|
15
|
+
description: string | null;
|
|
16
|
+
parent_type: string | null;
|
|
17
|
+
inherit: boolean;
|
|
18
|
+
roles: ResourceRoleDef[];
|
|
19
|
+
created_at: number;
|
|
20
|
+
updated_at: number;
|
|
21
|
+
}
|
|
22
|
+
export interface CreateResourceTypeBody {
|
|
23
|
+
key: string;
|
|
24
|
+
name?: string;
|
|
25
|
+
description?: string | null;
|
|
26
|
+
/** The type a resource of this type nests under. */
|
|
27
|
+
parent_type?: string | null;
|
|
28
|
+
/** Whether assignments on a parent flow down (default true). */
|
|
29
|
+
inherit?: boolean;
|
|
30
|
+
roles: ResourceRoleDef[];
|
|
31
|
+
}
|
|
32
|
+
export interface Resource {
|
|
33
|
+
object: 'resource';
|
|
34
|
+
id: string;
|
|
35
|
+
type: string;
|
|
36
|
+
external_id: string;
|
|
37
|
+
name: string | null;
|
|
38
|
+
parent_id: string | null;
|
|
39
|
+
metadata: Record<string, unknown>;
|
|
40
|
+
created_at: number;
|
|
41
|
+
updated_at: number;
|
|
42
|
+
}
|
|
43
|
+
/** A reference to a resource: Atlas `id`, or your own `type` + `external_id`. */
|
|
44
|
+
export type ResourceRef = {
|
|
45
|
+
id: string;
|
|
46
|
+
} | {
|
|
47
|
+
type: string;
|
|
48
|
+
external_id: string;
|
|
49
|
+
};
|
|
50
|
+
export interface UpsertResourceBody {
|
|
51
|
+
type: string;
|
|
52
|
+
external_id: string;
|
|
53
|
+
name?: string | null;
|
|
54
|
+
/** The parent resource, or null for a root. */
|
|
55
|
+
parent?: ResourceRef | null;
|
|
56
|
+
metadata?: Record<string, unknown>;
|
|
57
|
+
}
|
|
58
|
+
export type ResourceSubject = {
|
|
59
|
+
type: 'user' | 'group' | 'org';
|
|
60
|
+
id: string;
|
|
61
|
+
};
|
|
62
|
+
export interface ResourceRoleAssignment {
|
|
63
|
+
object: 'resource_role_assignment';
|
|
64
|
+
id: string;
|
|
65
|
+
resource_id: string;
|
|
66
|
+
subject: ResourceSubject;
|
|
67
|
+
role: string;
|
|
68
|
+
inherit: boolean;
|
|
69
|
+
created_at: number;
|
|
70
|
+
}
|
|
71
|
+
export interface ResourceCheckBody {
|
|
72
|
+
subject: ResourceSubject;
|
|
73
|
+
permission: string;
|
|
74
|
+
resource: ResourceRef;
|
|
75
|
+
/** Extra group ids the subject belongs to (a user's organizations are added automatically). */
|
|
76
|
+
groups?: string[];
|
|
77
|
+
}
|
|
78
|
+
export interface ResourceCheck {
|
|
79
|
+
object: 'resource_check';
|
|
80
|
+
allowed: boolean;
|
|
81
|
+
resource_id: string;
|
|
82
|
+
grants?: Array<{
|
|
83
|
+
resource_id: string;
|
|
84
|
+
role: string;
|
|
85
|
+
subject: string;
|
|
86
|
+
inherited: boolean;
|
|
87
|
+
}>;
|
|
88
|
+
}
|
|
89
|
+
/** Resource-scoped RBAC: resource types, the resource tree, role assignments on resources, and permission checks. */
|
|
90
|
+
export declare function resourcesResource(request: RequestFn): {
|
|
91
|
+
types: {
|
|
92
|
+
list(): Promise<ListPage<ResourceType>>;
|
|
93
|
+
get(key: string): Promise<ResourceType>;
|
|
94
|
+
create(body: CreateResourceTypeBody, idempotencyKey?: string): Promise<ResourceType>;
|
|
95
|
+
update(key: string, body: Partial<Omit<CreateResourceTypeBody, "key">>): Promise<ResourceType>;
|
|
96
|
+
delete(key: string): Promise<{
|
|
97
|
+
object: "resource_type";
|
|
98
|
+
key: string;
|
|
99
|
+
deleted: true;
|
|
100
|
+
}>;
|
|
101
|
+
};
|
|
102
|
+
list(query?: {
|
|
103
|
+
type?: string;
|
|
104
|
+
parent_id?: string;
|
|
105
|
+
limit?: number;
|
|
106
|
+
}): Promise<ListPage<Resource>>;
|
|
107
|
+
get(id: string): Promise<Resource>;
|
|
108
|
+
/** Create or update one resource by (type, external_id). */
|
|
109
|
+
upsert(body: UpsertResourceBody): Promise<Resource>;
|
|
110
|
+
/** Discovery sync: upsert up to 500 resources in order (parents before children). */
|
|
111
|
+
sync(resources: UpsertResourceBody[]): Promise<ListPage<Resource>>;
|
|
112
|
+
delete(id: string): Promise<{
|
|
113
|
+
object: "resource";
|
|
114
|
+
id: string;
|
|
115
|
+
deleted: true;
|
|
116
|
+
}>;
|
|
117
|
+
assignments: {
|
|
118
|
+
list(query?: {
|
|
119
|
+
resource_id?: string;
|
|
120
|
+
subject_type?: string;
|
|
121
|
+
subject_id?: string;
|
|
122
|
+
}): Promise<ListPage<ResourceRoleAssignment>>;
|
|
123
|
+
/** Assign `role` on `resource` to a user, group or org. */
|
|
124
|
+
assign(body: {
|
|
125
|
+
resource: ResourceRef;
|
|
126
|
+
subject: ResourceSubject;
|
|
127
|
+
role: string;
|
|
128
|
+
inherit?: boolean;
|
|
129
|
+
}): Promise<ResourceRoleAssignment>;
|
|
130
|
+
revoke(id: string): Promise<{
|
|
131
|
+
object: "resource_role_assignment";
|
|
132
|
+
id: string;
|
|
133
|
+
deleted: true;
|
|
134
|
+
}>;
|
|
135
|
+
};
|
|
136
|
+
/** May `subject` hold `permission` on `resource`? */
|
|
137
|
+
check(body: ResourceCheckBody): Promise<ResourceCheck>;
|
|
138
|
+
/** Convenience: the boolean answer to {@link check}. */
|
|
139
|
+
can(body: ResourceCheckBody): Promise<boolean>;
|
|
140
|
+
checkBatch(checks: ResourceCheckBody[]): Promise<ListPage<ResourceCheck>>;
|
|
141
|
+
/** The resources (of an optional `type`) on which `subject` holds `permission`. */
|
|
142
|
+
accessible(body: {
|
|
143
|
+
subject: ResourceSubject;
|
|
144
|
+
permission: string;
|
|
145
|
+
type?: string;
|
|
146
|
+
groups?: string[];
|
|
147
|
+
limit?: number;
|
|
148
|
+
}): Promise<ListPage<Resource>>;
|
|
149
|
+
};
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resourcesResource = resourcesResource;
|
|
4
|
+
const request_1 = require("./request");
|
|
5
|
+
/** Resource-scoped RBAC: resource types, the resource tree, role assignments on resources, and permission checks. */
|
|
6
|
+
function resourcesResource(request) {
|
|
7
|
+
return {
|
|
8
|
+
types: {
|
|
9
|
+
list() {
|
|
10
|
+
return request({ method: 'GET', path: '/v1/resource_types' });
|
|
11
|
+
},
|
|
12
|
+
get(key) {
|
|
13
|
+
return request({ method: 'GET', path: `/v1/resource_types/${(0, request_1.enc)(key)}` });
|
|
14
|
+
},
|
|
15
|
+
create(body, idempotencyKey) {
|
|
16
|
+
return request({ method: 'POST', path: '/v1/resource_types', body, idempotencyKey });
|
|
17
|
+
},
|
|
18
|
+
update(key, body) {
|
|
19
|
+
return request({ method: 'PATCH', path: `/v1/resource_types/${(0, request_1.enc)(key)}`, body });
|
|
20
|
+
},
|
|
21
|
+
delete(key) {
|
|
22
|
+
return request({ method: 'DELETE', path: `/v1/resource_types/${(0, request_1.enc)(key)}` });
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
list(query = {}) {
|
|
26
|
+
const q = new URLSearchParams(Object.entries(query).filter(([, v]) => v !== undefined).map(([k, v]) => [k, String(v)]));
|
|
27
|
+
return request({ method: 'GET', path: `/v1/resources${q.size ? `?${q}` : ''}` });
|
|
28
|
+
},
|
|
29
|
+
get(id) {
|
|
30
|
+
return request({ method: 'GET', path: `/v1/resources/${(0, request_1.enc)(id)}` });
|
|
31
|
+
},
|
|
32
|
+
/** Create or update one resource by (type, external_id). */
|
|
33
|
+
upsert(body) {
|
|
34
|
+
return request({ method: 'PUT', path: '/v1/resources', body });
|
|
35
|
+
},
|
|
36
|
+
/** Discovery sync: upsert up to 500 resources in order (parents before children). */
|
|
37
|
+
sync(resources) {
|
|
38
|
+
return request({ method: 'POST', path: '/v1/resources/sync', body: { resources } });
|
|
39
|
+
},
|
|
40
|
+
delete(id) {
|
|
41
|
+
return request({ method: 'DELETE', path: `/v1/resources/${(0, request_1.enc)(id)}` });
|
|
42
|
+
},
|
|
43
|
+
assignments: {
|
|
44
|
+
list(query = {}) {
|
|
45
|
+
const q = new URLSearchParams(Object.entries(query).filter(([, v]) => v !== undefined));
|
|
46
|
+
return request({ method: 'GET', path: `/v1/resource_role_assignments${q.size ? `?${q}` : ''}` });
|
|
47
|
+
},
|
|
48
|
+
/** Assign `role` on `resource` to a user, group or org. */
|
|
49
|
+
assign(body) {
|
|
50
|
+
return request({ method: 'POST', path: '/v1/resource_role_assignments', body });
|
|
51
|
+
},
|
|
52
|
+
revoke(id) {
|
|
53
|
+
return request({ method: 'DELETE', path: `/v1/resource_role_assignments/${(0, request_1.enc)(id)}` });
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
/** May `subject` hold `permission` on `resource`? */
|
|
57
|
+
check(body) {
|
|
58
|
+
return request({ method: 'POST', path: '/v1/resource_checks', body });
|
|
59
|
+
},
|
|
60
|
+
/** Convenience: the boolean answer to {@link check}. */
|
|
61
|
+
async can(body) {
|
|
62
|
+
return (await request({ method: 'POST', path: '/v1/resource_checks', body })).allowed;
|
|
63
|
+
},
|
|
64
|
+
checkBatch(checks) {
|
|
65
|
+
return request({ method: 'POST', path: '/v1/resource_checks/batch', body: { checks } });
|
|
66
|
+
},
|
|
67
|
+
/** The resources (of an optional `type`) on which `subject` holds `permission`. */
|
|
68
|
+
accessible(body) {
|
|
69
|
+
return request({ method: 'POST', path: '/v1/resource_checks/list', body });
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=resources.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resources.js","sourceRoot":"","sources":["../../src/client/resources.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,14 @@ import { type RequestFn } from './request';
|
|
|
3
3
|
export type RiskLevel = 'low' | 'medium' | 'high';
|
|
4
4
|
/** What to do at high risk when the user has NO enrolled factor. */
|
|
5
5
|
export type OnHighRiskNoFactor = 'allow' | 'block' | 'require_enroll';
|
|
6
|
+
/** `audit` scores and records every sign-in but never changes the outcome. */
|
|
7
|
+
export type RiskMode = 'enforce' | 'audit';
|
|
8
|
+
/** What a risk level does; `default` keeps the step-up threshold behaviour. */
|
|
9
|
+
export type RiskLevelAction = 'default' | 'allow' | 'notify' | 'mfa' | 'block';
|
|
10
|
+
export interface RiskLevelActions {
|
|
11
|
+
medium: RiskLevelAction;
|
|
12
|
+
high: RiskLevelAction;
|
|
13
|
+
}
|
|
6
14
|
/** Per-signal score weights that feed the risk total. */
|
|
7
15
|
export interface RiskWeights {
|
|
8
16
|
newDevice: number;
|
|
@@ -34,6 +42,78 @@ export interface RiskBasedMfa {
|
|
|
34
42
|
on_high_risk_no_factor: OnHighRiskNoFactor;
|
|
35
43
|
weights: RiskWeights;
|
|
36
44
|
signals: RiskSignalToggles;
|
|
45
|
+
mode: RiskMode;
|
|
46
|
+
level_actions: RiskLevelActions;
|
|
47
|
+
reputation: RiskReputation;
|
|
48
|
+
fraud: FraudConfig;
|
|
49
|
+
/** Per-user baseline: unusual sign-in hour or never-seen country adds `weight` points each. */
|
|
50
|
+
baseline: {
|
|
51
|
+
enabled: boolean;
|
|
52
|
+
weight: number;
|
|
53
|
+
};
|
|
54
|
+
/** Re-evaluate a session when it refreshes from a different network. */
|
|
55
|
+
mid_session: {
|
|
56
|
+
enabled: boolean;
|
|
57
|
+
action: 'revoke' | 'notify' | 'audit';
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
export type FraudAction = 'allow' | 'challenge' | 'block';
|
|
61
|
+
export interface FraudRule {
|
|
62
|
+
id: string;
|
|
63
|
+
name: string;
|
|
64
|
+
enabled: boolean;
|
|
65
|
+
action: FraudAction;
|
|
66
|
+
/** Reason code returned when the rule matches. */
|
|
67
|
+
reason: string;
|
|
68
|
+
/** All conditions must hold. */
|
|
69
|
+
conditions: Array<{
|
|
70
|
+
field: 'country' | 'asn' | 'datacenter' | 'anonymizer' | 'headless' | 'automation' | 'client_class' | 'bot_score' | 'email_disposable' | 'ip_velocity' | 'device_velocity' | 'email_velocity';
|
|
71
|
+
op: 'eq' | 'neq' | 'gt' | 'gte' | 'lt' | 'lte' | 'in' | 'nin';
|
|
72
|
+
value: string | number | boolean | Array<string | number>;
|
|
73
|
+
}>;
|
|
74
|
+
}
|
|
75
|
+
export interface FraudConfig {
|
|
76
|
+
/** Two-letter country codes that are always blocked. */
|
|
77
|
+
sanctioned_countries: string[];
|
|
78
|
+
rules: FraudRule[];
|
|
79
|
+
/** Cap on lookups per device per hour; adaptive halves it for bot-like, datacenter or anonymized clients. */
|
|
80
|
+
device_rate_limit?: {
|
|
81
|
+
enabled: boolean;
|
|
82
|
+
per_hour: number;
|
|
83
|
+
adaptive: boolean;
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
export interface FraudLookupBody {
|
|
87
|
+
ip: string;
|
|
88
|
+
user_agent?: string;
|
|
89
|
+
/** The stable id from the JS SDK. */
|
|
90
|
+
device_id?: string;
|
|
91
|
+
email?: string;
|
|
92
|
+
/** A user of this instance, for user_age_days / user_mfa_enabled / user_banned rules. */
|
|
93
|
+
user_id?: string;
|
|
94
|
+
/** The organization the action is for, for org_id rules. */
|
|
95
|
+
org_id?: string;
|
|
96
|
+
/** Device features reported by the SDK (see the telemetry beacon). */
|
|
97
|
+
device?: Record<string, unknown>;
|
|
98
|
+
}
|
|
99
|
+
export interface FraudLookup {
|
|
100
|
+
object: 'fraud_lookup';
|
|
101
|
+
verdict: FraudAction;
|
|
102
|
+
reasons: string[];
|
|
103
|
+
matched_rules: string[];
|
|
104
|
+
device_id: string | null;
|
|
105
|
+
signals: Record<string, string | number | boolean | null>;
|
|
106
|
+
}
|
|
107
|
+
/** External IP-reputation / email-risk feeds (bring your own provider key). */
|
|
108
|
+
export interface RiskReputation {
|
|
109
|
+
provider: 'none' | 'ipqs' | 'spur' | 'minfraud';
|
|
110
|
+
/** Score points added when the IP is flagged. */
|
|
111
|
+
ip_weight: number;
|
|
112
|
+
/** Provider fraud score (1-100) at or above which the IP is flagged. */
|
|
113
|
+
min_score: number;
|
|
114
|
+
flag_anonymizers: boolean;
|
|
115
|
+
email_checks: boolean;
|
|
116
|
+
email_weight: number;
|
|
37
117
|
}
|
|
38
118
|
export interface UpdateRiskBasedMfaBody {
|
|
39
119
|
enabled?: boolean;
|
|
@@ -41,6 +121,40 @@ export interface UpdateRiskBasedMfaBody {
|
|
|
41
121
|
on_high_risk_no_factor?: OnHighRiskNoFactor;
|
|
42
122
|
weights?: Partial<RiskWeights>;
|
|
43
123
|
signals?: Partial<RiskSignalToggles>;
|
|
124
|
+
mode?: RiskMode;
|
|
125
|
+
level_actions?: Partial<RiskLevelActions>;
|
|
126
|
+
reputation?: Partial<RiskReputation>;
|
|
127
|
+
fraud?: Partial<FraudConfig>;
|
|
128
|
+
baseline?: Partial<RiskBasedMfa['baseline']>;
|
|
129
|
+
mid_session?: Partial<RiskBasedMfa['mid_session']>;
|
|
130
|
+
}
|
|
131
|
+
/** One risk-scored sign-in on the audit / shadow-mode timeline. */
|
|
132
|
+
export interface RiskEvent {
|
|
133
|
+
object: 'risk_event';
|
|
134
|
+
id: string;
|
|
135
|
+
user_id: string;
|
|
136
|
+
level: RiskLevel;
|
|
137
|
+
score: number;
|
|
138
|
+
/** Names of the signals that fired. */
|
|
139
|
+
signals: string[];
|
|
140
|
+
/** The action decided; in audit mode, what WOULD have happened. */
|
|
141
|
+
action: string;
|
|
142
|
+
mode: RiskMode;
|
|
143
|
+
ip: string | null;
|
|
144
|
+
feedback: 'legit' | 'fraud' | null;
|
|
145
|
+
feedback_at: string | null;
|
|
146
|
+
created_at: string;
|
|
147
|
+
}
|
|
148
|
+
export interface RiskEventMetrics {
|
|
149
|
+
object: 'risk_event_metrics';
|
|
150
|
+
days: number;
|
|
151
|
+
total: number;
|
|
152
|
+
buckets: Array<{
|
|
153
|
+
level: string;
|
|
154
|
+
action: string;
|
|
155
|
+
mode: string;
|
|
156
|
+
count: number;
|
|
157
|
+
}>;
|
|
44
158
|
}
|
|
45
159
|
/**
|
|
46
160
|
* Read and tune the instance's adaptive-MFA engine — when a second factor is
|
|
@@ -51,4 +165,37 @@ export declare function riskBasedMfaResource(request: RequestFn): {
|
|
|
51
165
|
get(): Promise<RiskBasedMfa>;
|
|
52
166
|
/** Change any subset of the config; omitted fields are left unchanged. */
|
|
53
167
|
update(body: UpdateRiskBasedMfaBody): Promise<RiskBasedMfa>;
|
|
168
|
+
/** Fraud decision (allow / challenge / block with reason codes) for a sign-up, sign-in or checkout. */
|
|
169
|
+
fraudLookup(body: FraudLookupBody): Promise<FraudLookup>;
|
|
170
|
+
/** Store the reputation provider's API key (write-only; minfraud: "<account id>:<license key>"). */
|
|
171
|
+
setReputationSecret(secret: string, provider?: "ipqs" | "spur" | "minfraud"): Promise<{
|
|
172
|
+
object: "risk_reputation_secret";
|
|
173
|
+
provider: string;
|
|
174
|
+
set: true;
|
|
175
|
+
}>;
|
|
176
|
+
/** Remove a stored reputation provider key (default: the configured provider). */
|
|
177
|
+
removeReputationSecret(provider?: "ipqs" | "spur" | "minfraud"): Promise<{
|
|
178
|
+
object: "risk_reputation_secret";
|
|
179
|
+
provider: string;
|
|
180
|
+
deleted: true;
|
|
181
|
+
}>;
|
|
182
|
+
};
|
|
183
|
+
/** The risk-event timeline, metrics and feedback. */
|
|
184
|
+
export declare function riskEventsResource(request: RequestFn): {
|
|
185
|
+
/** Newest first. Page with `before` (the created_at of the last row). */
|
|
186
|
+
list(query?: {
|
|
187
|
+
user_id?: string;
|
|
188
|
+
level?: RiskLevel;
|
|
189
|
+
limit?: number;
|
|
190
|
+
before?: string;
|
|
191
|
+
}): Promise<{
|
|
192
|
+
object: "list";
|
|
193
|
+
data: RiskEvent[];
|
|
194
|
+
}>;
|
|
195
|
+
/** Counts per level / action / mode over the last `days`. */
|
|
196
|
+
metrics(query?: {
|
|
197
|
+
days?: number;
|
|
198
|
+
}): Promise<RiskEventMetrics>;
|
|
199
|
+
/** Mark a scored sign-in `legit` or `fraud`; the fired signals' weights move accordingly. */
|
|
200
|
+
feedback(id: string, verdict: "legit" | "fraud"): Promise<RiskEvent>;
|
|
54
201
|
};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.riskBasedMfaResource = riskBasedMfaResource;
|
|
4
|
+
exports.riskEventsResource = riskEventsResource;
|
|
4
5
|
/**
|
|
5
6
|
* Read and tune the instance's adaptive-MFA engine — when a second factor is
|
|
6
7
|
* demanded, and how each risk signal is weighted.
|
|
@@ -15,6 +16,35 @@ function riskBasedMfaResource(request) {
|
|
|
15
16
|
update(body) {
|
|
16
17
|
return request({ method: 'PATCH', path: '/v1/risk_based_mfa', body });
|
|
17
18
|
},
|
|
19
|
+
/** Fraud decision (allow / challenge / block with reason codes) for a sign-up, sign-in or checkout. */
|
|
20
|
+
fraudLookup(body) {
|
|
21
|
+
return request({ method: 'POST', path: '/v1/fraud/lookup', body });
|
|
22
|
+
},
|
|
23
|
+
/** Store the reputation provider's API key (write-only; minfraud: "<account id>:<license key>"). */
|
|
24
|
+
setReputationSecret(secret, provider) {
|
|
25
|
+
return request({ method: 'PUT', path: '/v1/risk_based_mfa/reputation_secret', body: { secret, provider } });
|
|
26
|
+
},
|
|
27
|
+
/** Remove a stored reputation provider key (default: the configured provider). */
|
|
28
|
+
removeReputationSecret(provider) {
|
|
29
|
+
return request({ method: 'DELETE', path: '/v1/risk_based_mfa/reputation_secret', query: { provider } });
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/** The risk-event timeline, metrics and feedback. */
|
|
34
|
+
function riskEventsResource(request) {
|
|
35
|
+
return {
|
|
36
|
+
/** Newest first. Page with `before` (the created_at of the last row). */
|
|
37
|
+
list(query = {}) {
|
|
38
|
+
return request({ method: 'GET', path: '/v1/risk_events', query });
|
|
39
|
+
},
|
|
40
|
+
/** Counts per level / action / mode over the last `days`. */
|
|
41
|
+
metrics(query = {}) {
|
|
42
|
+
return request({ method: 'GET', path: '/v1/risk_events/metrics', query });
|
|
43
|
+
},
|
|
44
|
+
/** Mark a scored sign-in `legit` or `fraud`; the fired signals' weights move accordingly. */
|
|
45
|
+
feedback(id, verdict) {
|
|
46
|
+
return request({ method: 'POST', path: `/v1/risk_events/${encodeURIComponent(id)}/feedback`, body: { verdict } });
|
|
47
|
+
},
|
|
18
48
|
};
|
|
19
49
|
}
|
|
20
50
|
//# sourceMappingURL=risk-based-mfa.js.map
|