Add an Access application

Adds a new application to Access.

Script cloudflare Verified

by hugo697 ยท 11/16/2023

The script

Submitted by hugo697 Typescript (fetch-only)
Verified 383 days ago
1
type Cloudflare = {
2
  token: string;
3
  email: string;
4
  key: string;
5
};
6
/**
7
 * Add an Access application
8
 * Adds a new application to Access.
9
 */
10
export async function main(
11
  auth: Cloudflare,
12
  identifier: string,
13
  body:
14
    | ({
15
        aud?: string;
16
        created_at?: string;
17
        id?: string;
18
        updated_at?: string;
19
        [k: string]: unknown;
20
      } & {
21
        allowed_idps?: string[];
22
        app_launcher_visible?: boolean;
23
        auto_redirect_to_identity?: boolean;
24
        cors_headers?: {
25
          allow_all_headers?: boolean;
26
          allow_all_methods?: boolean;
27
          allow_all_origins?: boolean;
28
          allow_credentials?: boolean;
29
          allowed_headers?: unknown[];
30
          allowed_methods?: (
31
            | "GET"
32
            | "POST"
33
            | "HEAD"
34
            | "PUT"
35
            | "DELETE"
36
            | "CONNECT"
37
            | "OPTIONS"
38
            | "TRACE"
39
            | "PATCH"
40
          )[];
41
          allowed_origins?: unknown[];
42
          max_age?: number;
43
          [k: string]: unknown;
44
        };
45
        custom_deny_message?: string;
46
        custom_deny_url?: string;
47
        domain: string;
48
        enable_binding_cookie?: boolean;
49
        http_only_cookie_attribute?: boolean;
50
        logo_url?: string;
51
        name?: string;
52
        same_site_cookie_attribute?: string;
53
        service_auth_401_redirect?: boolean;
54
        session_duration?: string;
55
        skip_interstitial?: boolean;
56
        type: string;
57
        [k: string]: unknown;
58
      })
59
    | ({
60
        aud?: string;
61
        created_at?: string;
62
        id?: string;
63
        updated_at?: string;
64
        [k: string]: unknown;
65
      } & {
66
        allowed_idps?: string[];
67
        app_launcher_visible?: boolean;
68
        auto_redirect_to_identity?: boolean;
69
        logo_url?: string;
70
        name?: string;
71
        saas_app?: {
72
          consumer_service_url?: string;
73
          created_at?: string;
74
          custom_attributes?: {
75
            name?: string;
76
            name_format?:
77
              | "urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified"
78
              | "urn:oasis:names:tc:SAML:2.0:attrname-format:basic"
79
              | "urn:oasis:names:tc:SAML:2.0:attrname-format:uri";
80
            source?: { name?: string; [k: string]: unknown };
81
            [k: string]: unknown;
82
          };
83
          idp_entity_id?: string;
84
          name_id_format?: "id" | "email";
85
          public_key?: string;
86
          sp_entity_id?: string;
87
          sso_endpoint?: string;
88
          updated_at?: string;
89
          [k: string]: unknown;
90
        };
91
        type?: string;
92
        [k: string]: unknown;
93
      })
94
    | ({
95
        aud?: string;
96
        created_at?: string;
97
        id?: string;
98
        updated_at?: string;
99
        [k: string]: unknown;
100
      } & ({
101
        allowed_idps?: string[];
102
        app_launcher_visible?: boolean;
103
        auto_redirect_to_identity?: boolean;
104
        cors_headers?: {
105
          allow_all_headers?: boolean;
106
          allow_all_methods?: boolean;
107
          allow_all_origins?: boolean;
108
          allow_credentials?: boolean;
109
          allowed_headers?: unknown[];
110
          allowed_methods?: (
111
            | "GET"
112
            | "POST"
113
            | "HEAD"
114
            | "PUT"
115
            | "DELETE"
116
            | "CONNECT"
117
            | "OPTIONS"
118
            | "TRACE"
119
            | "PATCH"
120
          )[];
121
          allowed_origins?: unknown[];
122
          max_age?: number;
123
          [k: string]: unknown;
124
        };
125
        custom_deny_message?: string;
126
        custom_deny_url?: string;
127
        domain: string;
128
        enable_binding_cookie?: boolean;
129
        http_only_cookie_attribute?: boolean;
130
        logo_url?: string;
131
        name?: string;
132
        same_site_cookie_attribute?: string;
133
        service_auth_401_redirect?: boolean;
134
        session_duration?: string;
135
        skip_interstitial?: boolean;
136
        type: string;
137
        [k: string]: unknown;
138
      } & { type?: string; [k: string]: unknown }))
139
    | ({
140
        aud?: string;
141
        created_at?: string;
142
        id?: string;
143
        updated_at?: string;
144
        [k: string]: unknown;
145
      } & ({
146
        allowed_idps?: string[];
147
        app_launcher_visible?: boolean;
148
        auto_redirect_to_identity?: boolean;
149
        cors_headers?: {
150
          allow_all_headers?: boolean;
151
          allow_all_methods?: boolean;
152
          allow_all_origins?: boolean;
153
          allow_credentials?: boolean;
154
          allowed_headers?: unknown[];
155
          allowed_methods?: (
156
            | "GET"
157
            | "POST"
158
            | "HEAD"
159
            | "PUT"
160
            | "DELETE"
161
            | "CONNECT"
162
            | "OPTIONS"
163
            | "TRACE"
164
            | "PATCH"
165
          )[];
166
          allowed_origins?: unknown[];
167
          max_age?: number;
168
          [k: string]: unknown;
169
        };
170
        custom_deny_message?: string;
171
        custom_deny_url?: string;
172
        domain: string;
173
        enable_binding_cookie?: boolean;
174
        http_only_cookie_attribute?: boolean;
175
        logo_url?: string;
176
        name?: string;
177
        same_site_cookie_attribute?: string;
178
        service_auth_401_redirect?: boolean;
179
        session_duration?: string;
180
        skip_interstitial?: boolean;
181
        type: string;
182
        [k: string]: unknown;
183
      } & { type?: string; [k: string]: unknown }))
184
    | ({
185
        aud?: string;
186
        created_at?: string;
187
        id?: string;
188
        updated_at?: string;
189
        [k: string]: unknown;
190
      } & ({
191
        allowed_idps?: string[];
192
        auto_redirect_to_identity?: boolean;
193
        domain?: string;
194
        name?: string;
195
        session_duration?: string;
196
        type:
197
          | "self_hosted"
198
          | "saas"
199
          | "ssh"
200
          | "vnc"
201
          | "app_launcher"
202
          | "warp"
203
          | "biso"
204
          | "bookmark"
205
          | "dash_sso";
206
        [k: string]: unknown;
207
      } & {
208
        domain?: { [k: string]: unknown };
209
        name?: string;
210
        type?: string;
211
        [k: string]: unknown;
212
      }))
213
    | ({
214
        aud?: string;
215
        created_at?: string;
216
        id?: string;
217
        updated_at?: string;
218
        [k: string]: unknown;
219
      } & ({
220
        allowed_idps?: string[];
221
        auto_redirect_to_identity?: boolean;
222
        domain?: string;
223
        name?: string;
224
        session_duration?: string;
225
        type:
226
          | "self_hosted"
227
          | "saas"
228
          | "ssh"
229
          | "vnc"
230
          | "app_launcher"
231
          | "warp"
232
          | "biso"
233
          | "bookmark"
234
          | "dash_sso";
235
        [k: string]: unknown;
236
      } & {
237
        domain?: { [k: string]: unknown };
238
        name?: string;
239
        type?: string;
240
        [k: string]: unknown;
241
      }))
242
    | ({
243
        aud?: string;
244
        created_at?: string;
245
        id?: string;
246
        updated_at?: string;
247
        [k: string]: unknown;
248
      } & ({
249
        allowed_idps?: string[];
250
        auto_redirect_to_identity?: boolean;
251
        domain?: string;
252
        name?: string;
253
        session_duration?: string;
254
        type:
255
          | "self_hosted"
256
          | "saas"
257
          | "ssh"
258
          | "vnc"
259
          | "app_launcher"
260
          | "warp"
261
          | "biso"
262
          | "bookmark"
263
          | "dash_sso";
264
        [k: string]: unknown;
265
      } & {
266
        domain?: { [k: string]: unknown };
267
        name?: string;
268
        type?: string;
269
        [k: string]: unknown;
270
      }))
271
    | ({
272
        aud?: string;
273
        created_at?: string;
274
        id?: string;
275
        updated_at?: string;
276
        [k: string]: unknown;
277
      } & {
278
        app_launcher_visible?: boolean;
279
        domain: { [k: string]: unknown };
280
        logo_url?: string;
281
        name?: string;
282
        type: string;
283
        [k: string]: unknown;
284
      })
285
) {
286
  const url = new URL(
287
    `https://api.cloudflare.com/client/v4/zones/${identifier}/access/apps`
288
  );
289

290
  const response = await fetch(url, {
291
    method: "POST",
292
    headers: {
293
      "X-AUTH-EMAIL": auth.email,
294
      "X-AUTH-KEY": auth.key,
295
      "Content-Type": "application/json",
296
      Authorization: "Bearer " + auth.token,
297
    },
298
    body: JSON.stringify(body),
299
  });
300
  if (!response.ok) {
301
    const text = await response.text();
302
    throw new Error(`${response.status} ${text}`);
303
  }
304
  return await response.json();
305
}
306