@atlasauth/backend 0.24.0 → 0.26.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 +39 -1
- package/dist/client/abac.d.ts +521 -0
- package/dist/client/abac.js +146 -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/authz-decisions.d.ts +108 -0
- package/dist/client/authz-decisions.js +40 -0
- package/dist/client/authz-decisions.js.map +1 -0
- package/dist/client/connections.d.ts +507 -0
- package/dist/client/connections.js +164 -0
- package/dist/client/connections.js.map +1 -0
- package/dist/client/credentials.d.ts +8 -0
- package/dist/client/credentials.js.map +1 -1
- package/dist/client/custom-oauth-providers.d.ts +15 -0
- package/dist/client/custom-oauth-providers.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/desktop-mfa.d.ts +104 -0
- package/dist/client/desktop-mfa.js +44 -0
- package/dist/client/desktop-mfa.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/fga.d.ts +125 -4
- package/dist/client/fga.js +40 -0
- package/dist/client/fga.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/iga.d.ts +436 -0
- package/dist/client/iga.js +82 -0
- package/dist/client/iga.js.map +1 -0
- package/dist/client/index.d.ts +1433 -4
- package/dist/client/index.js +96 -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/least-privilege.d.ts +95 -0
- package/dist/client/least-privilege.js +28 -0
- package/dist/client/least-privilege.js.map +1 -0
- package/dist/client/log-streams.d.ts +1 -1
- package/dist/client/managed-grants.d.ts +52 -0
- package/dist/client/managed-grants.js +28 -0
- package/dist/client/managed-grants.js.map +1 -0
- 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 +126 -0
- package/dist/client/mcp-gateways.js +47 -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 +187 -3
- package/dist/client/oauth-clients.js +64 -0
- package/dist/client/oauth-clients.js.map +1 -1
- package/dist/client/openfga.d.ts +90 -3
- package/dist/client/openfga.js +27 -1
- package/dist/client/openfga.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/policy-bundles.d.ts +105 -0
- package/dist/client/policy-bundles.js +38 -0
- package/dist/client/policy-bundles.js.map +1 -0
- package/dist/client/resources.d.ts +150 -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 +112 -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 +136 -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 +5 -0
- package/dist/index.js +11 -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/policy-bundle.d.ts +110 -0
- package/dist/policy-bundle.js +289 -0
- package/dist/policy-bundle.js.map +1 -0
- 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/uma.d.ts +77 -0
- package/dist/uma.js +95 -0
- package/dist/uma.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 +2 -2
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { type RequestFn } from './request';
|
|
2
|
+
import type { ListPage } from './types';
|
|
3
|
+
export type NetworkZoneAnonymizer = 'tor' | 'datacenter' | 'vpn';
|
|
4
|
+
/**
|
|
5
|
+
* A reusable network zone: a union of CIDR ranges, ISO countries, ASNs and
|
|
6
|
+
* anonymizer classes. Network ACL rules reference one by `zone_id`.
|
|
7
|
+
*/
|
|
8
|
+
export interface NetworkZone {
|
|
9
|
+
object: 'network_zone';
|
|
10
|
+
id: string;
|
|
11
|
+
name: string;
|
|
12
|
+
description: string | null;
|
|
13
|
+
cidrs: string[];
|
|
14
|
+
countries: string[];
|
|
15
|
+
asns: number[];
|
|
16
|
+
anonymizers: NetworkZoneAnonymizer[];
|
|
17
|
+
enabled: boolean;
|
|
18
|
+
created_at: number;
|
|
19
|
+
updated_at: number;
|
|
20
|
+
}
|
|
21
|
+
export interface CreateNetworkZoneBody {
|
|
22
|
+
name: string;
|
|
23
|
+
description?: string | null;
|
|
24
|
+
cidrs?: string[];
|
|
25
|
+
countries?: string[];
|
|
26
|
+
asns?: number[];
|
|
27
|
+
anonymizers?: NetworkZoneAnonymizer[];
|
|
28
|
+
enabled?: boolean;
|
|
29
|
+
}
|
|
30
|
+
export type UpdateNetworkZoneBody = Partial<CreateNetworkZoneBody>;
|
|
31
|
+
export interface NetworkZoneCheck {
|
|
32
|
+
object: 'network_zone_check';
|
|
33
|
+
zone_id: string;
|
|
34
|
+
ip: string;
|
|
35
|
+
matches: boolean;
|
|
36
|
+
facts: {
|
|
37
|
+
country: string | null;
|
|
38
|
+
asn: number | null;
|
|
39
|
+
tor: boolean | null;
|
|
40
|
+
datacenter: boolean | null;
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/** CRUD over the instance's network zones, plus a what-if `check` for one address. */
|
|
44
|
+
export declare function networkZonesResource(request: RequestFn): {
|
|
45
|
+
list(): Promise<ListPage<NetworkZone>>;
|
|
46
|
+
get(id: string): Promise<NetworkZone>;
|
|
47
|
+
create(body: CreateNetworkZoneBody, idempotencyKey?: string): Promise<NetworkZone>;
|
|
48
|
+
update(id: string, body: UpdateNetworkZoneBody): Promise<NetworkZone>;
|
|
49
|
+
delete(id: string): Promise<{
|
|
50
|
+
object: "network_zone";
|
|
51
|
+
id: string;
|
|
52
|
+
deleted: true;
|
|
53
|
+
}>;
|
|
54
|
+
/** Does `ip` fall inside the zone? Returns the resolved facts too. */
|
|
55
|
+
check(id: string, ip: string): Promise<NetworkZoneCheck>;
|
|
56
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.networkZonesResource = networkZonesResource;
|
|
4
|
+
const request_1 = require("./request");
|
|
5
|
+
/** CRUD over the instance's network zones, plus a what-if `check` for one address. */
|
|
6
|
+
function networkZonesResource(request) {
|
|
7
|
+
return {
|
|
8
|
+
list() {
|
|
9
|
+
return request({ method: 'GET', path: '/v1/network_zones' });
|
|
10
|
+
},
|
|
11
|
+
get(id) {
|
|
12
|
+
return request({ method: 'GET', path: `/v1/network_zones/${(0, request_1.enc)(id)}` });
|
|
13
|
+
},
|
|
14
|
+
create(body, idempotencyKey) {
|
|
15
|
+
return request({ method: 'POST', path: '/v1/network_zones', body, idempotencyKey });
|
|
16
|
+
},
|
|
17
|
+
update(id, body) {
|
|
18
|
+
return request({ method: 'PATCH', path: `/v1/network_zones/${(0, request_1.enc)(id)}`, body });
|
|
19
|
+
},
|
|
20
|
+
delete(id) {
|
|
21
|
+
return request({ method: 'DELETE', path: `/v1/network_zones/${(0, request_1.enc)(id)}` });
|
|
22
|
+
},
|
|
23
|
+
/** Does `ip` fall inside the zone? Returns the resolved facts too. */
|
|
24
|
+
check(id, ip) {
|
|
25
|
+
return request({ method: 'POST', path: `/v1/network_zones/${(0, request_1.enc)(id)}/check`, body: { ip } });
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=network-zones.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network-zones.js","sourceRoot":"","sources":["../../src/client/network-zones.ts"],"names":[],"mappings":";;AA4CA,oDAsBC;AAlED,uCAAgD;AA2ChD,sFAAsF;AACtF,SAAgB,oBAAoB,CAAC,OAAkB;IACrD,OAAO;QACL,IAAI;YACF,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAC;QAC/D,CAAC;QACD,GAAG,CAAC,EAAU;YACZ,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,qBAAqB,IAAA,aAAG,EAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1E,CAAC;QACD,MAAM,CAAC,IAA2B,EAAE,cAAuB;YACzD,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QACtF,CAAC;QACD,MAAM,CAAC,EAAU,EAAE,IAA2B;YAC5C,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,qBAAqB,IAAA,aAAG,EAAC,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAClF,CAAC;QACD,MAAM,CAAC,EAAU;YACf,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,qBAAqB,IAAA,aAAG,EAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7E,CAAC;QACD,sEAAsE;QACtE,KAAK,CAAC,EAAU,EAAE,EAAU;YAC1B,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,IAAA,aAAG,EAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/F,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type RequestFn } from './request';
|
|
2
2
|
/** Built-in notification templates `send` falls back to when no tenant template has the name. */
|
|
3
|
-
export type BuiltInNotificationTemplate = 'new_device' | 'unattended_access' | 'password_changed' | 'mfa_changed' | 'email_changed';
|
|
3
|
+
export type BuiltInNotificationTemplate = 'new_device' | 'unattended_access' | 'password_changed' | 'mfa_changed' | 'email_changed' | 'phone_changed' | 'identity_linked' | 'identity_unlinked' | 'passkey_added' | 'passkey_removed' | 'recovery_codes_regenerated' | 'factor_removed' | 'device_key_added' | 'device_key_removed' | 'risk_alert';
|
|
4
4
|
export interface SendNotificationBody {
|
|
5
5
|
/** The end-user to notify. */
|
|
6
6
|
user_id: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notifications.js","sourceRoot":"","sources":["../../src/client/notifications.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"notifications.js","sourceRoot":"","sources":["../../src/client/notifications.ts"],"names":[],"mappings":";;AA4EA,sDAqDC;AAjID,uCAAgD;AA4EhD,SAAgB,qBAAqB,CAAC,OAAkB;IACtD,OAAO;QACL,2FAA2F;QAC3F,IAAI,CAAC,IAA0B,EAAE,cAAuB;YACtD,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QACtF,CAAC;QACD,UAAU,EAAE;YACV,IAAI;gBACF,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,6BAA6B,EAAE,CAAC,CAAC;YACzE,CAAC;YACD,4CAA4C;YAC5C,MAAM,CAAC,IAAoC;gBACzC,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,6BAA6B,EAAE,IAAI,EAAE,CAAC,CAAC;YAChF,CAAC;YACD,MAAM,CAAC,GAAW,EAAE,IAAuB;gBACzC,OAAO,OAAO,CAAC;oBACb,MAAM,EAAE,KAAK;oBACb,IAAI,EAAE,+BAA+B,IAAA,aAAG,EAAC,GAAG,CAAC,EAAE;oBAC/C,IAAI;iBACL,CAAC,CAAC;YACL,CAAC;YACD,yDAAyD;YACzD,MAAM,CACJ,GAAW;gBAEX,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,+BAA+B,IAAA,aAAG,EAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;YACxF,CAAC;SACF;QACD,SAAS,EAAE;YACT,IAAI;gBACF,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,4BAA4B,EAAE,CAAC,CAAC;YACxE,CAAC;YACD,iCAAiC;YACjC,MAAM,CAAC,IAAoC;gBACzC,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,4BAA4B,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/E,CAAC;YACD,GAAG,CAAC,IAAY;gBACd,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,8BAA8B,IAAA,aAAG,EAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;YACrF,CAAC;YACD,MAAM,CAAC,IAAY,EAAE,IAAoC;gBACvD,OAAO,OAAO,CAAC;oBACb,MAAM,EAAE,KAAK;oBACb,IAAI,EAAE,8BAA8B,IAAA,aAAG,EAAC,IAAI,CAAC,EAAE;oBAC/C,IAAI;iBACL,CAAC,CAAC;YACL,CAAC;YACD,MAAM,CACJ,IAAY;gBAEZ,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,8BAA8B,IAAA,aAAG,EAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;YACxF,CAAC;SACF;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,6 +1,46 @@
|
|
|
1
1
|
import { type ProvisioningFields, type ProvisioningInput, type ProvisioningMetadata } from './compliance';
|
|
2
2
|
import { type RequestFn } from './request';
|
|
3
3
|
import type { ListPage } from './types';
|
|
4
|
+
export interface TrustedIssuer {
|
|
5
|
+
object: 'oauth_trusted_issuer';
|
|
6
|
+
id: string;
|
|
7
|
+
client_id: string;
|
|
8
|
+
issuer: string;
|
|
9
|
+
jwks: {
|
|
10
|
+
keys: unknown[];
|
|
11
|
+
} | null;
|
|
12
|
+
jwks_uri: string | null;
|
|
13
|
+
subject_mapping: 'user_id' | 'external_id' | 'email';
|
|
14
|
+
workload_kind: 'generic' | 'spiffe' | 'kubernetes' | 'github_actions' | 'gcp' | 'azure';
|
|
15
|
+
purpose: 'user_assertion' | 'client_auth' | 'both';
|
|
16
|
+
subject_pattern: string | null;
|
|
17
|
+
required_claims: Record<string, string> | null;
|
|
18
|
+
audiences: string[] | null;
|
|
19
|
+
created_at: number;
|
|
20
|
+
}
|
|
21
|
+
export interface TrustedIssuerInput {
|
|
22
|
+
issuer?: string;
|
|
23
|
+
jwks?: {
|
|
24
|
+
keys: unknown[];
|
|
25
|
+
};
|
|
26
|
+
jwks_uri?: string;
|
|
27
|
+
subject_mapping?: 'user_id' | 'external_id' | 'email';
|
|
28
|
+
workload_kind?: TrustedIssuer['workload_kind'];
|
|
29
|
+
tenant_id?: string;
|
|
30
|
+
purpose?: TrustedIssuer['purpose'];
|
|
31
|
+
subject_pattern?: string;
|
|
32
|
+
required_claims?: Record<string, string>;
|
|
33
|
+
audiences?: string[];
|
|
34
|
+
}
|
|
35
|
+
export interface WorkloadPreset {
|
|
36
|
+
object: 'workload_identity_preset';
|
|
37
|
+
kind: string;
|
|
38
|
+
title: string;
|
|
39
|
+
issuer: string | null;
|
|
40
|
+
jwks_uri: string | null;
|
|
41
|
+
subject_example: string;
|
|
42
|
+
notes: string;
|
|
43
|
+
}
|
|
4
44
|
export interface OAuthClient extends ProvisioningFields {
|
|
5
45
|
object: 'oauth_client';
|
|
6
46
|
id: string;
|
|
@@ -10,7 +50,7 @@ export interface OAuthClient extends ProvisioningFields {
|
|
|
10
50
|
redirect_uris: string[];
|
|
11
51
|
allowed_scopes: string[];
|
|
12
52
|
grant_types: string[];
|
|
13
|
-
token_endpoint_auth_method: 'client_secret_basic' | 'client_secret_post' | 'none';
|
|
53
|
+
token_endpoint_auth_method: 'client_secret_basic' | 'client_secret_post' | 'none' | 'private_key_jwt' | 'workload_jwt';
|
|
14
54
|
secret_prefix: string | null;
|
|
15
55
|
/**
|
|
16
56
|
* After a rotation with overlap: when the previous secret stops working (epoch
|
|
@@ -21,6 +61,8 @@ export interface OAuthClient extends ProvisioningFields {
|
|
|
21
61
|
first_party: boolean;
|
|
22
62
|
/** Where the client may send users after an RP-initiated logout. */
|
|
23
63
|
post_logout_redirect_uris: string[];
|
|
64
|
+
/** UMA 2.0 claims-gathering redirect allowlist (exact match). */
|
|
65
|
+
claims_redirect_uris: string[];
|
|
24
66
|
/** Back-channel logout endpoint Atlas POSTs a `logout_token` to, or null. */
|
|
25
67
|
backchannel_logout_uri: string | null;
|
|
26
68
|
/** Whether the back-channel `logout_token` must carry `sid`. */
|
|
@@ -109,6 +151,8 @@ export interface CreateInitialAccessTokenBody {
|
|
|
109
151
|
*/
|
|
110
152
|
export interface OAuthClientLogoutFields {
|
|
111
153
|
post_logout_redirect_uris?: string[];
|
|
154
|
+
/** UMA 2.0 claims-gathering redirect allowlist (exact match). */
|
|
155
|
+
claims_redirect_uris?: string[];
|
|
112
156
|
backchannel_logout_uri?: string | null;
|
|
113
157
|
backchannel_logout_session_required?: boolean;
|
|
114
158
|
frontchannel_logout_uri?: string | null;
|
|
@@ -160,7 +204,7 @@ export interface CreateOAuthClientBody extends ProvisioningInput, OAuthClientLog
|
|
|
160
204
|
redirect_uris: string[];
|
|
161
205
|
allowed_scopes?: string[];
|
|
162
206
|
grant_types?: string[];
|
|
163
|
-
token_endpoint_auth_method?: 'client_secret_basic' | 'client_secret_post' | 'none';
|
|
207
|
+
token_endpoint_auth_method?: 'client_secret_basic' | 'client_secret_post' | 'none' | 'workload_jwt';
|
|
164
208
|
logo_url?: string;
|
|
165
209
|
first_party?: boolean;
|
|
166
210
|
/** How long the issued secret authenticates, in seconds; omit for no expiry. */
|
|
@@ -174,7 +218,7 @@ export interface UpdateOAuthClientBody extends OAuthClientLogoutFields, OAuthCli
|
|
|
174
218
|
name?: string;
|
|
175
219
|
redirect_uris?: string[];
|
|
176
220
|
allowed_scopes?: string[];
|
|
177
|
-
token_endpoint_auth_method?: 'client_secret_basic' | 'client_secret_post' | 'none';
|
|
221
|
+
token_endpoint_auth_method?: 'client_secret_basic' | 'client_secret_post' | 'none' | 'workload_jwt';
|
|
178
222
|
logo_url?: string | null;
|
|
179
223
|
first_party?: boolean;
|
|
180
224
|
/** Refuse every OAuth flow for this client without deleting it. */
|
|
@@ -280,10 +324,50 @@ export declare function oauthClientsResource(request: RequestFn): {
|
|
|
280
324
|
deleted: true;
|
|
281
325
|
note: string;
|
|
282
326
|
}>;
|
|
327
|
+
/**
|
|
328
|
+
* Per-application settings: allowed sign-in methods, hosted-page branding,
|
|
329
|
+
* the user-claim allow-list for ID tokens and userinfo, and writable traits.
|
|
330
|
+
*/
|
|
331
|
+
appSettings: {
|
|
332
|
+
/** `GET /v1/oauth_clients/:id/app_settings` */
|
|
333
|
+
get(id: string): Promise<OAuthClientAppSettings>;
|
|
334
|
+
/** `PATCH /v1/oauth_clients/:id/app_settings` — fields sent replace the stored ones; null clears. */
|
|
335
|
+
update(id: string, body: OAuthClientAppSettingsPatch): Promise<OAuthClientAppSettings>;
|
|
336
|
+
};
|
|
283
337
|
/** The client's back-channel logout delivery log, newest first. */
|
|
284
338
|
listBackchannelDeliveries(id: string, query?: BackchannelDeliveriesQuery): Promise<BackchannelLogoutDeliveryPage>;
|
|
285
339
|
/** Send a test back-channel logout now and return what the receiver answered. */
|
|
286
340
|
testBackchannelLogout(id: string): Promise<BackchannelLogoutTest>;
|
|
341
|
+
/** Set (or clear with null) the URLs of your own sign-in and consent pages for a client. */
|
|
342
|
+
setDelegatedUi(id: string, body: {
|
|
343
|
+
login_url?: string | null;
|
|
344
|
+
consent_url?: string | null;
|
|
345
|
+
}): Promise<{
|
|
346
|
+
object: "oauth_client_delegated_ui";
|
|
347
|
+
client_id: string;
|
|
348
|
+
login_url: string | null;
|
|
349
|
+
consent_url: string | null;
|
|
350
|
+
}>;
|
|
351
|
+
/** Delegated login: read, accept or reject the `login_challenge` your sign-in page received. */
|
|
352
|
+
loginRequests: {
|
|
353
|
+
get(loginChallenge: string): Promise<DelegatedLoginRequest>;
|
|
354
|
+
accept(loginChallenge: string, body: {
|
|
355
|
+
subject: string;
|
|
356
|
+
remember?: boolean;
|
|
357
|
+
amr?: string[];
|
|
358
|
+
acr?: string;
|
|
359
|
+
}): Promise<DelegatedRedirect>;
|
|
360
|
+
reject(loginChallenge: string, body?: DelegatedReject): Promise<DelegatedRedirect>;
|
|
361
|
+
};
|
|
362
|
+
/** Delegated consent: read, accept or reject the `consent_challenge` your consent page received. */
|
|
363
|
+
consentRequests: {
|
|
364
|
+
get(consentChallenge: string): Promise<DelegatedConsentRequest>;
|
|
365
|
+
accept(consentChallenge: string, body?: {
|
|
366
|
+
grant_scope?: string[];
|
|
367
|
+
remember?: boolean;
|
|
368
|
+
}): Promise<DelegatedRedirect>;
|
|
369
|
+
reject(consentChallenge: string, body?: DelegatedReject): Promise<DelegatedRedirect>;
|
|
370
|
+
};
|
|
287
371
|
/** RFC 7591 §3 initial access tokens for dynamic client registration. */
|
|
288
372
|
initialAccessTokens: {
|
|
289
373
|
list(): Promise<ListPage<OAuthInitialAccessToken>>;
|
|
@@ -294,6 +378,26 @@ export declare function oauthClientsResource(request: RequestFn): {
|
|
|
294
378
|
}>;
|
|
295
379
|
revoke(id: string): Promise<OAuthInitialAccessToken>;
|
|
296
380
|
};
|
|
381
|
+
/** Issuers whose signed tokens this client accepts (jwt-bearer grant, workload identity). */
|
|
382
|
+
trustedIssuers: {
|
|
383
|
+
list(clientId: string): Promise<ListPage<TrustedIssuer>>;
|
|
384
|
+
create(clientId: string, body: TrustedIssuerInput): Promise<TrustedIssuer>;
|
|
385
|
+
delete(clientId: string, issuerId: string): Promise<{
|
|
386
|
+
object: "oauth_trusted_issuer";
|
|
387
|
+
id: string;
|
|
388
|
+
deleted: true;
|
|
389
|
+
}>;
|
|
390
|
+
};
|
|
391
|
+
/** Workload identity federation helpers (SPIFFE, Kubernetes, GitHub Actions, GCP, Azure). */
|
|
392
|
+
workloadIdentity: {
|
|
393
|
+
presets(): Promise<ListPage<WorkloadPreset>>;
|
|
394
|
+
cloudTrust(query: {
|
|
395
|
+
provider: "aws" | "gcp" | "azure";
|
|
396
|
+
audience: string;
|
|
397
|
+
subject: string;
|
|
398
|
+
tenant_id?: string;
|
|
399
|
+
}): Promise<Record<string, unknown>>;
|
|
400
|
+
};
|
|
297
401
|
grants: {
|
|
298
402
|
list(clientId: string): Promise<ListPage<ClientGrant>>;
|
|
299
403
|
create(clientId: string, body: {
|
|
@@ -307,3 +411,83 @@ export declare function oauthClientsResource(request: RequestFn): {
|
|
|
307
411
|
}>;
|
|
308
412
|
};
|
|
309
413
|
};
|
|
414
|
+
export interface OAuthClientAppBranding {
|
|
415
|
+
heading?: string | null;
|
|
416
|
+
subheading?: string | null;
|
|
417
|
+
logo_url?: string | null;
|
|
418
|
+
primary_color?: string | null;
|
|
419
|
+
}
|
|
420
|
+
export interface OAuthClientAppSettingsPatch {
|
|
421
|
+
/** Method names (password, passkey, oauth_google, ...) or the families oauth and enterprise_sso. */
|
|
422
|
+
allowed_sign_in_methods?: string[] | null;
|
|
423
|
+
branding?: OAuthClientAppBranding | null;
|
|
424
|
+
/** User claims the app receives in ID tokens and userinfo; protocol claims always pass. */
|
|
425
|
+
claims_allowlist?: string[] | null;
|
|
426
|
+
/** Traits a session from this app may change. */
|
|
427
|
+
writable_traits?: string[] | null;
|
|
428
|
+
/** Overrides of the instance's risk-based MFA for sign-ins to this app. */
|
|
429
|
+
risk?: OAuthClientAppRisk | null;
|
|
430
|
+
}
|
|
431
|
+
export type OAuthClientRiskLevelAction = 'default' | 'allow' | 'notify' | 'mfa' | 'block';
|
|
432
|
+
export interface OAuthClientAppRisk {
|
|
433
|
+
enabled?: boolean | null;
|
|
434
|
+
mode?: 'enforce' | 'audit' | null;
|
|
435
|
+
step_up_threshold?: 'low' | 'medium' | 'high' | null;
|
|
436
|
+
on_high_risk_no_factor?: 'allow' | 'block' | 'require_enroll' | null;
|
|
437
|
+
level_actions?: {
|
|
438
|
+
medium?: OAuthClientRiskLevelAction | null;
|
|
439
|
+
high?: OAuthClientRiskLevelAction | null;
|
|
440
|
+
} | null;
|
|
441
|
+
/** The refresh-time check for sessions that came from this app. */
|
|
442
|
+
mid_session?: {
|
|
443
|
+
enabled?: boolean | null;
|
|
444
|
+
action?: 'revoke' | 'notify' | 'audit' | null;
|
|
445
|
+
} | null;
|
|
446
|
+
}
|
|
447
|
+
export interface OAuthClientAppSettings {
|
|
448
|
+
object: 'app_settings';
|
|
449
|
+
client_id: string;
|
|
450
|
+
allowed_sign_in_methods: string[] | null;
|
|
451
|
+
branding: Required<OAuthClientAppBranding> | null;
|
|
452
|
+
claims_allowlist: string[] | null;
|
|
453
|
+
writable_traits: string[] | null;
|
|
454
|
+
risk: OAuthClientAppRisk | null;
|
|
455
|
+
}
|
|
456
|
+
export interface DelegatedClientRef {
|
|
457
|
+
id: string;
|
|
458
|
+
client_id: string;
|
|
459
|
+
name: string;
|
|
460
|
+
first_party?: boolean;
|
|
461
|
+
}
|
|
462
|
+
export interface DelegatedLoginRequest {
|
|
463
|
+
object: 'oauth_login_request';
|
|
464
|
+
client: DelegatedClientRef;
|
|
465
|
+
requested_scope: string[];
|
|
466
|
+
audience: string | null;
|
|
467
|
+
page: 'sign-in' | 'sign-up';
|
|
468
|
+
/** The Atlas user already signed in on this browser, if any. */
|
|
469
|
+
session_subject: string | null;
|
|
470
|
+
ui_locales: string | null;
|
|
471
|
+
login_hint: string | null;
|
|
472
|
+
expires_at: number;
|
|
473
|
+
}
|
|
474
|
+
export interface DelegatedConsentRequest {
|
|
475
|
+
object: 'oauth_consent_request';
|
|
476
|
+
subject: string;
|
|
477
|
+
client: DelegatedClientRef;
|
|
478
|
+
requested_scope: string[];
|
|
479
|
+
audience: string | null;
|
|
480
|
+
authorization_details: unknown[];
|
|
481
|
+
organization_id: string | null;
|
|
482
|
+
redirect_uri: string;
|
|
483
|
+
expires_at: number;
|
|
484
|
+
}
|
|
485
|
+
export interface DelegatedRedirect {
|
|
486
|
+
object: 'oauth_login_redirect' | 'oauth_consent_redirect';
|
|
487
|
+
/** Send the end user's browser here next. */
|
|
488
|
+
redirect_to: string;
|
|
489
|
+
}
|
|
490
|
+
export interface DelegatedReject {
|
|
491
|
+
error?: 'access_denied' | 'login_required' | 'interaction_required' | 'consent_required' | 'account_selection_required' | 'unauthorized_client' | 'temporarily_unavailable' | 'server_error';
|
|
492
|
+
error_description?: string;
|
|
493
|
+
}
|
|
@@ -37,6 +37,20 @@ function oauthClientsResource(request) {
|
|
|
37
37
|
delete(id) {
|
|
38
38
|
return request({ method: 'DELETE', path: `/v1/oauth_clients/${(0, request_1.enc)(id)}` });
|
|
39
39
|
},
|
|
40
|
+
/**
|
|
41
|
+
* Per-application settings: allowed sign-in methods, hosted-page branding,
|
|
42
|
+
* the user-claim allow-list for ID tokens and userinfo, and writable traits.
|
|
43
|
+
*/
|
|
44
|
+
appSettings: {
|
|
45
|
+
/** `GET /v1/oauth_clients/:id/app_settings` */
|
|
46
|
+
get(id) {
|
|
47
|
+
return request({ method: 'GET', path: `/v1/oauth_clients/${(0, request_1.enc)(id)}/app_settings` });
|
|
48
|
+
},
|
|
49
|
+
/** `PATCH /v1/oauth_clients/:id/app_settings` — fields sent replace the stored ones; null clears. */
|
|
50
|
+
update(id, body) {
|
|
51
|
+
return request({ method: 'PATCH', path: `/v1/oauth_clients/${(0, request_1.enc)(id)}/app_settings`, body });
|
|
52
|
+
},
|
|
53
|
+
},
|
|
40
54
|
/** The client's back-channel logout delivery log, newest first. */
|
|
41
55
|
listBackchannelDeliveries(id, query = {}) {
|
|
42
56
|
return request({
|
|
@@ -49,6 +63,34 @@ function oauthClientsResource(request) {
|
|
|
49
63
|
testBackchannelLogout(id) {
|
|
50
64
|
return request({ method: 'POST', path: `/v1/oauth_clients/${(0, request_1.enc)(id)}/backchannel_logout/test` });
|
|
51
65
|
},
|
|
66
|
+
/** Set (or clear with null) the URLs of your own sign-in and consent pages for a client. */
|
|
67
|
+
setDelegatedUi(id, body) {
|
|
68
|
+
return request({ method: 'PUT', path: `/v1/oauth_clients/${(0, request_1.enc)(id)}/delegated_ui`, body });
|
|
69
|
+
},
|
|
70
|
+
/** Delegated login: read, accept or reject the `login_challenge` your sign-in page received. */
|
|
71
|
+
loginRequests: {
|
|
72
|
+
get(loginChallenge) {
|
|
73
|
+
return request({ method: 'GET', path: '/v1/oauth_login_requests', query: { login_challenge: loginChallenge } });
|
|
74
|
+
},
|
|
75
|
+
accept(loginChallenge, body) {
|
|
76
|
+
return request({ method: 'PUT', path: '/v1/oauth_login_requests/accept', query: { login_challenge: loginChallenge }, body });
|
|
77
|
+
},
|
|
78
|
+
reject(loginChallenge, body = {}) {
|
|
79
|
+
return request({ method: 'PUT', path: '/v1/oauth_login_requests/reject', query: { login_challenge: loginChallenge }, body });
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
/** Delegated consent: read, accept or reject the `consent_challenge` your consent page received. */
|
|
83
|
+
consentRequests: {
|
|
84
|
+
get(consentChallenge) {
|
|
85
|
+
return request({ method: 'GET', path: '/v1/oauth_consent_requests', query: { consent_challenge: consentChallenge } });
|
|
86
|
+
},
|
|
87
|
+
accept(consentChallenge, body = {}) {
|
|
88
|
+
return request({ method: 'PUT', path: '/v1/oauth_consent_requests/accept', query: { consent_challenge: consentChallenge }, body });
|
|
89
|
+
},
|
|
90
|
+
reject(consentChallenge, body = {}) {
|
|
91
|
+
return request({ method: 'PUT', path: '/v1/oauth_consent_requests/reject', query: { consent_challenge: consentChallenge }, body });
|
|
92
|
+
},
|
|
93
|
+
},
|
|
52
94
|
/** RFC 7591 §3 initial access tokens for dynamic client registration. */
|
|
53
95
|
initialAccessTokens: {
|
|
54
96
|
list() {
|
|
@@ -62,6 +104,28 @@ function oauthClientsResource(request) {
|
|
|
62
104
|
return request({ method: 'DELETE', path: `/v1/oauth_initial_access_tokens/${(0, request_1.enc)(id)}` });
|
|
63
105
|
},
|
|
64
106
|
},
|
|
107
|
+
/** Issuers whose signed tokens this client accepts (jwt-bearer grant, workload identity). */
|
|
108
|
+
trustedIssuers: {
|
|
109
|
+
list(clientId) {
|
|
110
|
+
return request({ method: 'GET', path: `/v1/oauth_clients/${(0, request_1.enc)(clientId)}/trusted_issuers` });
|
|
111
|
+
},
|
|
112
|
+
create(clientId, body) {
|
|
113
|
+
return request({ method: 'POST', path: `/v1/oauth_clients/${(0, request_1.enc)(clientId)}/trusted_issuers`, body });
|
|
114
|
+
},
|
|
115
|
+
delete(clientId, issuerId) {
|
|
116
|
+
return request({ method: 'DELETE', path: `/v1/oauth_clients/${(0, request_1.enc)(clientId)}/trusted_issuers/${(0, request_1.enc)(issuerId)}` });
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
/** Workload identity federation helpers (SPIFFE, Kubernetes, GitHub Actions, GCP, Azure). */
|
|
120
|
+
workloadIdentity: {
|
|
121
|
+
presets() {
|
|
122
|
+
return request({ method: 'GET', path: '/v1/workload_identity/presets' });
|
|
123
|
+
},
|
|
124
|
+
cloudTrust(query) {
|
|
125
|
+
const qs = new URLSearchParams(query).toString();
|
|
126
|
+
return request({ method: 'GET', path: `/v1/workload_identity/cloud_trust?${qs}` });
|
|
127
|
+
},
|
|
128
|
+
},
|
|
65
129
|
grants: {
|
|
66
130
|
list(clientId) {
|
|
67
131
|
return request({ method: 'GET', path: `/v1/oauth_clients/${(0, request_1.enc)(clientId)}/grants` });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-clients.js","sourceRoot":"","sources":["../../src/client/oauth-clients.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"oauth-clients.js","sourceRoot":"","sources":["../../src/client/oauth-clients.ts"],"names":[],"mappings":"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"}
|
package/dist/client/openfga.d.ts
CHANGED
|
@@ -16,6 +16,17 @@ export interface OpenFgaTupleKey {
|
|
|
16
16
|
user: string;
|
|
17
17
|
relation: string;
|
|
18
18
|
object: string;
|
|
19
|
+
/** A model condition the tuple is bound to. */
|
|
20
|
+
condition?: {
|
|
21
|
+
name: string;
|
|
22
|
+
context?: Record<string, unknown>;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/** OpenFGA's `consistency` enum plus Atlas's consistency token (see ListUsers/Check docs). */
|
|
26
|
+
export interface OpenFgaConsistencyOptions {
|
|
27
|
+
consistency?: 'UNSPECIFIED' | 'MINIMIZE_LATENCY' | 'HIGHER_CONSISTENCY';
|
|
28
|
+
/** A token from a write; the read reflects at least that write. Also sent as the `Atlas-Consistency-Token` header. */
|
|
29
|
+
consistency_token?: string;
|
|
19
30
|
}
|
|
20
31
|
/** Contextual tuples: either the OpenFGA `{ tuple_keys }` wrapper or a bare array. */
|
|
21
32
|
export type OpenFgaContextualTuples = {
|
|
@@ -38,18 +49,21 @@ export interface WriteOpenFgaModelBody {
|
|
|
38
49
|
dsl?: string;
|
|
39
50
|
[key: string]: unknown;
|
|
40
51
|
}
|
|
41
|
-
export interface OpenFgaCheckBody {
|
|
52
|
+
export interface OpenFgaCheckBody extends OpenFgaConsistencyOptions {
|
|
42
53
|
tuple_key: OpenFgaTupleKey;
|
|
43
54
|
authorization_model_id?: string;
|
|
44
55
|
contextual_tuples?: OpenFgaContextualTuples;
|
|
56
|
+
/** Values for condition parameters. */
|
|
57
|
+
context?: Record<string, unknown>;
|
|
45
58
|
}
|
|
46
59
|
export interface OpenFgaBatchCheckItem {
|
|
47
60
|
tuple_key: OpenFgaTupleKey;
|
|
48
61
|
/** Keys the result; defaults to the item's index. */
|
|
49
62
|
correlation_id?: string;
|
|
50
63
|
contextual_tuples?: OpenFgaContextualTuples;
|
|
64
|
+
context?: Record<string, unknown>;
|
|
51
65
|
}
|
|
52
|
-
export interface OpenFgaBatchCheckBody {
|
|
66
|
+
export interface OpenFgaBatchCheckBody extends OpenFgaConsistencyOptions {
|
|
53
67
|
/** 1–100 checks. */
|
|
54
68
|
checks: OpenFgaBatchCheckItem[];
|
|
55
69
|
authorization_model_id?: string;
|
|
@@ -61,13 +75,74 @@ export interface OpenFgaExpandBody {
|
|
|
61
75
|
};
|
|
62
76
|
authorization_model_id?: string;
|
|
63
77
|
}
|
|
64
|
-
export interface OpenFgaListObjectsBody {
|
|
78
|
+
export interface OpenFgaListObjectsBody extends OpenFgaConsistencyOptions {
|
|
65
79
|
/** Object type, e.g. `document`. */
|
|
66
80
|
type: string;
|
|
67
81
|
relation: string;
|
|
68
82
|
user: string;
|
|
69
83
|
authorization_model_id?: string;
|
|
70
84
|
contextual_tuples?: OpenFgaContextualTuples;
|
|
85
|
+
context?: Record<string, unknown>;
|
|
86
|
+
}
|
|
87
|
+
export interface OpenFgaListUsersBody extends OpenFgaConsistencyOptions {
|
|
88
|
+
object: {
|
|
89
|
+
type: string;
|
|
90
|
+
id: string;
|
|
91
|
+
};
|
|
92
|
+
relation: string;
|
|
93
|
+
/** Exactly one filter; add `relation` to get usersets. */
|
|
94
|
+
user_filters: [{
|
|
95
|
+
type: string;
|
|
96
|
+
relation?: string;
|
|
97
|
+
}];
|
|
98
|
+
authorization_model_id?: string;
|
|
99
|
+
contextual_tuples?: OpenFgaContextualTuples;
|
|
100
|
+
context?: Record<string, unknown>;
|
|
101
|
+
/** Atlas extension: 1–1000, default 1000. */
|
|
102
|
+
page_size?: number;
|
|
103
|
+
/** Atlas extension: the previous page's `continuation_token`. */
|
|
104
|
+
continuation_token?: string;
|
|
105
|
+
}
|
|
106
|
+
/** One listed user: a person/thing, a userset, or the public wildcard. */
|
|
107
|
+
export type OpenFgaListedUser = {
|
|
108
|
+
object: {
|
|
109
|
+
type: string;
|
|
110
|
+
id: string;
|
|
111
|
+
};
|
|
112
|
+
} | {
|
|
113
|
+
userset: {
|
|
114
|
+
type: string;
|
|
115
|
+
id: string;
|
|
116
|
+
relation: string;
|
|
117
|
+
};
|
|
118
|
+
} | {
|
|
119
|
+
wildcard: {
|
|
120
|
+
type: string;
|
|
121
|
+
};
|
|
122
|
+
};
|
|
123
|
+
export interface OpenFgaListUsersResult {
|
|
124
|
+
users: OpenFgaListedUser[];
|
|
125
|
+
excluded_users: Array<{
|
|
126
|
+
object: {
|
|
127
|
+
type: string;
|
|
128
|
+
id: string;
|
|
129
|
+
};
|
|
130
|
+
}>;
|
|
131
|
+
/** Empty on the last page. */
|
|
132
|
+
continuation_token: string;
|
|
133
|
+
}
|
|
134
|
+
export interface OpenFgaReadChangesParams {
|
|
135
|
+
type?: string;
|
|
136
|
+
/** 1–100, default 50. */
|
|
137
|
+
page_size?: number;
|
|
138
|
+
continuation_token?: string;
|
|
139
|
+
/** RFC 3339. */
|
|
140
|
+
start_time?: string;
|
|
141
|
+
}
|
|
142
|
+
export interface OpenFgaTupleChange {
|
|
143
|
+
tuple_key: OpenFgaTupleKey;
|
|
144
|
+
operation: 'TUPLE_OPERATION_WRITE' | 'TUPLE_OPERATION_DELETE';
|
|
145
|
+
timestamp: string;
|
|
71
146
|
}
|
|
72
147
|
export interface OpenFgaReadBody {
|
|
73
148
|
/** Optional filter; `object` may be a full `type:id` or a bare `type:` prefix. */
|
|
@@ -128,6 +203,18 @@ export declare function openfgaResource(request: RequestFn): {
|
|
|
128
203
|
listObjects(store: string, body: OpenFgaListObjectsBody): Promise<{
|
|
129
204
|
objects: string[];
|
|
130
205
|
}>;
|
|
206
|
+
/**
|
|
207
|
+
* Who has `relation` on `object` (OpenFGA ListUsers): users, usersets and the
|
|
208
|
+
* wildcard with `excluded_users`. One page — see {@link listAllUsers}.
|
|
209
|
+
*/
|
|
210
|
+
listUsers(store: string, body: OpenFgaListUsersBody): Promise<OpenFgaListUsersResult>;
|
|
211
|
+
/** {@link listUsers} following `continuation_token` until every page is collected. */
|
|
212
|
+
listAllUsers(store: string, body: OpenFgaListUsersBody): Promise<OpenFgaListUsersResult>;
|
|
213
|
+
/** The tuple change log (OpenFGA ReadChanges); the token also resumes after the last page. */
|
|
214
|
+
readChanges(store: string, params?: OpenFgaReadChangesParams): Promise<{
|
|
215
|
+
changes: OpenFgaTupleChange[];
|
|
216
|
+
continuation_token: string;
|
|
217
|
+
}>;
|
|
131
218
|
read(store: string, body?: OpenFgaReadBody): Promise<{
|
|
132
219
|
tuples: OpenFgaTuple[];
|
|
133
220
|
continuation_token: string;
|
package/dist/client/openfga.js
CHANGED
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.openfgaResource = openfgaResource;
|
|
4
4
|
const request_1 = require("./request");
|
|
5
5
|
function openfgaResource(request) {
|
|
6
|
-
|
|
6
|
+
const api = {
|
|
7
7
|
stores: {
|
|
8
8
|
list() {
|
|
9
9
|
return request({ method: 'GET', path: '/v1/openfga/stores' });
|
|
@@ -60,6 +60,31 @@ function openfgaResource(request) {
|
|
|
60
60
|
body,
|
|
61
61
|
});
|
|
62
62
|
},
|
|
63
|
+
/**
|
|
64
|
+
* Who has `relation` on `object` (OpenFGA ListUsers): users, usersets and the
|
|
65
|
+
* wildcard with `excluded_users`. One page — see {@link listAllUsers}.
|
|
66
|
+
*/
|
|
67
|
+
listUsers(store, body) {
|
|
68
|
+
return request({ method: 'POST', path: `/v1/openfga/stores/${(0, request_1.enc)(store)}/list-users`, body });
|
|
69
|
+
},
|
|
70
|
+
/** {@link listUsers} following `continuation_token` until every page is collected. */
|
|
71
|
+
async listAllUsers(store, body) {
|
|
72
|
+
let page = await api.listUsers(store, body);
|
|
73
|
+
const users = [...page.users];
|
|
74
|
+
while (page.continuation_token) {
|
|
75
|
+
page = await api.listUsers(store, { ...body, continuation_token: page.continuation_token });
|
|
76
|
+
users.push(...page.users);
|
|
77
|
+
}
|
|
78
|
+
return { ...page, users };
|
|
79
|
+
},
|
|
80
|
+
/** The tuple change log (OpenFGA ReadChanges); the token also resumes after the last page. */
|
|
81
|
+
readChanges(store, params = {}) {
|
|
82
|
+
return request({
|
|
83
|
+
method: 'GET',
|
|
84
|
+
path: `/v1/openfga/stores/${(0, request_1.enc)(store)}/changes`,
|
|
85
|
+
query: { ...params },
|
|
86
|
+
});
|
|
87
|
+
},
|
|
63
88
|
read(store, body = {}) {
|
|
64
89
|
return request({ method: 'POST', path: `/v1/openfga/stores/${(0, request_1.enc)(store)}/read`, body });
|
|
65
90
|
},
|
|
@@ -68,5 +93,6 @@ function openfgaResource(request) {
|
|
|
68
93
|
return request({ method: 'POST', path: `/v1/openfga/stores/${(0, request_1.enc)(store)}/write`, body });
|
|
69
94
|
},
|
|
70
95
|
};
|
|
96
|
+
return api;
|
|
71
97
|
}
|
|
72
98
|
//# sourceMappingURL=openfga.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openfga.js","sourceRoot":"","sources":["../../src/client/openfga.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"openfga.js","sourceRoot":"","sources":["../../src/client/openfga.ts"],"names":[],"mappings":"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"}
|