@atlasauth/backend 0.2.0 → 0.5.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/dist/client/api-keys.d.ts +50 -1
- package/dist/client/api-keys.js +14 -0
- package/dist/client/api-keys.js.map +1 -1
- package/dist/client/index.d.ts +40 -2
- package/dist/client/index.js +4 -0
- package/dist/client/index.js.map +1 -1
- package/dist/client/machines.d.ts +183 -0
- package/dist/client/machines.js +73 -0
- package/dist/client/machines.js.map +1 -0
- package/dist/client/messaging.d.ts +287 -21
- package/dist/client/messaging.js +18 -6
- package/dist/client/messaging.js.map +1 -1
- package/dist/discovery.d.ts +49 -0
- package/dist/discovery.js +143 -0
- package/dist/discovery.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +15 -1
- package/dist/index.js.map +1 -1
- package/dist/jwks-cache.d.ts +8 -0
- package/dist/jwks-cache.js +20 -3
- package/dist/jwks-cache.js.map +1 -1
- package/dist/pca/require-pca.d.ts +47 -0
- package/dist/pca/require-pca.js +121 -0
- package/dist/pca/require-pca.js.map +1 -0
- package/dist/pca/verify.d.ts +36 -0
- package/dist/pca/verify.js +136 -0
- package/dist/pca/verify.js.map +1 -0
- package/dist/verify.d.ts +19 -3
- package/dist/verify.js +27 -5
- package/dist/verify.js.map +1 -1
- package/package.json +3 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type RequestFn } from './request';
|
|
2
|
-
import type { ListPage } from './types';
|
|
2
|
+
import type { CursorPage, ListPage } from './types';
|
|
3
3
|
export type ApiKeySubjectType = 'user' | 'organization';
|
|
4
4
|
/**
|
|
5
5
|
* An end-user API key — Clerk `api_keys` parity. A tenant mints these for ITS OWN
|
|
@@ -56,6 +56,45 @@ export type ApiKeyVerification = {
|
|
|
56
56
|
claims: Record<string, unknown>;
|
|
57
57
|
last_used_at: number | null;
|
|
58
58
|
};
|
|
59
|
+
/**
|
|
60
|
+
* §P1-8 a short-lived, offline-verifiable access JWT minted from a long-lived
|
|
61
|
+
* `ak_` key (`POST /v1/api_keys/token`). Signed with the instance's RS256 key, so
|
|
62
|
+
* any resource server verifies it against the public JWKS without a round trip.
|
|
63
|
+
*/
|
|
64
|
+
export interface ApiKeyToken {
|
|
65
|
+
object: 'api_key_token';
|
|
66
|
+
token: string;
|
|
67
|
+
token_type: 'Bearer';
|
|
68
|
+
jti: string;
|
|
69
|
+
key_id: string;
|
|
70
|
+
subject_type: ApiKeySubjectType;
|
|
71
|
+
subject_id: string;
|
|
72
|
+
scopes: string[];
|
|
73
|
+
constraints: Record<string, unknown>;
|
|
74
|
+
expires_in: number;
|
|
75
|
+
expires_at: number;
|
|
76
|
+
/** Which JWKS/issuer a verifier should check, so it needn't parse the JWT first. */
|
|
77
|
+
issuer: string;
|
|
78
|
+
}
|
|
79
|
+
export interface MintApiKeyTokenBody {
|
|
80
|
+
/** The long-lived `ak_` secret to mint from. */
|
|
81
|
+
secret: string;
|
|
82
|
+
/** Requested lifetime; clamped to the key's ceiling, its expiry, and the global cap. */
|
|
83
|
+
ttl_seconds?: number;
|
|
84
|
+
audience?: string | string[];
|
|
85
|
+
}
|
|
86
|
+
/** One entry in the revocation feed: an id and when it was revoked. */
|
|
87
|
+
export interface RevokedApiKeyRef {
|
|
88
|
+
object: 'api_key';
|
|
89
|
+
id: string;
|
|
90
|
+
revoked_at: number | null;
|
|
91
|
+
}
|
|
92
|
+
export interface ListRevokedApiKeysQuery {
|
|
93
|
+
/** An ISO-8601 instant, epoch-millis, or a `next_cursor` from a previous page. */
|
|
94
|
+
since?: string;
|
|
95
|
+
/** Page size (server clamps to its own maximum). */
|
|
96
|
+
limit?: number;
|
|
97
|
+
}
|
|
59
98
|
export declare function apiKeysResource(request: RequestFn): {
|
|
60
99
|
/** Optionally narrowed to one subject. */
|
|
61
100
|
list(query?: {
|
|
@@ -74,4 +113,14 @@ export declare function apiKeysResource(request: RequestFn): {
|
|
|
74
113
|
id: string;
|
|
75
114
|
revoked: true;
|
|
76
115
|
}>;
|
|
116
|
+
/**
|
|
117
|
+
* §P1-8 mint a short-lived delegated token from an `ak_` key. Rate-limited —
|
|
118
|
+
* presenting the secret is the same online credential surface as verify.
|
|
119
|
+
*/
|
|
120
|
+
mintToken(body: MintApiKeyTokenBody): Promise<ApiKeyToken>;
|
|
121
|
+
/**
|
|
122
|
+
* §P1-8 the revocation feed a resource server polls to deny-list revoked keys
|
|
123
|
+
* while their delegated tokens are still live. Keyset-paginated via `since`.
|
|
124
|
+
*/
|
|
125
|
+
listRevoked(query?: ListRevokedApiKeysQuery): Promise<CursorPage<RevokedApiKeyRef>>;
|
|
77
126
|
};
|
package/dist/client/api-keys.js
CHANGED
|
@@ -26,6 +26,20 @@ function apiKeysResource(request) {
|
|
|
26
26
|
delete(id) {
|
|
27
27
|
return request({ method: 'DELETE', path: `/v1/api_keys/${(0, request_1.enc)(id)}` });
|
|
28
28
|
},
|
|
29
|
+
/**
|
|
30
|
+
* §P1-8 mint a short-lived delegated token from an `ak_` key. Rate-limited —
|
|
31
|
+
* presenting the secret is the same online credential surface as verify.
|
|
32
|
+
*/
|
|
33
|
+
mintToken(body) {
|
|
34
|
+
return request({ method: 'POST', path: '/v1/api_keys/token', body });
|
|
35
|
+
},
|
|
36
|
+
/**
|
|
37
|
+
* §P1-8 the revocation feed a resource server polls to deny-list revoked keys
|
|
38
|
+
* while their delegated tokens are still live. Keyset-paginated via `since`.
|
|
39
|
+
*/
|
|
40
|
+
listRevoked(query = {}) {
|
|
41
|
+
return request({ method: 'GET', path: '/v1/api_keys/revoked', query: { ...query } });
|
|
42
|
+
},
|
|
29
43
|
};
|
|
30
44
|
}
|
|
31
45
|
//# sourceMappingURL=api-keys.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-keys.js","sourceRoot":"","sources":["../../src/client/api-keys.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"api-keys.js","sourceRoot":"","sources":["../../src/client/api-keys.ts"],"names":[],"mappings":";;AA2GA,0CA0CC;AArJD,uCAAgD;AA2GhD,SAAgB,eAAe,CAAC,OAAkB;IAChD,OAAO;QACL,0CAA0C;QAC1C,IAAI,CAAC,KAGJ;YACC,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,qDAAqD;QACrD,MAAM,CAAC,IAAsB,EAAE,cAAuB;YACpD,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QACjF,CAAC;QACD,iFAAiF;QACjF,MAAM,CAAC,MAAc;YACnB,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QACpF,CAAC;QACD,GAAG,CAAC,EAAU;YACZ,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,gBAAgB,IAAA,aAAG,EAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACrE,CAAC;QACD,MAAM,CAAC,EAAU,EAAE,IAAsB;YACvC,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,gBAAgB,IAAA,aAAG,EAAC,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7E,CAAC;QACD,sEAAsE;QACtE,MAAM,CAAC,EAAU;YACf,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,gBAAgB,IAAA,aAAG,EAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACxE,CAAC;QACD;;;WAGG;QACH,SAAS,CAAC,IAAyB;YACjC,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAAC,CAAC;QACvE,CAAC;QACD;;;WAGG;QACH,WAAW,CAAC,QAAiC,EAAE;YAC7C,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,sBAAsB,EAAE,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,CAAC,CAAC;QACvF,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/client/index.d.ts
CHANGED
|
@@ -390,6 +390,33 @@ export declare function createAtlasClient(config: AtlasClientConfig): {
|
|
|
390
390
|
id: string;
|
|
391
391
|
revoked: true;
|
|
392
392
|
}>;
|
|
393
|
+
mintToken(body: import("./api-keys").MintApiKeyTokenBody): Promise<import("./api-keys").ApiKeyToken>;
|
|
394
|
+
listRevoked(query?: import("./api-keys").ListRevokedApiKeysQuery): Promise<import("./types").CursorPage<import("./api-keys").RevokedApiKeyRef>>;
|
|
395
|
+
};
|
|
396
|
+
machines: {
|
|
397
|
+
list(query?: import("./machines").ListMachinesQuery): Promise<import("./machines").MachineListPage>;
|
|
398
|
+
create(body: import("./machines").CreateMachineBody, idempotencyKey?: string): Promise<import("./machines").MachineWithSecret>;
|
|
399
|
+
get(id: string): Promise<import("./machines").Machine>;
|
|
400
|
+
rename(id: string, name: string): Promise<import("./machines").Machine>;
|
|
401
|
+
patchMetadata(id: string, metadata: import("./machines").MachineMetadata): Promise<import("./machines").Machine>;
|
|
402
|
+
approve(id: string): Promise<import("./machines").Machine>;
|
|
403
|
+
revoke(id: string): Promise<import("./machines").Machine>;
|
|
404
|
+
rotateSecret(id: string): Promise<import("./machines").MachineWithSecret>;
|
|
405
|
+
rotateKey(id: string, publicKeyPem: string): Promise<import("./machines").Machine>;
|
|
406
|
+
delete(id: string): Promise<{
|
|
407
|
+
object: "machine";
|
|
408
|
+
id: string;
|
|
409
|
+
deleted: true;
|
|
410
|
+
}>;
|
|
411
|
+
organizationMemberships(id: string): Promise<import("./machines").MachineOrganizationMembershipPage>;
|
|
412
|
+
createEnrolmentToken(body?: import("./machines").CreateEnrolmentTokenBody, idempotencyKey?: string): Promise<import("./machines").MachineEnrolmentTokenWithSecret>;
|
|
413
|
+
listEnrolmentTokens(): Promise<import("./types").ListPage<import("./machines").MachineEnrolmentToken>>;
|
|
414
|
+
deleteEnrolmentToken(id: string): Promise<{
|
|
415
|
+
object: "machine_enrolment_token";
|
|
416
|
+
id: string;
|
|
417
|
+
deleted: true;
|
|
418
|
+
}>;
|
|
419
|
+
verifyM2mToken(token: string): Promise<import("./machines").M2mTokenVerification>;
|
|
393
420
|
};
|
|
394
421
|
oauthProviders: {
|
|
395
422
|
list(): Promise<import("./types").ListPage<import("./oauth-providers").OAuthProvider>>;
|
|
@@ -654,8 +681,18 @@ export declare function createAtlasClient(config: AtlasClientConfig): {
|
|
|
654
681
|
};
|
|
655
682
|
messaging: {
|
|
656
683
|
get(): Promise<import("./messaging").MessagingProviders>;
|
|
657
|
-
setEmail
|
|
658
|
-
|
|
684
|
+
setEmail: {
|
|
685
|
+
(body: import("./messaging").EmailProviderInput): Promise<import("./messaging").EmailProvider>;
|
|
686
|
+
<T extends string>(body: Omit<import("./messaging").MessagingProviderInput, "transport"> & {
|
|
687
|
+
transport: T;
|
|
688
|
+
} & (string extends T ? unknown : never)): Promise<import("./messaging").MessagingProvider>;
|
|
689
|
+
};
|
|
690
|
+
setSms: {
|
|
691
|
+
(body: import("./messaging").SmsProviderInput): Promise<import("./messaging").SmsProvider>;
|
|
692
|
+
<T extends string>(body: Omit<import("./messaging").MessagingProviderInput, "transport"> & {
|
|
693
|
+
transport: T;
|
|
694
|
+
} & (string extends T ? unknown : never)): Promise<import("./messaging").MessagingProvider>;
|
|
695
|
+
};
|
|
659
696
|
deleteChannel(channel: "email" | "sms"): Promise<import("./messaging").DeletedMessagingProvider>;
|
|
660
697
|
test(channel: "email" | "sms", body: {
|
|
661
698
|
to: string;
|
|
@@ -773,6 +810,7 @@ export * from './sign-in-tokens';
|
|
|
773
810
|
export * from './audit-logs';
|
|
774
811
|
export * from './jwt-templates';
|
|
775
812
|
export * from './api-keys';
|
|
813
|
+
export * from './machines';
|
|
776
814
|
export * from './oauth-providers';
|
|
777
815
|
export * from './sso-onboarding';
|
|
778
816
|
export * from './scim-provisioning';
|
package/dist/client/index.js
CHANGED
|
@@ -36,6 +36,7 @@ const sign_in_tokens_1 = require("./sign-in-tokens");
|
|
|
36
36
|
const audit_logs_1 = require("./audit-logs");
|
|
37
37
|
const jwt_templates_1 = require("./jwt-templates");
|
|
38
38
|
const api_keys_1 = require("./api-keys");
|
|
39
|
+
const machines_1 = require("./machines");
|
|
39
40
|
const oauth_providers_1 = require("./oauth-providers");
|
|
40
41
|
const sso_onboarding_1 = require("./sso-onboarding");
|
|
41
42
|
const scim_provisioning_1 = require("./scim-provisioning");
|
|
@@ -94,6 +95,8 @@ function createAtlasClient(config) {
|
|
|
94
95
|
auditLogs: (0, audit_logs_1.auditLogsResource)(request),
|
|
95
96
|
jwtTemplates: (0, jwt_templates_1.jwtTemplatesResource)(request),
|
|
96
97
|
apiKeys: (0, api_keys_1.apiKeysResource)(request),
|
|
98
|
+
// §9.3 / §P1-7 named machine identities + device registry + enrolment tokens.
|
|
99
|
+
machines: (0, machines_1.machinesResource)(request),
|
|
97
100
|
oauthProviders: (0, oauth_providers_1.oauthProvidersResource)(request),
|
|
98
101
|
ssoOnboarding: (0, sso_onboarding_1.ssoOnboardingResource)(request),
|
|
99
102
|
scimProvisioning: (0, scim_provisioning_1.scimProvisioningResource)(request),
|
|
@@ -151,6 +154,7 @@ __exportStar(require("./sign-in-tokens"), exports);
|
|
|
151
154
|
__exportStar(require("./audit-logs"), exports);
|
|
152
155
|
__exportStar(require("./jwt-templates"), exports);
|
|
153
156
|
__exportStar(require("./api-keys"), exports);
|
|
157
|
+
__exportStar(require("./machines"), exports);
|
|
154
158
|
__exportStar(require("./oauth-providers"), exports);
|
|
155
159
|
__exportStar(require("./sso-onboarding"), exports);
|
|
156
160
|
__exportStar(require("./scim-provisioning"), exports);
|
package/dist/client/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { type RequestFn } from './request';
|
|
2
|
+
import type { CursorParams, ListPage, Metadata } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* §9.3 / §P1-7 MACHINE identities + the device registry.
|
|
5
|
+
*
|
|
6
|
+
* A machine is a first-class non-human principal with its own secret (`mk_…`),
|
|
7
|
+
* distinct from an instance API key. §P1-7 layers a DEVICE half on top: a machine
|
|
8
|
+
* can carry a registered public KEY, a lifecycle `status`, device `metadata`, and
|
|
9
|
+
* optional org/owner ownership. This namespace is the `sk_`-authenticated
|
|
10
|
+
* MANAGEMENT surface (list/filter, create, rename, metadata, approve, revoke, key
|
|
11
|
+
* rotation, delete) plus enrolment-token management and M2M-token verification.
|
|
12
|
+
*
|
|
13
|
+
* The device self-serve half (`/v1/machines/enroll`, `/challenge`, `/token`) is a
|
|
14
|
+
* PUBLIC, credential-presented surface a bootstrapping device calls with no `sk_`,
|
|
15
|
+
* so it is deliberately NOT part of this secret-key client.
|
|
16
|
+
*/
|
|
17
|
+
/** A machine's lifecycle state. `pending` awaits approval; `revoked` is terminal. */
|
|
18
|
+
export type MachineStatus = 'pending' | 'active' | 'revoked';
|
|
19
|
+
/** Device metadata bag (hostname/os/app_version/last_seen_at/…). */
|
|
20
|
+
export type MachineMetadata = Record<string, unknown>;
|
|
21
|
+
/**
|
|
22
|
+
* A named machine identity. `secret_hash` is never present on any machine surface
|
|
23
|
+
* — only a hash is stored, so the `mk_` secret is shown exactly once at
|
|
24
|
+
* create/rotate (see {@link MachineWithSecret}).
|
|
25
|
+
*/
|
|
26
|
+
export interface Machine {
|
|
27
|
+
object: 'machine';
|
|
28
|
+
id: string;
|
|
29
|
+
name: string;
|
|
30
|
+
organization_id: string | null;
|
|
31
|
+
status: MachineStatus;
|
|
32
|
+
/** JWK thumbprint of the registered device key, or null for a secret-only machine. */
|
|
33
|
+
public_key_jkt: string | null;
|
|
34
|
+
metadata: MachineMetadata;
|
|
35
|
+
enrolled_at: number | null;
|
|
36
|
+
created_at: number;
|
|
37
|
+
updated_at: number;
|
|
38
|
+
}
|
|
39
|
+
/** The create / rotate_secret response: the machine plus its `mk_` secret, shown once. */
|
|
40
|
+
export interface MachineWithSecret extends Machine {
|
|
41
|
+
secret: string;
|
|
42
|
+
}
|
|
43
|
+
export interface CreateMachineBody {
|
|
44
|
+
name: string;
|
|
45
|
+
/** Round-7: the user who owns this machine identity. */
|
|
46
|
+
owner_user_id?: string;
|
|
47
|
+
/** Round-7: bind the machine to an organization at creation. */
|
|
48
|
+
organization_id?: string;
|
|
49
|
+
/** Round-7: free-form data bag stored on the machine. */
|
|
50
|
+
data?: Metadata;
|
|
51
|
+
/** Device metadata (hostname/os/app_version/…). */
|
|
52
|
+
metadata?: MachineMetadata;
|
|
53
|
+
}
|
|
54
|
+
export interface ListMachinesQuery extends CursorParams {
|
|
55
|
+
status?: MachineStatus;
|
|
56
|
+
/** Filter by the device's reported hostname. */
|
|
57
|
+
hostname?: string;
|
|
58
|
+
/** Round-7: only machines owned by this user. */
|
|
59
|
+
owner_user_id?: string;
|
|
60
|
+
/** Round-7: only machines belonging to this organization. */
|
|
61
|
+
organization_id?: string;
|
|
62
|
+
/** Round-7: a JSON-encoded metadata match filter. */
|
|
63
|
+
metadata?: string;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* The machine list page. The envelope is `{ object: 'list', data }`; §P1-7's
|
|
67
|
+
* cursor fields (`has_more`/`next_cursor`) are present on the round-7 surface and
|
|
68
|
+
* optional here so the type is honest against both.
|
|
69
|
+
*/
|
|
70
|
+
export interface MachineListPage {
|
|
71
|
+
object: 'list';
|
|
72
|
+
data: Machine[];
|
|
73
|
+
has_more?: boolean;
|
|
74
|
+
next_cursor?: string | null;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* A machine's org membership, membership-shaped like
|
|
78
|
+
* `GET /v1/users/:id/organization_memberships`. A machine belongs to at most one
|
|
79
|
+
* org today, so the list holds 0 or 1 entries; `role` is always null (a machine
|
|
80
|
+
* holds no org role).
|
|
81
|
+
*/
|
|
82
|
+
export interface MachineOrganizationMembership {
|
|
83
|
+
object: 'organization_membership';
|
|
84
|
+
organization_id: string;
|
|
85
|
+
organization_slug: string;
|
|
86
|
+
role: null;
|
|
87
|
+
plan: string | null;
|
|
88
|
+
joined_at: number;
|
|
89
|
+
}
|
|
90
|
+
export interface MachineOrganizationMembershipPage {
|
|
91
|
+
object: 'list';
|
|
92
|
+
data: MachineOrganizationMembership[];
|
|
93
|
+
has_more: boolean;
|
|
94
|
+
next_cursor: string | null;
|
|
95
|
+
}
|
|
96
|
+
/** An enrolment token — a short-lived credential a device presents to `/enroll`. */
|
|
97
|
+
export interface MachineEnrolmentToken {
|
|
98
|
+
object: 'machine_enrolment_token';
|
|
99
|
+
id: string;
|
|
100
|
+
organization_id: string | null;
|
|
101
|
+
max_uses: number;
|
|
102
|
+
uses: number;
|
|
103
|
+
expires_at: number;
|
|
104
|
+
requires_approval: boolean;
|
|
105
|
+
created_at: number;
|
|
106
|
+
}
|
|
107
|
+
/** The create response: the enrolment token plus its `met_` secret, shown once. */
|
|
108
|
+
export interface MachineEnrolmentTokenWithSecret extends MachineEnrolmentToken {
|
|
109
|
+
token: string;
|
|
110
|
+
}
|
|
111
|
+
export interface CreateEnrolmentTokenBody {
|
|
112
|
+
/** Bind machines enrolled with this token to an organization. */
|
|
113
|
+
organization_id?: string;
|
|
114
|
+
/** Round-7: the user who will own machines enrolled with this token. */
|
|
115
|
+
owner_user_id?: string;
|
|
116
|
+
/** Round-7: free-form data copied onto each enrolled machine. */
|
|
117
|
+
data?: Metadata;
|
|
118
|
+
/** Round-7: restrict the token to a single enrolment session. */
|
|
119
|
+
single_session?: boolean;
|
|
120
|
+
/** Round-7: the maximum number of machines that may enrol with this token. */
|
|
121
|
+
max_machines?: number;
|
|
122
|
+
/** How many times the token may be redeemed (defaults to 1 server-side). */
|
|
123
|
+
max_uses?: number;
|
|
124
|
+
/** Token lifetime; defaults to 3600s, capped at one year. */
|
|
125
|
+
expires_in_seconds?: number;
|
|
126
|
+
/** When true, enrolled machines start `pending` and must be approved. */
|
|
127
|
+
requires_approval?: boolean;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* The verify verdict for an M2M credential (Clerk `verifyM2MToken`): resolve a
|
|
131
|
+
* presented machine secret to its machine. An unknown, rotated, or revoked secret
|
|
132
|
+
* all resolve to the SAME `{ valid: false }`, so a caller cannot probe which
|
|
133
|
+
* machines exist.
|
|
134
|
+
*/
|
|
135
|
+
export type M2mTokenVerification = {
|
|
136
|
+
object: 'm2m_verification';
|
|
137
|
+
valid: false;
|
|
138
|
+
} | {
|
|
139
|
+
object: 'm2m_verification';
|
|
140
|
+
valid: true;
|
|
141
|
+
machine_id: string;
|
|
142
|
+
name: string;
|
|
143
|
+
};
|
|
144
|
+
export declare function machinesResource(request: RequestFn): {
|
|
145
|
+
/** List + filter machines (§P1-7 device-registry query). */
|
|
146
|
+
list(query?: ListMachinesQuery): Promise<MachineListPage>;
|
|
147
|
+
/** Create a machine. The `mk_` secret is returned once, here. */
|
|
148
|
+
create(body: CreateMachineBody, idempotencyKey?: string): Promise<MachineWithSecret>;
|
|
149
|
+
get(id: string): Promise<Machine>;
|
|
150
|
+
/** Rename a machine (`PATCH /v1/machines/:id`). */
|
|
151
|
+
rename(id: string, name: string): Promise<Machine>;
|
|
152
|
+
/** Merge device metadata (`PATCH /v1/machines/:id/metadata`). */
|
|
153
|
+
patchMetadata(id: string, metadata: MachineMetadata): Promise<Machine>;
|
|
154
|
+
/** Approve a `pending` device (→ `active`). */
|
|
155
|
+
approve(id: string): Promise<Machine>;
|
|
156
|
+
/** Revoke a machine (→ `revoked`). The record is kept; its key stops minting at once. */
|
|
157
|
+
revoke(id: string): Promise<Machine>;
|
|
158
|
+
/** Rotate the `mk_` secret. The new secret is shown once; the old stops working. */
|
|
159
|
+
rotateSecret(id: string): Promise<MachineWithSecret>;
|
|
160
|
+
/** Rotate the registered device keypair by supplying the new public key PEM. */
|
|
161
|
+
rotateKey(id: string, publicKeyPem: string): Promise<Machine>;
|
|
162
|
+
/** Delete a machine outright (distinct from {@link revoke}, which keeps the record). */
|
|
163
|
+
delete(id: string): Promise<{
|
|
164
|
+
object: "machine";
|
|
165
|
+
id: string;
|
|
166
|
+
deleted: true;
|
|
167
|
+
}>;
|
|
168
|
+
/** The machine's org memberships (0 or 1 entry). */
|
|
169
|
+
organizationMemberships(id: string): Promise<MachineOrganizationMembershipPage>;
|
|
170
|
+
/** Mint an enrolment token. The `met_` secret is returned once, here. */
|
|
171
|
+
createEnrolmentToken(body?: CreateEnrolmentTokenBody, idempotencyKey?: string): Promise<MachineEnrolmentTokenWithSecret>;
|
|
172
|
+
listEnrolmentTokens(): Promise<ListPage<MachineEnrolmentToken>>;
|
|
173
|
+
deleteEnrolmentToken(id: string): Promise<{
|
|
174
|
+
object: "machine_enrolment_token";
|
|
175
|
+
id: string;
|
|
176
|
+
deleted: true;
|
|
177
|
+
}>;
|
|
178
|
+
/**
|
|
179
|
+
* Verify a presented M2M credential (`POST /v1/m2m_tokens/verify`). Resolve a
|
|
180
|
+
* machine secret to its machine; every negative resolves to `{ valid: false }`.
|
|
181
|
+
*/
|
|
182
|
+
verifyM2mToken(token: string): Promise<M2mTokenVerification>;
|
|
183
|
+
};
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.machinesResource = machinesResource;
|
|
4
|
+
const request_1 = require("./request");
|
|
5
|
+
function machinesResource(request) {
|
|
6
|
+
return {
|
|
7
|
+
/** List + filter machines (§P1-7 device-registry query). */
|
|
8
|
+
list(query = {}) {
|
|
9
|
+
return request({ method: 'GET', path: '/v1/machines', query: { ...query } });
|
|
10
|
+
},
|
|
11
|
+
/** Create a machine. The `mk_` secret is returned once, here. */
|
|
12
|
+
create(body, idempotencyKey) {
|
|
13
|
+
return request({ method: 'POST', path: '/v1/machines', body, idempotencyKey });
|
|
14
|
+
},
|
|
15
|
+
get(id) {
|
|
16
|
+
return request({ method: 'GET', path: `/v1/machines/${(0, request_1.enc)(id)}` });
|
|
17
|
+
},
|
|
18
|
+
/** Rename a machine (`PATCH /v1/machines/:id`). */
|
|
19
|
+
rename(id, name) {
|
|
20
|
+
return request({ method: 'PATCH', path: `/v1/machines/${(0, request_1.enc)(id)}`, body: { name } });
|
|
21
|
+
},
|
|
22
|
+
/** Merge device metadata (`PATCH /v1/machines/:id/metadata`). */
|
|
23
|
+
patchMetadata(id, metadata) {
|
|
24
|
+
return request({ method: 'PATCH', path: `/v1/machines/${(0, request_1.enc)(id)}/metadata`, body: { metadata } });
|
|
25
|
+
},
|
|
26
|
+
/** Approve a `pending` device (→ `active`). */
|
|
27
|
+
approve(id) {
|
|
28
|
+
return request({ method: 'POST', path: `/v1/machines/${(0, request_1.enc)(id)}/approve` });
|
|
29
|
+
},
|
|
30
|
+
/** Revoke a machine (→ `revoked`). The record is kept; its key stops minting at once. */
|
|
31
|
+
revoke(id) {
|
|
32
|
+
return request({ method: 'POST', path: `/v1/machines/${(0, request_1.enc)(id)}/revoke` });
|
|
33
|
+
},
|
|
34
|
+
/** Rotate the `mk_` secret. The new secret is shown once; the old stops working. */
|
|
35
|
+
rotateSecret(id) {
|
|
36
|
+
return request({ method: 'POST', path: `/v1/machines/${(0, request_1.enc)(id)}/rotate_secret` });
|
|
37
|
+
},
|
|
38
|
+
/** Rotate the registered device keypair by supplying the new public key PEM. */
|
|
39
|
+
rotateKey(id, publicKeyPem) {
|
|
40
|
+
return request({
|
|
41
|
+
method: 'POST',
|
|
42
|
+
path: `/v1/machines/${(0, request_1.enc)(id)}/rotate_key`,
|
|
43
|
+
body: { public_key_pem: publicKeyPem },
|
|
44
|
+
});
|
|
45
|
+
},
|
|
46
|
+
/** Delete a machine outright (distinct from {@link revoke}, which keeps the record). */
|
|
47
|
+
delete(id) {
|
|
48
|
+
return request({ method: 'DELETE', path: `/v1/machines/${(0, request_1.enc)(id)}` });
|
|
49
|
+
},
|
|
50
|
+
/** The machine's org memberships (0 or 1 entry). */
|
|
51
|
+
organizationMemberships(id) {
|
|
52
|
+
return request({ method: 'GET', path: `/v1/machines/${(0, request_1.enc)(id)}/organization_memberships` });
|
|
53
|
+
},
|
|
54
|
+
/** Mint an enrolment token. The `met_` secret is returned once, here. */
|
|
55
|
+
createEnrolmentToken(body = {}, idempotencyKey) {
|
|
56
|
+
return request({ method: 'POST', path: '/v1/machine_enrolment_tokens', body, idempotencyKey });
|
|
57
|
+
},
|
|
58
|
+
listEnrolmentTokens() {
|
|
59
|
+
return request({ method: 'GET', path: '/v1/machine_enrolment_tokens' });
|
|
60
|
+
},
|
|
61
|
+
deleteEnrolmentToken(id) {
|
|
62
|
+
return request({ method: 'DELETE', path: `/v1/machine_enrolment_tokens/${(0, request_1.enc)(id)}` });
|
|
63
|
+
},
|
|
64
|
+
/**
|
|
65
|
+
* Verify a presented M2M credential (`POST /v1/m2m_tokens/verify`). Resolve a
|
|
66
|
+
* machine secret to its machine; every negative resolves to `{ valid: false }`.
|
|
67
|
+
*/
|
|
68
|
+
verifyM2mToken(token) {
|
|
69
|
+
return request({ method: 'POST', path: '/v1/m2m_tokens/verify', body: { token } });
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=machines.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"machines.js","sourceRoot":"","sources":["../../src/client/machines.ts"],"names":[],"mappings":"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"}
|