@we8/cloudflare 0.1.1 → 0.2.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/README.md +99 -6
- package/dist/access.d.ts +129 -0
- package/dist/access.d.ts.map +1 -0
- package/dist/access.js +211 -0
- package/dist/access.js.map +1 -0
- package/dist/admin-auth.d.ts +42 -0
- package/dist/admin-auth.d.ts.map +1 -0
- package/dist/admin-auth.js +19 -0
- package/dist/admin-auth.js.map +1 -0
- package/dist/cli-args.d.ts +8 -2
- package/dist/cli-args.d.ts.map +1 -1
- package/dist/cli-args.js +28 -4
- package/dist/cli-args.js.map +1 -1
- package/dist/cli.d.ts +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +89 -6
- package/dist/cli.js.map +1 -1
- package/dist/doctor.d.ts +79 -3
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +250 -15
- package/dist/doctor.js.map +1 -1
- package/dist/index.d.ts +21 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -9
- package/dist/index.js.map +1 -1
- package/dist/jwt.d.ts +103 -0
- package/dist/jwt.d.ts.map +1 -0
- package/dist/jwt.js +265 -0
- package/dist/jwt.js.map +1 -0
- package/dist/perimeter.d.ts +49 -0
- package/dist/perimeter.d.ts.map +1 -0
- package/dist/perimeter.js +54 -0
- package/dist/perimeter.js.map +1 -0
- package/dist/project.d.ts +7 -0
- package/dist/project.d.ts.map +1 -1
- package/dist/project.js +31 -0
- package/dist/project.js.map +1 -1
- package/dist/skill-command.d.ts +48 -0
- package/dist/skill-command.d.ts.map +1 -0
- package/dist/skill-command.js +122 -0
- package/dist/skill-command.js.map +1 -0
- package/dist/skill.d.ts +51 -0
- package/dist/skill.d.ts.map +1 -0
- package/dist/skill.js +229 -0
- package/dist/skill.js.map +1 -0
- package/dist/wrangler-config.d.ts +64 -1
- package/dist/wrangler-config.d.ts.map +1 -1
- package/dist/wrangler-config.js +133 -21
- package/dist/wrangler-config.js.map +1 -1
- package/package.json +2 -2
package/dist/doctor.js
CHANGED
|
@@ -10,7 +10,115 @@
|
|
|
10
10
|
* printing the reason without the answer just moves the search to a browser.
|
|
11
11
|
*/
|
|
12
12
|
import { inspectEmailConfig } from './email.js';
|
|
13
|
-
import {
|
|
13
|
+
import { SKILL_RELATIVE_PATH } from './skill.js';
|
|
14
|
+
import { ACCESS_AUD_VAR, ACCESS_OWNER_DEFAULT_VAR, ACCESS_OWNER_EMAILS_VAR, ACCESS_TEAM_DOMAIN_VAR, AUTH_MIGRATIONS_DIR, D1_ID_PLACEHOLDER, isPlaceholder, isRealDatabaseId, } from './wrangler-config.js';
|
|
15
|
+
/**
|
|
16
|
+
* A worker entry with its comments removed.
|
|
17
|
+
*
|
|
18
|
+
* Everything below reads code out of a file the scaffolder also fills with
|
|
19
|
+
* prose, and that prose names providers: the generated perimeter entry
|
|
20
|
+
* explains how to swap in `registerAdminAuth(embeddedAdminAuth)`, and the
|
|
21
|
+
* generated Access entry shows the settings being passed inline. Matching
|
|
22
|
+
* against the raw text reads those sentences as code and reports the wrong
|
|
23
|
+
* mode, which is exactly the kind of confident wrong answer a doctor must not
|
|
24
|
+
* give.
|
|
25
|
+
*
|
|
26
|
+
* String-aware, so a `//` inside a URL literal is not mistaken for a comment.
|
|
27
|
+
* A regular-expression literal containing an unmatched quote would confuse it;
|
|
28
|
+
* a worker entry is three imports and two calls, and does not have one.
|
|
29
|
+
*/
|
|
30
|
+
export function stripSourceComments(source) {
|
|
31
|
+
let out = '';
|
|
32
|
+
let quote = null;
|
|
33
|
+
let i = 0;
|
|
34
|
+
while (i < source.length) {
|
|
35
|
+
const ch = source[i];
|
|
36
|
+
const next = source[i + 1];
|
|
37
|
+
if (quote !== null) {
|
|
38
|
+
if (ch === '\\') {
|
|
39
|
+
out += ch + (next ?? '');
|
|
40
|
+
i += 2;
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
if (ch === quote)
|
|
44
|
+
quote = null;
|
|
45
|
+
out += ch;
|
|
46
|
+
i += 1;
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
if (ch === '"' || ch === "'" || ch === '`') {
|
|
50
|
+
quote = ch;
|
|
51
|
+
out += ch;
|
|
52
|
+
i += 1;
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
if (ch === '/' && next === '/') {
|
|
56
|
+
while (i < source.length && source[i] !== '\n')
|
|
57
|
+
i += 1;
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
if (ch === '/' && next === '*') {
|
|
61
|
+
i += 2;
|
|
62
|
+
while (i < source.length && !(source[i] === '*' && source[i + 1] === '/'))
|
|
63
|
+
i += 1;
|
|
64
|
+
i += 2;
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
out += ch;
|
|
68
|
+
i += 1;
|
|
69
|
+
}
|
|
70
|
+
return out;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Reads the composed admin auth mode out of a worker entry.
|
|
74
|
+
*
|
|
75
|
+
* A static read of one file, deliberately: running the worker to ask it would
|
|
76
|
+
* need a deployment, and the doctor is what a stranger runs BEFORE they have
|
|
77
|
+
* one. It looks for the registration call and for the shipped providers by
|
|
78
|
+
* name, so a project that registers something of its own reads as `external`
|
|
79
|
+
* rather than as unconfigured.
|
|
80
|
+
*/
|
|
81
|
+
export function readAdminAuthMode(entry) {
|
|
82
|
+
if (entry === null)
|
|
83
|
+
return 'unknown';
|
|
84
|
+
const registration = /registerAdminAuth\s*\(\s*([A-Za-z0-9_$.]+)/.exec(stripSourceComments(entry));
|
|
85
|
+
if (!registration)
|
|
86
|
+
return 'none';
|
|
87
|
+
switch (registration[1]) {
|
|
88
|
+
case 'embeddedAdminAuth':
|
|
89
|
+
return 'embedded';
|
|
90
|
+
case 'cloudflareAccessAdminAuth':
|
|
91
|
+
return 'access';
|
|
92
|
+
case 'perimeterAdminAuth':
|
|
93
|
+
return 'perimeter';
|
|
94
|
+
default:
|
|
95
|
+
return 'external';
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Whether a perimeter-mode entry says out loud that it means it.
|
|
100
|
+
*
|
|
101
|
+
* The acknowledgement is an argument in the registration call rather than a
|
|
102
|
+
* var or a flag, because the dangerous choice is a line of code and the
|
|
103
|
+
* admission belongs in the same line: a reviewer reading `registerAdminAuth`
|
|
104
|
+
* sees both at once, and nobody acknowledges a mode they never read.
|
|
105
|
+
*/
|
|
106
|
+
export function readPerimeterAcknowledged(entry) {
|
|
107
|
+
if (entry === null)
|
|
108
|
+
return false;
|
|
109
|
+
return /perimeterAdminAuth\s*\(\s*\{[^}]*\backnowledged\b\s*:\s*true/.test(stripSourceComments(entry));
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Whether an access-mode entry passes its settings inline instead of leaving
|
|
113
|
+
* them to the vars. The doctor can check a var; it cannot check a value that
|
|
114
|
+
* only exists as an expression, so it says where the answer lives and stops
|
|
115
|
+
* there rather than reporting a var as missing when it is not needed.
|
|
116
|
+
*/
|
|
117
|
+
export function readsAccessConfigInline(entry) {
|
|
118
|
+
if (entry === null)
|
|
119
|
+
return false;
|
|
120
|
+
return /cloudflareAccessAdminAuth\s*\(\s*\{/.test(stripSourceComments(entry));
|
|
121
|
+
}
|
|
14
122
|
function asRecord(value) {
|
|
15
123
|
return typeof value === 'object' && value !== null && !Array.isArray(value)
|
|
16
124
|
? value
|
|
@@ -50,9 +158,16 @@ export function readMigrationsDir(config) {
|
|
|
50
158
|
}
|
|
51
159
|
const MIGRATION_PATTERN = /^(\d{4})_[a-z0-9_]+\.sql$/;
|
|
52
160
|
/**
|
|
53
|
-
* Migrations apply in filename order, so the order has to be a real sequence
|
|
54
|
-
*
|
|
55
|
-
* happily apply it anyway.
|
|
161
|
+
* Migrations apply in filename order, so the order has to be a real sequence:
|
|
162
|
+
* numbered, ascending, and each number used once. A duplicate is a merge that
|
|
163
|
+
* went wrong, and wrangler will happily apply it anyway.
|
|
164
|
+
*
|
|
165
|
+
* A gap is allowed, and there is one in the core sequence on purpose. 0007
|
|
166
|
+
* created the auth tables in 0.1 and those tables now belong to `@we8/auth`;
|
|
167
|
+
* the number is retired rather than reused, because the name of an applied
|
|
168
|
+
* migration is recorded in the database forever and must never come to mean
|
|
169
|
+
* something else. Renumbering the migrations after it would re-run them
|
|
170
|
+
* against every 0.1 database in existence.
|
|
56
171
|
*/
|
|
57
172
|
export function checkMigrationSequence(files) {
|
|
58
173
|
const sql = files.filter((name) => name.endsWith('.sql')).sort();
|
|
@@ -63,16 +178,18 @@ export function checkMigrationSequence(files) {
|
|
|
63
178
|
return { ok: false, detail: `not numbered NNNN_name.sql: ${badly.join(', ')}` };
|
|
64
179
|
}
|
|
65
180
|
const numbers = sql.map((name) => Number(MIGRATION_PATTERN.exec(name)[1]));
|
|
66
|
-
for (let i =
|
|
67
|
-
|
|
68
|
-
if (numbers[i] !== expected) {
|
|
181
|
+
for (let i = 1; i < numbers.length; i += 1) {
|
|
182
|
+
if (numbers[i] <= numbers[i - 1]) {
|
|
69
183
|
return {
|
|
70
184
|
ok: false,
|
|
71
|
-
detail:
|
|
185
|
+
detail: `${sql[i]} repeats or goes back on ${sql[i - 1]}`,
|
|
72
186
|
};
|
|
73
187
|
}
|
|
74
188
|
}
|
|
75
|
-
return {
|
|
189
|
+
return {
|
|
190
|
+
ok: true,
|
|
191
|
+
detail: `${String(sql.length)} migrations, ${sql[0]} to ${sql[sql.length - 1]}`,
|
|
192
|
+
};
|
|
76
193
|
}
|
|
77
194
|
/**
|
|
78
195
|
* The one guardrail that matters more than the rest: `seed/local.sql` carries
|
|
@@ -106,7 +223,7 @@ export function runDoctorChecks(facts) {
|
|
|
106
223
|
const flags = asArray(config.compatibility_flags).filter((f) => typeof f === 'string');
|
|
107
224
|
checks.push(flags.includes('nodejs_compat')
|
|
108
225
|
? check('nodejs_compat', 'nodejs_compat flag', 'pass', 'enabled')
|
|
109
|
-
: check('nodejs_compat', 'nodejs_compat flag', 'fail', 'the CMS and
|
|
226
|
+
: check('nodejs_compat', 'nodejs_compat flag', 'fail', 'the CMS and the embedded auth provider need the Node built-ins', 'Add "compatibility_flags": ["nodejs_compat"] to wrangler.jsonc'));
|
|
110
227
|
// ---- bindings ----------------------------------------------------------
|
|
111
228
|
const d1 = findD1Binding(facts.config);
|
|
112
229
|
const databaseName = typeof d1?.database_name === 'string' ? d1.database_name : 'we8-cms';
|
|
@@ -147,8 +264,102 @@ export function runDoctorChecks(facts) {
|
|
|
147
264
|
checks.push(typeof vars['CMS_VERSION'] === 'string' && vars['CMS_VERSION'].length > 0
|
|
148
265
|
? check('cms_version', 'CMS_VERSION', 'pass', vars['CMS_VERSION'])
|
|
149
266
|
: check('cms_version', 'CMS_VERSION', 'warn', 'not set, so /v1/health reports nothing useful', 'Add "CMS_VERSION": "0.1.0" to vars in wrangler.jsonc'));
|
|
150
|
-
// ----
|
|
151
|
-
|
|
267
|
+
// ---- who signs in ------------------------------------------------------
|
|
268
|
+
//
|
|
269
|
+
// The CMS core has no auth of its own. Whichever provider the worker entry
|
|
270
|
+
// registers decides how the admin API is reached, and registering nothing
|
|
271
|
+
// means it cannot be reached at all, which is the secure default and worth
|
|
272
|
+
// saying out loud rather than leaving to be discovered by a 403.
|
|
273
|
+
const authMode = readAdminAuthMode(facts.workerEntry);
|
|
274
|
+
const embedded = authMode === 'embedded';
|
|
275
|
+
if (authMode === 'unknown') {
|
|
276
|
+
checks.push(check('admin_auth', 'admin auth', 'warn', 'could not read the worker entry, so the auth mode is unverified', 'Check that "main" in wrangler.jsonc points at the worker entry file'));
|
|
277
|
+
}
|
|
278
|
+
else if (authMode === 'none') {
|
|
279
|
+
checks.push(check('admin_auth', 'admin auth', 'warn', 'no provider is registered: every /v1/admin request is refused, and the admin portal cannot be used', 'npm install @we8/auth then, in the worker entry: registerAdminAuth(embeddedAdminAuth) or register cloudflareAccessAdminAuth() or perimeterAdminAuth({ acknowledged: true }) from @we8/cloudflare'));
|
|
280
|
+
}
|
|
281
|
+
else if (embedded && !facts.authPackageInstalled) {
|
|
282
|
+
checks.push(check('admin_auth', 'admin auth', 'fail', 'the worker registers the embedded provider but @we8/auth is not installed', 'npm install @we8/auth'));
|
|
283
|
+
}
|
|
284
|
+
else if (embedded) {
|
|
285
|
+
checks.push(check('admin_auth', 'admin auth', 'pass', 'embedded: @we8/auth over this site\'s D1'));
|
|
286
|
+
}
|
|
287
|
+
else if (authMode === 'access') {
|
|
288
|
+
checks.push(check('admin_auth', 'admin auth', 'pass', 'access: Cloudflare Access signs people in, and this worker validates the assertion'));
|
|
289
|
+
}
|
|
290
|
+
else if (authMode === 'perimeter') {
|
|
291
|
+
// Perimeter mode is the one check that gets louder rather than quieter as
|
|
292
|
+
// a project approaches a deployment. Locally it is a warning: running an
|
|
293
|
+
// admin with no login on localhost is a normal afternoon. Deployed without
|
|
294
|
+
// an acknowledgement it is a failure, because the difference between "my
|
|
295
|
+
// perimeter handles it" and "the admin API is open to the internet" is a
|
|
296
|
+
// sentence nobody has written down yet.
|
|
297
|
+
const acknowledged = readPerimeterAcknowledged(facts.workerEntry);
|
|
298
|
+
if (acknowledged) {
|
|
299
|
+
checks.push(check('admin_auth', 'admin auth', 'warn', 'perimeter: EVERY request that reaches this worker is the owner, acknowledged in the worker entry. Whatever sits in front of it is the only thing keeping the admin API closed', 'Check that the perimeter covers every route to this Worker, the workers.dev subdomain included'));
|
|
300
|
+
}
|
|
301
|
+
else {
|
|
302
|
+
const detail = 'perimeter: EVERY request that reaches this worker is the owner, and the worker entry does not acknowledge it';
|
|
303
|
+
const fix = 'In the worker entry: registerAdminAuth(perimeterAdminAuth({ acknowledged: true })) once that is what you mean';
|
|
304
|
+
checks.push(check('admin_auth', 'admin auth', remote ? 'fail' : 'warn', detail, fix));
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
else {
|
|
308
|
+
checks.push(check('admin_auth', 'admin auth', 'pass', 'external: the worker registers a provider of its own'));
|
|
309
|
+
}
|
|
310
|
+
// ---- what Cloudflare Access mode needs to know ------------------------
|
|
311
|
+
//
|
|
312
|
+
// The team domain and the AUD tag are what the assertion is verified
|
|
313
|
+
// against, and neither is a secret, so both live in vars where this can read
|
|
314
|
+
// them. A project that passes them inline instead is checked for having done
|
|
315
|
+
// so and left alone: a value that only exists as an expression is not one a
|
|
316
|
+
// static read can confirm.
|
|
317
|
+
if (authMode === 'access') {
|
|
318
|
+
const inline = readsAccessConfigInline(facts.workerEntry);
|
|
319
|
+
const teamDomain = typeof vars[ACCESS_TEAM_DOMAIN_VAR] === 'string' ? vars[ACCESS_TEAM_DOMAIN_VAR] : '';
|
|
320
|
+
const audience = typeof vars[ACCESS_AUD_VAR] === 'string' ? vars[ACCESS_AUD_VAR] : '';
|
|
321
|
+
const missing = [];
|
|
322
|
+
if (!teamDomain || isPlaceholder(teamDomain))
|
|
323
|
+
missing.push(ACCESS_TEAM_DOMAIN_VAR);
|
|
324
|
+
if (!audience || isPlaceholder(audience))
|
|
325
|
+
missing.push(ACCESS_AUD_VAR);
|
|
326
|
+
if (inline) {
|
|
327
|
+
checks.push(check('access_config', 'Cloudflare Access', 'pass', 'the worker entry passes the team domain and audience itself'));
|
|
328
|
+
}
|
|
329
|
+
else if (missing.length > 0) {
|
|
330
|
+
checks.push(check('access_config', 'Cloudflare Access', 'fail', `${missing.join(' and ')} ${missing.length === 1 ? 'is' : 'are'} not filled in, so every admin request is refused`, `Zero Trust dashboard, Access, Applications, this app: copy the team domain and the Application Audience tag into vars in wrangler.jsonc`));
|
|
331
|
+
}
|
|
332
|
+
else {
|
|
333
|
+
checks.push(check('access_config', 'Cloudflare Access', 'pass', `${teamDomain}, aud ${audience.slice(0, 8)}...`));
|
|
334
|
+
}
|
|
335
|
+
const ownerEmails = typeof vars[ACCESS_OWNER_EMAILS_VAR] === 'string' ? vars[ACCESS_OWNER_EMAILS_VAR] : '';
|
|
336
|
+
const ownerDefault = typeof vars[ACCESS_OWNER_DEFAULT_VAR] === 'string' &&
|
|
337
|
+
vars[ACCESS_OWNER_DEFAULT_VAR].trim().toLowerCase() === 'true';
|
|
338
|
+
const namedOwners = ownerEmails
|
|
339
|
+
.split(',')
|
|
340
|
+
.map((entry) => entry.trim())
|
|
341
|
+
.filter((entry) => entry.length > 0 && !isPlaceholder(entry));
|
|
342
|
+
if (inline) {
|
|
343
|
+
checks.push(check('access_owners', 'Access owners', 'pass', 'the worker entry names the owners itself'));
|
|
344
|
+
}
|
|
345
|
+
else if (ownerDefault) {
|
|
346
|
+
checks.push(check('access_owners', 'Access owners', 'pass', `${ACCESS_OWNER_DEFAULT_VAR} is true: every identity Access admits owns this site`));
|
|
347
|
+
}
|
|
348
|
+
else if (namedOwners.length > 0) {
|
|
349
|
+
checks.push(check('access_owners', 'Access owners', 'pass', `${String(namedOwners.length)} owner ${namedOwners.length === 1 ? 'address' : 'addresses'}; everyone else Access admits is a member`));
|
|
350
|
+
}
|
|
351
|
+
else {
|
|
352
|
+
// Not a warning: a site whose every administrator is a member has no
|
|
353
|
+
// administrator. Settings, API keys, and the form inbox are all closed.
|
|
354
|
+
checks.push(check('access_owners', 'Access owners', 'fail', 'no owner is named, so everybody Access admits would be a member and nobody could reach settings, keys, or the inbox', `Set vars.${ACCESS_OWNER_EMAILS_VAR} to the owner addresses, or vars.${ACCESS_OWNER_DEFAULT_VAR} to "true" if every identity Access admits should own this site`));
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
// ---- the secret the embedded provider depends on -----------------------
|
|
358
|
+
//
|
|
359
|
+
// Only the embedded provider signs sessions, so this is its check and not
|
|
360
|
+
// the CMS's. A site behind someone else's identity provider has no session
|
|
361
|
+
// of its own to sign and must not be told to invent a secret for one.
|
|
362
|
+
if (embedded && remote) {
|
|
152
363
|
if (facts.remoteSecrets === null) {
|
|
153
364
|
checks.push(check('better_auth_secret', 'BETTER_AUTH_SECRET', 'warn', 'could not read the deployed secrets, so this is unverified', 'wrangler secret list to check, or set it with: wrangler secret put BETTER_AUTH_SECRET'));
|
|
154
365
|
}
|
|
@@ -159,13 +370,13 @@ export function runDoctorChecks(facts) {
|
|
|
159
370
|
checks.push(check('better_auth_secret', 'BETTER_AUTH_SECRET', 'fail', 'not set: the admin API refuses every request without it', 'openssl rand -hex 32 then: wrangler secret put BETTER_AUTH_SECRET'));
|
|
160
371
|
}
|
|
161
372
|
}
|
|
162
|
-
else if (facts.devVars === null) {
|
|
373
|
+
else if (embedded && facts.devVars === null) {
|
|
163
374
|
checks.push(check('better_auth_secret', 'BETTER_AUTH_SECRET', 'fail', 'no .dev.vars file, so local sign-in cannot work', 'cp .dev.vars.example .dev.vars then put a value from: openssl rand -hex 32'));
|
|
164
375
|
}
|
|
165
|
-
else if (facts.devVars
|
|
376
|
+
else if (embedded && facts.devVars?.includes('BETTER_AUTH_SECRET')) {
|
|
166
377
|
checks.push(check('better_auth_secret', 'BETTER_AUTH_SECRET', 'pass', 'set in .dev.vars'));
|
|
167
378
|
}
|
|
168
|
-
else {
|
|
379
|
+
else if (embedded) {
|
|
169
380
|
checks.push(check('better_auth_secret', 'BETTER_AUTH_SECRET', 'fail', '.dev.vars exists but does not set it', 'openssl rand -hex 32 then add BETTER_AUTH_SECRET=<value> to .dev.vars'));
|
|
170
381
|
}
|
|
171
382
|
// ---- migrations --------------------------------------------------------
|
|
@@ -182,6 +393,21 @@ export function runDoctorChecks(facts) {
|
|
|
182
393
|
? check('migrations', 'migrations', 'pass', `${migrationsDir}: ${sequence.detail}`)
|
|
183
394
|
: check('migrations', 'migrations', 'fail', `${migrationsDir}: ${sequence.detail}`, 'Restore the migrations shipped with @we8/cms'));
|
|
184
395
|
}
|
|
396
|
+
// A site's schema comes from every package it composes. @we8/auth owns the
|
|
397
|
+
// four auth tables and ships its own sequence, applied into the same
|
|
398
|
+
// database by the same command, so an installed provider with no migrations
|
|
399
|
+
// to apply is a broken install rather than a configuration choice.
|
|
400
|
+
if (facts.authPackageInstalled) {
|
|
401
|
+
if (facts.authMigrations === null) {
|
|
402
|
+
checks.push(check('auth_migrations', '@we8/auth migrations', 'fail', `${AUTH_MIGRATIONS_DIR} does not exist`, 'npm install (the migrations ship inside the @we8/auth package)'));
|
|
403
|
+
}
|
|
404
|
+
else {
|
|
405
|
+
const sequence = checkMigrationSequence(facts.authMigrations);
|
|
406
|
+
checks.push(sequence.ok
|
|
407
|
+
? check('auth_migrations', '@we8/auth migrations', 'pass', `${AUTH_MIGRATIONS_DIR}: ${sequence.detail}`)
|
|
408
|
+
: check('auth_migrations', '@we8/auth migrations', 'fail', `${AUTH_MIGRATIONS_DIR}: ${sequence.detail}`, 'Restore the migrations shipped with @we8/auth'));
|
|
409
|
+
}
|
|
410
|
+
}
|
|
185
411
|
// ---- email -------------------------------------------------------------
|
|
186
412
|
const emailMode = typeof vars['EMAIL_MODE'] === 'string' ? vars['EMAIL_MODE'] : undefined;
|
|
187
413
|
const sendEmailNames = asArray(config.send_email)
|
|
@@ -211,6 +437,15 @@ export function runDoctorChecks(facts) {
|
|
|
211
437
|
else {
|
|
212
438
|
checks.push(check('seed_guardrail', 'seed guardrail', 'pass', 'the development seed is local-only'));
|
|
213
439
|
}
|
|
440
|
+
// ---- the agent skill ---------------------------------------------------
|
|
441
|
+
//
|
|
442
|
+
// A warning and never a failure: a project without it works exactly as well,
|
|
443
|
+
// and nobody should be blocked from deploying because an agent would have
|
|
444
|
+
// had to read the README instead. It is here because the fix is one command
|
|
445
|
+
// and the alternative is an agent inventing how this project works.
|
|
446
|
+
checks.push(facts.skillPresent
|
|
447
|
+
? check('skill', 'agent skill', 'pass', SKILL_RELATIVE_PATH)
|
|
448
|
+
: check('skill', 'agent skill', 'warn', `no ${SKILL_RELATIVE_PATH}, so an agentic tool opening this project has to guess how it works`, 'we8-cloudflare skill'));
|
|
214
449
|
return { target: facts.target, ok: !checks.some((c) => c.status === 'fail'), checks };
|
|
215
450
|
}
|
|
216
451
|
const LABEL = { pass: 'PASS', fail: 'FAIL', warn: 'WARN' };
|
package/dist/doctor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,20 +1,32 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `@we8/cloudflare`: the Cloudflare pack.
|
|
2
|
+
* `@we8/cloudflare`: the Cloudflare pack. Four things, and only four.
|
|
3
3
|
*
|
|
4
4
|
* 1. A real `EmailSender` over Cloudflare Email Service, registered through
|
|
5
5
|
* the CMS seam and off until a site configures it.
|
|
6
|
-
* 2.
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
6
|
+
* 2. Two admin auth providers for sites that do not want a user table: the
|
|
7
|
+
* Cloudflare Access provider, which validates the assertion Access forwards,
|
|
8
|
+
* and perimeter mode, which checks nothing because something in front of
|
|
9
|
+
* the worker already did.
|
|
10
|
+
* 3. The wrangler config generator and the project-skill generator, which are
|
|
11
|
+
* what `create-we8` writes a project's `wrangler.jsonc` and its
|
|
12
|
+
* `.claude/skills/we8/SKILL.md` with.
|
|
13
|
+
* 4. First-boot help: the doctor's checks and the facts they read, plus the
|
|
14
|
+
* skill, the migrations, and the seed, behind the `we8-cloudflare` CLI.
|
|
10
15
|
*
|
|
11
16
|
* The package has no runtime dependencies. It declares `@we8/cms` as a peer
|
|
12
|
-
* rather than importing it, so the two build in either order
|
|
17
|
+
* rather than importing it, so the two build in either order; the seam types
|
|
18
|
+
* both providers satisfy are restated in admin-auth.ts for the same reason.
|
|
13
19
|
*/
|
|
20
|
+
export { ACCESS_JWT_COOKIE, ACCESS_JWT_HEADER, ACCESS_PROVIDER_NAME, accessCertsUrl, accessIssuer, accessRole, cloudflareAccessAdminAuth, clearAccessReports, normalizeTeamDomain, readAssertion, resolveAccessSettings, type AccessSettings, type CloudflareAccessConfig, type CloudflareAccessEnv, } from './access.js';
|
|
21
|
+
export { PERIMETER_PROVIDER_NAME, PERIMETER_USER_ID, perimeterAdminAuth, type PerimeterOptions, } from './perimeter.js';
|
|
22
|
+
export { ACCESS_JWT_ALGORITHM, CLOCK_SKEW_SECONDS, JWKS_REFETCH_FLOOR_MS, JWKS_TTL_MS, base64UrlToBytes, clearJwksCache, verifyAccessJwt, type AccessClaims, type JwtResult, } from './jwt.js';
|
|
23
|
+
export type { AdminAuthProvider, AdminIdentity, FirstRunState, UserRole, } from './admin-auth.js';
|
|
14
24
|
export { CLOUDFLARE_EMAIL_MODE, CloudflareEmailSender, MAX_RECIPIENTS, cloudflareEmailSender, inspectEmailConfig, type CloudflareEmailEnv, type EmailMessage, type EmailSendResult, type EmailSender, type SendEmailBinding, } from './email.js';
|
|
15
|
-
export { COMPATIBILITY_DATE, D1_ID_PLACEHOLDER, DEFAULT_MIGRATIONS_DIR, RETENTION_CRON, generateWranglerConfig, isRealDatabaseId, isValidResourceName, type EmailMode, type WranglerConfigAnswers, } from './wrangler-config.js';
|
|
16
|
-
export { checkMigrationSequence, findD1Binding, findR2Binding, formatDoctorReport, readMigrationsDir, runDoctorChecks, seedTargetsRemote, type CheckStatus, type DoctorCheck, type DoctorFacts, type DoctorReport, type DoctorTarget, } from './doctor.js';
|
|
17
|
-
export { CONFIG_FILENAMES, SEED_RELATIVE_PATH, findConfigPath, findSeedFile, gatherFacts, parseDevVarNames, } from './project.js';
|
|
25
|
+
export { ACCESS_AUD_PLACEHOLDER, ACCESS_AUD_VAR, ACCESS_OWNER_DEFAULT_VAR, ACCESS_OWNER_EMAILS_VAR, ACCESS_OWNER_PLACEHOLDER, ACCESS_TEAM_DOMAIN_PLACEHOLDER, ACCESS_TEAM_DOMAIN_VAR, AUTH_MIGRATIONS_DIR, COMPATIBILITY_DATE, D1_ID_PLACEHOLDER, DEFAULT_MIGRATIONS_DIR, RETENTION_CRON, generateMigrationsConfig, generateWranglerConfig, isPlaceholder, isRealDatabaseId, isValidResourceName, type AdminAuthChoice, type EmailMode, type WranglerConfigAnswers, } from './wrangler-config.js';
|
|
26
|
+
export { checkMigrationSequence, findD1Binding, findR2Binding, formatDoctorReport, readAdminAuthMode, readMigrationsDir, readPerimeterAcknowledged, readsAccessConfigInline, runDoctorChecks, seedTargetsRemote, stripSourceComments, type AdminAuthMode, type CheckStatus, type DoctorCheck, type DoctorFacts, type DoctorReport, type DoctorTarget, } from './doctor.js';
|
|
27
|
+
export { AUTH_PACKAGE_RELATIVE_PATH, CONFIG_FILENAMES, SEED_RELATIVE_PATH, findConfigPath, findSeedFile, gatherFacts, parseDevVarNames, readWorkerEntry, } from './project.js';
|
|
28
|
+
export { SKILL_RELATIVE_PATH, generateSkill, type SkillAuthMode, type SkillOptions, } from './skill.js';
|
|
29
|
+
export { hasSiteWorkspace, runSkillCommand, skillExitCode, type SkillCommandResult, type SkillCommandStatus, } from './skill-command.js';
|
|
18
30
|
export { parseJsonc, stripJsonComments } from './jsonc.js';
|
|
19
31
|
export { USAGE, parseCliArgs, type CommandName, type ParsedCommand } from './cli-args.js';
|
|
20
32
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,YAAY,EACZ,UAAU,EACV,yBAAyB,EACzB,kBAAkB,EAClB,mBAAmB,EACnB,aAAa,EACb,qBAAqB,EACrB,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,GACzB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EACjB,kBAAkB,EAClB,KAAK,gBAAgB,GACtB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,EACrB,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,KAAK,YAAY,EACjB,KAAK,SAAS,GACf,MAAM,UAAU,CAAC;AAElB,YAAY,EACV,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,QAAQ,GACT,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,cAAc,EACd,qBAAqB,EACrB,kBAAkB,EAClB,KAAK,kBAAkB,EACvB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,gBAAgB,GACtB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,wBAAwB,EACxB,uBAAuB,EACvB,wBAAwB,EACxB,8BAA8B,EAC9B,sBAAsB,EACtB,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,sBAAsB,EACtB,cAAc,EACd,wBAAwB,EACxB,sBAAsB,EACtB,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EACnB,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,qBAAqB,GAC3B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,sBAAsB,EACtB,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,yBAAyB,EACzB,uBAAuB,EACvB,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,YAAY,GAClB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,0BAA0B,EAC1B,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,eAAe,GAChB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,KAAK,aAAa,EAClB,KAAK,YAAY,GAClB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,GACxB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE3D,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,20 +1,31 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `@we8/cloudflare`: the Cloudflare pack.
|
|
2
|
+
* `@we8/cloudflare`: the Cloudflare pack. Four things, and only four.
|
|
3
3
|
*
|
|
4
4
|
* 1. A real `EmailSender` over Cloudflare Email Service, registered through
|
|
5
5
|
* the CMS seam and off until a site configures it.
|
|
6
|
-
* 2.
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
6
|
+
* 2. Two admin auth providers for sites that do not want a user table: the
|
|
7
|
+
* Cloudflare Access provider, which validates the assertion Access forwards,
|
|
8
|
+
* and perimeter mode, which checks nothing because something in front of
|
|
9
|
+
* the worker already did.
|
|
10
|
+
* 3. The wrangler config generator and the project-skill generator, which are
|
|
11
|
+
* what `create-we8` writes a project's `wrangler.jsonc` and its
|
|
12
|
+
* `.claude/skills/we8/SKILL.md` with.
|
|
13
|
+
* 4. First-boot help: the doctor's checks and the facts they read, plus the
|
|
14
|
+
* skill, the migrations, and the seed, behind the `we8-cloudflare` CLI.
|
|
10
15
|
*
|
|
11
16
|
* The package has no runtime dependencies. It declares `@we8/cms` as a peer
|
|
12
|
-
* rather than importing it, so the two build in either order
|
|
17
|
+
* rather than importing it, so the two build in either order; the seam types
|
|
18
|
+
* both providers satisfy are restated in admin-auth.ts for the same reason.
|
|
13
19
|
*/
|
|
20
|
+
export { ACCESS_JWT_COOKIE, ACCESS_JWT_HEADER, ACCESS_PROVIDER_NAME, accessCertsUrl, accessIssuer, accessRole, cloudflareAccessAdminAuth, clearAccessReports, normalizeTeamDomain, readAssertion, resolveAccessSettings, } from './access.js';
|
|
21
|
+
export { PERIMETER_PROVIDER_NAME, PERIMETER_USER_ID, perimeterAdminAuth, } from './perimeter.js';
|
|
22
|
+
export { ACCESS_JWT_ALGORITHM, CLOCK_SKEW_SECONDS, JWKS_REFETCH_FLOOR_MS, JWKS_TTL_MS, base64UrlToBytes, clearJwksCache, verifyAccessJwt, } from './jwt.js';
|
|
14
23
|
export { CLOUDFLARE_EMAIL_MODE, CloudflareEmailSender, MAX_RECIPIENTS, cloudflareEmailSender, inspectEmailConfig, } from './email.js';
|
|
15
|
-
export { COMPATIBILITY_DATE, D1_ID_PLACEHOLDER, DEFAULT_MIGRATIONS_DIR, RETENTION_CRON, generateWranglerConfig, isRealDatabaseId, isValidResourceName, } from './wrangler-config.js';
|
|
16
|
-
export { checkMigrationSequence, findD1Binding, findR2Binding, formatDoctorReport, readMigrationsDir, runDoctorChecks, seedTargetsRemote, } from './doctor.js';
|
|
17
|
-
export { CONFIG_FILENAMES, SEED_RELATIVE_PATH, findConfigPath, findSeedFile, gatherFacts, parseDevVarNames, } from './project.js';
|
|
24
|
+
export { ACCESS_AUD_PLACEHOLDER, ACCESS_AUD_VAR, ACCESS_OWNER_DEFAULT_VAR, ACCESS_OWNER_EMAILS_VAR, ACCESS_OWNER_PLACEHOLDER, ACCESS_TEAM_DOMAIN_PLACEHOLDER, ACCESS_TEAM_DOMAIN_VAR, AUTH_MIGRATIONS_DIR, COMPATIBILITY_DATE, D1_ID_PLACEHOLDER, DEFAULT_MIGRATIONS_DIR, RETENTION_CRON, generateMigrationsConfig, generateWranglerConfig, isPlaceholder, isRealDatabaseId, isValidResourceName, } from './wrangler-config.js';
|
|
25
|
+
export { checkMigrationSequence, findD1Binding, findR2Binding, formatDoctorReport, readAdminAuthMode, readMigrationsDir, readPerimeterAcknowledged, readsAccessConfigInline, runDoctorChecks, seedTargetsRemote, stripSourceComments, } from './doctor.js';
|
|
26
|
+
export { AUTH_PACKAGE_RELATIVE_PATH, CONFIG_FILENAMES, SEED_RELATIVE_PATH, findConfigPath, findSeedFile, gatherFacts, parseDevVarNames, readWorkerEntry, } from './project.js';
|
|
27
|
+
export { SKILL_RELATIVE_PATH, generateSkill, } from './skill.js';
|
|
28
|
+
export { hasSiteWorkspace, runSkillCommand, skillExitCode, } from './skill-command.js';
|
|
18
29
|
export { parseJsonc, stripJsonComments } from './jsonc.js';
|
|
19
30
|
export { USAGE, parseCliArgs } from './cli-args.js';
|
|
20
31
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,YAAY,EACZ,UAAU,EACV,yBAAyB,EACzB,kBAAkB,EAClB,mBAAmB,EACnB,aAAa,EACb,qBAAqB,GAItB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EACjB,kBAAkB,GAEnB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,EACrB,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,eAAe,GAGhB,MAAM,UAAU,CAAC;AASlB,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,cAAc,EACd,qBAAqB,EACrB,kBAAkB,GAMnB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,wBAAwB,EACxB,uBAAuB,EACvB,wBAAwB,EACxB,8BAA8B,EAC9B,sBAAsB,EACtB,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,sBAAsB,EACtB,cAAc,EACd,wBAAwB,EACxB,sBAAsB,EACtB,aAAa,EACb,gBAAgB,EAChB,mBAAmB,GAIpB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,sBAAsB,EACtB,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,yBAAyB,EACzB,uBAAuB,EACvB,eAAe,EACf,iBAAiB,EACjB,mBAAmB,GAOpB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,0BAA0B,EAC1B,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,eAAe,GAChB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,mBAAmB,EACnB,aAAa,GAGd,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,aAAa,GAGd,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE3D,OAAO,EAAE,KAAK,EAAE,YAAY,EAAwC,MAAM,eAAe,CAAC"}
|
package/dist/jwt.d.ts
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RS256 verification for a Cloudflare Access assertion, on WebCrypto.
|
|
3
|
+
*
|
|
4
|
+
* Access signs its assertion with the team's own key and publishes the public
|
|
5
|
+
* half as a JWKS at `https://<team>.cloudflareaccess.com/cdn-cgi/access/certs`.
|
|
6
|
+
* Verifying it is four checks: the signature against that key, the issuer, the
|
|
7
|
+
* audience, and the clock. All four have to pass, and a token that fails any of
|
|
8
|
+
* them is refused rather than downgraded.
|
|
9
|
+
*
|
|
10
|
+
* Written against WebCrypto rather than pulled from a JWT library on purpose.
|
|
11
|
+
* `@we8/cloudflare` has no runtime dependencies, this runs on Workers where
|
|
12
|
+
* `crypto.subtle` is the platform, and the whole verification is small enough
|
|
13
|
+
* to read in one sitting, which is the property that matters most in the file
|
|
14
|
+
* that decides who administers a site.
|
|
15
|
+
*
|
|
16
|
+
* Everything here fails CLOSED. An unreadable token, an unknown key, an
|
|
17
|
+
* unreachable JWKS endpoint, and an algorithm this file does not implement all
|
|
18
|
+
* produce a refusal, never an admission.
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* An imported public key, named off the platform rather than off a global.
|
|
22
|
+
*
|
|
23
|
+
* `SigningKey` is a global on Workers and lives under `webcrypto` in Node's own
|
|
24
|
+
* types, and this file is typechecked in one and runs in the other. Deriving
|
|
25
|
+
* the type from `importKey` itself means it resolves to whichever of the two is
|
|
26
|
+
* in scope, here and in the declaration this package publishes.
|
|
27
|
+
*/
|
|
28
|
+
export type SigningKey = Awaited<ReturnType<typeof crypto.subtle.importKey>>;
|
|
29
|
+
/** The claims this pack reads off an Access assertion. */
|
|
30
|
+
export interface AccessClaims {
|
|
31
|
+
iss?: unknown;
|
|
32
|
+
aud?: unknown;
|
|
33
|
+
exp?: unknown;
|
|
34
|
+
nbf?: unknown;
|
|
35
|
+
iat?: unknown;
|
|
36
|
+
sub?: unknown;
|
|
37
|
+
email?: unknown;
|
|
38
|
+
common_name?: unknown;
|
|
39
|
+
}
|
|
40
|
+
/** A verification either yields claims or says, for the log, why it did not. */
|
|
41
|
+
export type JwtResult = {
|
|
42
|
+
ok: true;
|
|
43
|
+
claims: AccessClaims;
|
|
44
|
+
} | {
|
|
45
|
+
ok: false;
|
|
46
|
+
reason: string;
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* The one signature algorithm accepted.
|
|
50
|
+
*
|
|
51
|
+
* Pinned rather than read from the token's own header, because "which
|
|
52
|
+
* algorithm" being a field the attacker controls is the classic JWT forgery:
|
|
53
|
+
* `alg: none` and an HS256 token signed with the public key are both defeated
|
|
54
|
+
* by refusing to look at anything but RS256.
|
|
55
|
+
*/
|
|
56
|
+
export declare const ACCESS_JWT_ALGORITHM = "RS256";
|
|
57
|
+
/**
|
|
58
|
+
* How long a fetched key set is used before it is fetched again. Access
|
|
59
|
+
* rotates keys, and an hour is short enough to pick a rotation up quickly and
|
|
60
|
+
* long enough that the endpoint is not in the path of every admin request.
|
|
61
|
+
*/
|
|
62
|
+
export declare const JWKS_TTL_MS: number;
|
|
63
|
+
/**
|
|
64
|
+
* The shortest gap between two fetches provoked by an unknown key id. Without
|
|
65
|
+
* it, a stream of forged tokens carrying invented `kid` values would turn into
|
|
66
|
+
* a stream of requests to Cloudflare.
|
|
67
|
+
*/
|
|
68
|
+
export declare const JWKS_REFETCH_FLOOR_MS: number;
|
|
69
|
+
/** A few seconds of tolerance, because two machines never agree exactly. */
|
|
70
|
+
export declare const CLOCK_SKEW_SECONDS = 60;
|
|
71
|
+
/** Drops every cached key set. Tests use it; nothing in the request path does. */
|
|
72
|
+
export declare function clearJwksCache(): void;
|
|
73
|
+
/** base64url to bytes, or null when the input is not base64url at all. */
|
|
74
|
+
export declare function base64UrlToBytes(value: string): Uint8Array | null;
|
|
75
|
+
/**
|
|
76
|
+
* The signing key for one key id, fetching the team's key set when the cached
|
|
77
|
+
* one cannot answer.
|
|
78
|
+
*
|
|
79
|
+
* A cached key stays usable while the set is fresh. Past that, or for a key id
|
|
80
|
+
* the set does not carry (which is what a rotation looks like), the endpoint is
|
|
81
|
+
* read again; a fetch that fails falls back to whatever was cached, because a
|
|
82
|
+
* transient outage at Cloudflare should not lock an operator out of their own
|
|
83
|
+
* admin, and refuses outright when there is nothing to fall back to.
|
|
84
|
+
*/
|
|
85
|
+
export declare function accessSigningKey(certsUrl: string, kid: string, now: number, fetchImpl?: typeof fetch): Promise<SigningKey | null>;
|
|
86
|
+
/** True when `aud` (a string or an array, per the spec) contains `audience`. */
|
|
87
|
+
export declare function audienceMatches(aud: unknown, audience: string): boolean;
|
|
88
|
+
/**
|
|
89
|
+
* Verifies an Access assertion end to end.
|
|
90
|
+
*
|
|
91
|
+
* Order matters only for what a log line says; every check is required, and the
|
|
92
|
+
* first failure is the reported one.
|
|
93
|
+
*/
|
|
94
|
+
export declare function verifyAccessJwt(options: {
|
|
95
|
+
token: string;
|
|
96
|
+
certsUrl: string;
|
|
97
|
+
issuer: string;
|
|
98
|
+
audience: string;
|
|
99
|
+
/** Seconds since the epoch. Defaults to now; a test passes its own clock. */
|
|
100
|
+
now?: number;
|
|
101
|
+
fetchImpl?: typeof fetch;
|
|
102
|
+
}): Promise<JwtResult>;
|
|
103
|
+
//# sourceMappingURL=jwt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt.d.ts","sourceRoot":"","sources":["../src/jwt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH;;;;;;;GAOG;AACH,MAAM,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;AAE7E,0DAA0D;AAC1D,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,gFAAgF;AAChF,MAAM,MAAM,SAAS,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3F;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,UAAU,CAAC;AAE5C;;;;GAIG;AACH,eAAO,MAAM,WAAW,QAAiB,CAAC;AAE1C;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,QAAY,CAAC;AAE/C,4EAA4E;AAC5E,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAkBrC,kFAAkF;AAClF,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAOD,0EAA0E;AAC1E,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAcjE;AAwHD;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,SAAS,GAAE,OAAO,KAAa,GAC9B,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAc5B;AAED,gFAAgF;AAChF,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAIvE;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,6EAA6E;IAC7E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B,GAAG,OAAO,CAAC,SAAS,CAAC,CA2DrB"}
|