@amaretto-software-labs/borealis-cli 0.1.0 → 0.1.2
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 +9 -0
- package/dist/auth.d.ts +3 -4
- package/dist/auth.js +155 -145
- package/dist/auth.js.map +1 -1
- package/dist/oauth-session.d.ts +25 -0
- package/dist/oauth-session.js +210 -0
- package/dist/oauth-session.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -18,6 +18,15 @@ borealis auth login
|
|
|
18
18
|
|
|
19
19
|
Interactive login uses OAuth authorization code flow with S256 PKCE and refresh tokens:
|
|
20
20
|
|
|
21
|
+
If browser sign-in fails or you cancel consent, keep the CLI running. The branded
|
|
22
|
+
recovery page offers **Try again** and **Use another account** (which signs out of
|
|
23
|
+
the web app before returning to sign-in). You can also press **Enter** in an
|
|
24
|
+
interactive terminal to start a fresh attempt, or open the recovery URL printed
|
|
25
|
+
by the CLI if you closed the browser. Each attempt uses new OAuth state and PKCE
|
|
26
|
+
values. Attempts time out after five minutes; the retry page remains available
|
|
27
|
+
for another ten minutes. **Ctrl+C** stops login and closes the local listener.
|
|
28
|
+
The success page is shown only after credentials are validated and securely saved.
|
|
29
|
+
|
|
21
30
|
```bash
|
|
22
31
|
borealis auth login
|
|
23
32
|
borealis auth whoami
|
package/dist/auth.d.ts
CHANGED
|
@@ -1,16 +1,15 @@
|
|
|
1
|
+
import { type OAuthPageKind } from "./oauth-session.js";
|
|
1
2
|
import type { GlobalOptions, Session } from "./types.js";
|
|
2
3
|
export declare const oauthCallbackResponseHeaders: Readonly<{
|
|
3
4
|
"content-type": "text/html; charset=utf-8";
|
|
4
5
|
"cache-control": "no-store";
|
|
5
6
|
"referrer-policy": "no-referrer";
|
|
6
7
|
"x-content-type-options": "nosniff";
|
|
7
|
-
"content-security-policy": `default-src 'none'; style-src 'sha256-${string}'; base-uri 'none'; form-action '
|
|
8
|
+
"content-security-policy": `default-src 'none'; style-src 'sha256-${string}'; base-uri 'none'; form-action 'self'; frame-ancestors 'none'`;
|
|
8
9
|
}>;
|
|
9
|
-
|
|
10
|
-
export declare function renderOAuthCallbackPage(kind: OAuthCallbackPageKind): string;
|
|
10
|
+
export declare function renderOAuthCallbackPage(kind: OAuthPageKind, retryPath?: string): string;
|
|
11
11
|
export declare function login(options: GlobalOptions, loginHint?: string, scope?: string, signal?: AbortSignal): Promise<Session>;
|
|
12
12
|
export declare function resolveAccessToken(options: GlobalOptions, signal?: AbortSignal): Promise<{
|
|
13
13
|
token: string;
|
|
14
14
|
session?: Session;
|
|
15
15
|
}>;
|
|
16
|
-
export {};
|
package/dist/auth.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createHash, randomBytes } from "node:crypto";
|
|
2
|
-
import {
|
|
2
|
+
import { runOAuthSession } from "./oauth-session.js";
|
|
3
3
|
import { execFile } from "node:child_process";
|
|
4
4
|
import { promisify } from "node:util";
|
|
5
5
|
import { z } from "zod";
|
|
@@ -101,6 +101,7 @@ body {
|
|
|
101
101
|
|
|
102
102
|
.status-icon svg { width: 22px; height: 22px; }
|
|
103
103
|
.success { --status-color: var(--color-success); }
|
|
104
|
+
.waiting { --status-color: var(--color-accent); }
|
|
104
105
|
.error { --status-color: var(--color-error); }
|
|
105
106
|
|
|
106
107
|
.eyebrow {
|
|
@@ -157,6 +158,19 @@ h1 {
|
|
|
157
158
|
font-size: 12px;
|
|
158
159
|
}
|
|
159
160
|
|
|
161
|
+
.actions { display: grid; gap: 10px; margin-top: 24px; }
|
|
162
|
+
.actions form { margin: 0; }
|
|
163
|
+
.actions button {
|
|
164
|
+
width: 100%; min-height: 44px; padding: 10px 16px;
|
|
165
|
+
border: 1px solid var(--color-accent); border-radius: 4px;
|
|
166
|
+
background: var(--color-accent); color: var(--color-bg);
|
|
167
|
+
font: inherit; font-weight: 600; cursor: pointer;
|
|
168
|
+
}
|
|
169
|
+
.actions button:hover { filter: brightness(1.1); }
|
|
170
|
+
.actions .secondary { color: var(--color-text-bright); background: transparent; border-color: var(--color-border); }
|
|
171
|
+
.actions .secondary:hover { background: var(--color-input); }
|
|
172
|
+
.actions button:focus-visible { outline: 2px solid var(--color-accent); outline-offset: 3px; }
|
|
173
|
+
|
|
160
174
|
@media (prefers-color-scheme: light) {
|
|
161
175
|
:root {
|
|
162
176
|
color-scheme: light;
|
|
@@ -198,9 +212,9 @@ export const oauthCallbackResponseHeaders = Object.freeze({
|
|
|
198
212
|
"cache-control": "no-store",
|
|
199
213
|
"referrer-policy": "no-referrer",
|
|
200
214
|
"x-content-type-options": "nosniff",
|
|
201
|
-
"content-security-policy": `default-src 'none'; style-src 'sha256-${callbackPageStyleHash}'; base-uri 'none'; form-action '
|
|
215
|
+
"content-security-policy": `default-src 'none'; style-src 'sha256-${callbackPageStyleHash}'; base-uri 'none'; form-action 'self'; frame-ancestors 'none'`,
|
|
202
216
|
});
|
|
203
|
-
export function renderOAuthCallbackPage(kind) {
|
|
217
|
+
export function renderOAuthCallbackPage(kind, retryPath) {
|
|
204
218
|
const success = kind === "success";
|
|
205
219
|
const content = success
|
|
206
220
|
? {
|
|
@@ -209,24 +223,57 @@ export function renderOAuthCallbackPage(kind) {
|
|
|
209
223
|
status: "CLI session authorized",
|
|
210
224
|
hint: "This page does not need to remain open.",
|
|
211
225
|
}
|
|
212
|
-
: kind === "
|
|
226
|
+
: kind === "cancelled"
|
|
213
227
|
? {
|
|
214
|
-
title: "
|
|
215
|
-
description: "
|
|
228
|
+
title: "Sign-in cancelled",
|
|
229
|
+
description: "You cancelled authorization. No access was granted to the CLI. Try again, or sign in with a different account.",
|
|
216
230
|
status: "CLI session not authorized",
|
|
217
|
-
hint: "
|
|
231
|
+
hint: "Keep the CLI open. You can retry without restarting it.",
|
|
218
232
|
}
|
|
219
|
-
:
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
233
|
+
: kind === "waiting"
|
|
234
|
+
? {
|
|
235
|
+
title: "Finish signing in",
|
|
236
|
+
description: retryPath
|
|
237
|
+
? "Complete authorization in your browser. If you closed the page or chose the wrong account, you can restart below."
|
|
238
|
+
: "Finishing sign-in and saving your credentials securely. Please wait, or press Ctrl+C in your terminal to stop.",
|
|
239
|
+
status: "CLI waiting for authorization",
|
|
240
|
+
hint: retryPath
|
|
241
|
+
? "Press Enter in your terminal to retry, or Ctrl+C to stop."
|
|
242
|
+
: "Keep the CLI open while sign-in finishes.",
|
|
243
|
+
}
|
|
244
|
+
: kind === "timeout"
|
|
245
|
+
? {
|
|
246
|
+
title: "Sign-in timed out",
|
|
247
|
+
description: "This sign-in attempt expired. Your CLI is still running and ready for a fresh attempt.",
|
|
248
|
+
status: "CLI session not authorized",
|
|
249
|
+
hint: "Try again below without restarting the CLI.",
|
|
250
|
+
}
|
|
251
|
+
: kind === "invalid"
|
|
252
|
+
? {
|
|
253
|
+
title: "Invalid authorization response",
|
|
254
|
+
description: "This response does not match the active sign-in attempt. Your CLI is still waiting. Start a fresh attempt below.",
|
|
255
|
+
status: "CLI session not authorized",
|
|
256
|
+
hint: retryPath
|
|
257
|
+
? "Keep the CLI open. You can retry without restarting it."
|
|
258
|
+
: "Run borealis auth login to retry.",
|
|
259
|
+
}
|
|
260
|
+
: {
|
|
261
|
+
title: "Authorization incomplete",
|
|
262
|
+
description: "We couldn't finish signing you in. No new credentials were saved. Try again without restarting the CLI.",
|
|
263
|
+
status: "CLI session not authorized",
|
|
264
|
+
hint: retryPath
|
|
265
|
+
? "Keep the CLI open. You can retry without restarting it."
|
|
266
|
+
: "Run borealis auth login to retry.",
|
|
267
|
+
};
|
|
225
268
|
const icon = success
|
|
226
269
|
? '<path d="m5 12 4 4L19 6" />'
|
|
227
270
|
: '<path d="M6 6l12 12M18 6 6 18" />';
|
|
228
|
-
const statusClass = success
|
|
229
|
-
|
|
271
|
+
const statusClass = success
|
|
272
|
+
? "success"
|
|
273
|
+
: kind === "waiting"
|
|
274
|
+
? "waiting"
|
|
275
|
+
: "error";
|
|
276
|
+
const liveRole = success || kind === "waiting" ? "status" : "alert";
|
|
230
277
|
return `<!doctype html>
|
|
231
278
|
<html lang="en">
|
|
232
279
|
<head>
|
|
@@ -254,6 +301,12 @@ export function renderOAuthCallbackPage(kind) {
|
|
|
254
301
|
<p class="eyebrow">CLI authorization</p>
|
|
255
302
|
<h1 id="callback-title">${content.title}</h1>
|
|
256
303
|
<p class="description">${content.description}</p>
|
|
304
|
+
${!success && retryPath
|
|
305
|
+
? `<div class="actions">
|
|
306
|
+
<form action="${retryPath.replaceAll("&", "&").replaceAll('"', """).replaceAll("<", "<")}" method="post"><button type="submit">Try again</button></form>
|
|
307
|
+
<form action="${retryPath.replaceAll("&", "&").replaceAll('"', """).replaceAll("<", "<")}?account=change" method="post"><button class="secondary" type="submit">Use another account</button></form>
|
|
308
|
+
</div><p class="hint">Using another account signs you out of Borealis in this browser. Keep the CLI open; press Enter there to retry, or Ctrl+C to stop.</p>`
|
|
309
|
+
: ""}
|
|
257
310
|
<div class="cli-status">
|
|
258
311
|
<span class="status-dot" aria-hidden="true"></span>
|
|
259
312
|
<span>${content.status}</span>
|
|
@@ -301,137 +354,94 @@ export async function login(options, loginHint, scope = defaults.scope, signal)
|
|
|
301
354
|
const app = validateOrigin(options.app, "Application URL");
|
|
302
355
|
const api = validateOrigin(options.api, "API URL");
|
|
303
356
|
scope = validateLoginScope(scope);
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
const
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
357
|
+
return await runOAuthSession({
|
|
358
|
+
port: Number(new URL(defaults.redirectUri).port),
|
|
359
|
+
signal,
|
|
360
|
+
headers: oauthCallbackResponseHeaders,
|
|
361
|
+
renderPage: renderOAuthCallbackPage,
|
|
362
|
+
openBrowser,
|
|
363
|
+
createAttempt(redirectUri, _retry, switchAccount) {
|
|
364
|
+
const verifier = base64Url(randomBytes(32));
|
|
365
|
+
const challenge = base64Url(createHash("sha256").update(verifier, "ascii").digest());
|
|
366
|
+
const state = base64Url(randomBytes(24));
|
|
367
|
+
const authorize = new URL("/auth/client/start", app);
|
|
368
|
+
for (const [key, value] of Object.entries({
|
|
369
|
+
client_type: "cli",
|
|
370
|
+
client_id: defaults.clientId,
|
|
371
|
+
redirect_uri: redirectUri,
|
|
372
|
+
scope,
|
|
373
|
+
state,
|
|
374
|
+
code_challenge: challenge,
|
|
375
|
+
code_challenge_method: "S256",
|
|
376
|
+
}))
|
|
377
|
+
authorize.searchParams.set(key, value);
|
|
378
|
+
if (loginHint && !switchAccount)
|
|
379
|
+
authorize.searchParams.set("login_hint", loginHint);
|
|
380
|
+
const entry = switchAccount ? new URL("/auth/logout", app) : authorize;
|
|
381
|
+
if (switchAccount)
|
|
382
|
+
entry.searchParams.set("returnUrl", authorize.pathname + authorize.search);
|
|
383
|
+
return {
|
|
384
|
+
state,
|
|
385
|
+
authorizationUrl: entry.toString(),
|
|
386
|
+
async complete(code, signal) {
|
|
387
|
+
const token = await requestToken(identity, new URLSearchParams({
|
|
388
|
+
grant_type: "authorization_code",
|
|
389
|
+
code,
|
|
390
|
+
client_id: defaults.clientId,
|
|
391
|
+
redirect_uri: redirectUri,
|
|
392
|
+
code_verifier: verifier,
|
|
393
|
+
}), signal);
|
|
394
|
+
if (!token.refresh_token)
|
|
395
|
+
throw new Error("The authorization server did not return a refresh token.");
|
|
396
|
+
const contextDeadline = createRequestDeadline(signal, 30_000);
|
|
397
|
+
let contextResponse;
|
|
398
|
+
let contextText;
|
|
399
|
+
try {
|
|
400
|
+
contextResponse = await fetch(`${api}/api/v1/context`, {
|
|
401
|
+
headers: {
|
|
402
|
+
authorization: `Bearer ${token.access_token}`,
|
|
403
|
+
accept: "application/json",
|
|
404
|
+
...(options.organization
|
|
405
|
+
? { "x-organization-id": options.organization }
|
|
406
|
+
: {}),
|
|
407
|
+
},
|
|
408
|
+
redirect: "error",
|
|
409
|
+
signal: contextDeadline.signal,
|
|
410
|
+
});
|
|
411
|
+
contextText = await readBoundedResponse(contextResponse, 1024 * 1024, contextDeadline.signal);
|
|
412
|
+
}
|
|
413
|
+
finally {
|
|
414
|
+
contextDeadline.dispose();
|
|
415
|
+
}
|
|
416
|
+
if (!contextResponse.ok)
|
|
417
|
+
throw new Error(`Borealis context validation failed (${contextResponse.status}).`);
|
|
418
|
+
const context = z
|
|
419
|
+
.object({
|
|
420
|
+
selectedOrganizationId: z.string().min(1).nullable().optional(),
|
|
421
|
+
organizations: z.array(z.object({ organizationId: z.string().min(1) })),
|
|
422
|
+
})
|
|
423
|
+
.parse(JSON.parse(contextText));
|
|
424
|
+
if (options.organization &&
|
|
425
|
+
!context.organizations.some((membership) => membership.organizationId === options.organization))
|
|
426
|
+
throw new Error(`The authenticated user is not a member of organization '${options.organization}'.`);
|
|
427
|
+
const organization = options.organization ?? context.selectedOrganizationId ?? undefined;
|
|
428
|
+
const session = {
|
|
429
|
+
accessToken: token.access_token,
|
|
430
|
+
refreshToken: token.refresh_token,
|
|
431
|
+
expiresAt: new Date(Date.now() + token.expires_in * 1000).toISOString(),
|
|
432
|
+
scope: token.scope,
|
|
433
|
+
clientId: defaults.clientId,
|
|
434
|
+
api,
|
|
435
|
+
identity,
|
|
436
|
+
app,
|
|
437
|
+
...(organization ? { organization } : {}),
|
|
438
|
+
};
|
|
439
|
+
await saveSession(options.profile, session, signal);
|
|
440
|
+
return session;
|
|
441
|
+
},
|
|
442
|
+
};
|
|
443
|
+
},
|
|
336
444
|
});
|
|
337
|
-
const authorize = new URL("/auth/client/start", app);
|
|
338
|
-
for (const [key, value] of Object.entries({
|
|
339
|
-
client_type: "cli",
|
|
340
|
-
client_id: defaults.clientId,
|
|
341
|
-
redirect_uri: redirectUri,
|
|
342
|
-
scope,
|
|
343
|
-
state,
|
|
344
|
-
code_challenge: challenge,
|
|
345
|
-
code_challenge_method: "S256",
|
|
346
|
-
}))
|
|
347
|
-
authorize.searchParams.set(key, value);
|
|
348
|
-
if (loginHint)
|
|
349
|
-
authorize.searchParams.set("login_hint", loginHint);
|
|
350
|
-
process.stderr.write(`Opening ${authorize.origin} for authentication…\n`);
|
|
351
|
-
let code;
|
|
352
|
-
let callbackTimeout;
|
|
353
|
-
let rejectForAbort;
|
|
354
|
-
try {
|
|
355
|
-
if (!server.listening) {
|
|
356
|
-
await new Promise((resolve, reject) => {
|
|
357
|
-
server.once("listening", resolve);
|
|
358
|
-
server.once("error", reject);
|
|
359
|
-
});
|
|
360
|
-
}
|
|
361
|
-
await openBrowser(authorize.toString());
|
|
362
|
-
code = await Promise.race([
|
|
363
|
-
callback,
|
|
364
|
-
new Promise((_, reject) => {
|
|
365
|
-
rejectForAbort = () => reject(signal?.reason ?? new DOMException("Aborted", "AbortError"));
|
|
366
|
-
signal?.addEventListener("abort", rejectForAbort, { once: true });
|
|
367
|
-
}),
|
|
368
|
-
new Promise((_, reject) => {
|
|
369
|
-
callbackTimeout = setTimeout(() => reject(new Error("OAuth callback timed out after five minutes.")), 5 * 60 * 1000);
|
|
370
|
-
callbackTimeout.unref();
|
|
371
|
-
}),
|
|
372
|
-
]);
|
|
373
|
-
}
|
|
374
|
-
finally {
|
|
375
|
-
if (callbackTimeout)
|
|
376
|
-
clearTimeout(callbackTimeout);
|
|
377
|
-
if (rejectForAbort)
|
|
378
|
-
signal?.removeEventListener("abort", rejectForAbort);
|
|
379
|
-
server.close();
|
|
380
|
-
}
|
|
381
|
-
const token = await requestToken(identity, new URLSearchParams({
|
|
382
|
-
grant_type: "authorization_code",
|
|
383
|
-
code,
|
|
384
|
-
client_id: defaults.clientId,
|
|
385
|
-
redirect_uri: redirectUri,
|
|
386
|
-
code_verifier: verifier,
|
|
387
|
-
}), signal);
|
|
388
|
-
if (!token.refresh_token)
|
|
389
|
-
throw new Error("The authorization server did not return a refresh token.");
|
|
390
|
-
const contextDeadline = createRequestDeadline(signal, 30_000);
|
|
391
|
-
let contextResponse;
|
|
392
|
-
let contextText;
|
|
393
|
-
try {
|
|
394
|
-
contextResponse = await fetch(`${api}/api/v1/context`, {
|
|
395
|
-
headers: {
|
|
396
|
-
authorization: `Bearer ${token.access_token}`,
|
|
397
|
-
accept: "application/json",
|
|
398
|
-
...(options.organization
|
|
399
|
-
? { "x-organization-id": options.organization }
|
|
400
|
-
: {}),
|
|
401
|
-
},
|
|
402
|
-
redirect: "error",
|
|
403
|
-
signal: contextDeadline.signal,
|
|
404
|
-
});
|
|
405
|
-
contextText = await readBoundedResponse(contextResponse, 1024 * 1024, contextDeadline.signal);
|
|
406
|
-
}
|
|
407
|
-
finally {
|
|
408
|
-
contextDeadline.dispose();
|
|
409
|
-
}
|
|
410
|
-
if (!contextResponse.ok)
|
|
411
|
-
throw new Error(`Borealis context validation failed (${contextResponse.status}).`);
|
|
412
|
-
const context = z
|
|
413
|
-
.object({
|
|
414
|
-
selectedOrganizationId: z.string().min(1).nullable().optional(),
|
|
415
|
-
organizations: z.array(z.object({ organizationId: z.string().min(1) })),
|
|
416
|
-
})
|
|
417
|
-
.parse(JSON.parse(contextText));
|
|
418
|
-
if (options.organization &&
|
|
419
|
-
!context.organizations.some((membership) => membership.organizationId === options.organization))
|
|
420
|
-
throw new Error(`The authenticated user is not a member of organization '${options.organization}'.`);
|
|
421
|
-
const organization = options.organization ?? context.selectedOrganizationId ?? undefined;
|
|
422
|
-
const session = {
|
|
423
|
-
accessToken: token.access_token,
|
|
424
|
-
refreshToken: token.refresh_token,
|
|
425
|
-
expiresAt: new Date(Date.now() + token.expires_in * 1000).toISOString(),
|
|
426
|
-
scope: token.scope,
|
|
427
|
-
clientId: defaults.clientId,
|
|
428
|
-
api,
|
|
429
|
-
identity,
|
|
430
|
-
app,
|
|
431
|
-
...(organization ? { organization } : {}),
|
|
432
|
-
};
|
|
433
|
-
await saveSession(options.profile, session, signal);
|
|
434
|
-
return session;
|
|
435
445
|
}
|
|
436
446
|
async function readBoundedResponse(response, limit, signal) {
|
|
437
447
|
const reader = response.body?.getReader();
|
package/dist/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Readable } from "node:stream";
|
|
2
|
+
export type OAuthPageKind = "waiting" | "success" | "cancelled" | "failed" | "invalid" | "timeout";
|
|
3
|
+
type Attempt<T> = {
|
|
4
|
+
state: string;
|
|
5
|
+
authorizationUrl: string;
|
|
6
|
+
complete(code: string, signal: AbortSignal): Promise<T>;
|
|
7
|
+
};
|
|
8
|
+
type Options<T> = {
|
|
9
|
+
input?: Readable & {
|
|
10
|
+
isTTY?: boolean;
|
|
11
|
+
};
|
|
12
|
+
port?: number;
|
|
13
|
+
signal?: AbortSignal | undefined;
|
|
14
|
+
createAttempt(redirectUri: string, retry: boolean, switchAccount: boolean): Attempt<T>;
|
|
15
|
+
renderPage(kind: OAuthPageKind, retryPath?: string): string;
|
|
16
|
+
headers: Readonly<Record<string, string>>;
|
|
17
|
+
openBrowser?: ((url: string) => Promise<void>) | undefined;
|
|
18
|
+
attemptTimeoutMs?: number;
|
|
19
|
+
retryTimeoutMs?: number;
|
|
20
|
+
};
|
|
21
|
+
/** A bounded login session, not a single callback: failed attempts remain retryable.
|
|
22
|
+
* Each retry replaces the entire state/PKCE attempt. No credentials enter the page.
|
|
23
|
+
*/
|
|
24
|
+
export declare function runOAuthSession<T>(options: Options<T>): Promise<T>;
|
|
25
|
+
export {};
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { randomBytes, timingSafeEqual } from "node:crypto";
|
|
2
|
+
import { createServer } from "node:http";
|
|
3
|
+
import { createInterface } from "node:readline";
|
|
4
|
+
/** A bounded login session, not a single callback: failed attempts remain retryable.
|
|
5
|
+
* Each retry replaces the entire state/PKCE attempt. No credentials enter the page.
|
|
6
|
+
*/
|
|
7
|
+
export async function runOAuthSession(options) {
|
|
8
|
+
options.signal?.throwIfAborted();
|
|
9
|
+
const server = createServer();
|
|
10
|
+
const input = options.input ?? process.stdin;
|
|
11
|
+
const controller = new AbortController();
|
|
12
|
+
const recoveryPath = `/auth/${randomBytes(32).toString("base64url")}`;
|
|
13
|
+
let timer;
|
|
14
|
+
let terminal;
|
|
15
|
+
const wasFlowing = input.readableFlowing === true;
|
|
16
|
+
let ended = false;
|
|
17
|
+
let succeeded = false;
|
|
18
|
+
let removeAbort;
|
|
19
|
+
let phase = "waiting";
|
|
20
|
+
let kind = "waiting";
|
|
21
|
+
let attempt;
|
|
22
|
+
let retryPath;
|
|
23
|
+
let pageHeaders = options.headers;
|
|
24
|
+
try {
|
|
25
|
+
await new Promise((resolve, reject) => {
|
|
26
|
+
server.once("error", reject);
|
|
27
|
+
server.listen(options.port ?? 0, "127.0.0.1", () => {
|
|
28
|
+
server.off("error", reject);
|
|
29
|
+
resolve();
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
const address = server.address();
|
|
33
|
+
if (!address || typeof address === "string")
|
|
34
|
+
throw new Error("Could not reserve an OAuth callback port.");
|
|
35
|
+
const origin = `http://127.0.0.1:${address.port}`;
|
|
36
|
+
const redirectUri = `${origin}/callback/`;
|
|
37
|
+
return await new Promise((resolve, reject) => {
|
|
38
|
+
const stop = (error) => {
|
|
39
|
+
if (ended)
|
|
40
|
+
return;
|
|
41
|
+
ended = true;
|
|
42
|
+
controller.abort(error);
|
|
43
|
+
reject(error);
|
|
44
|
+
};
|
|
45
|
+
const onAbort = () => stop(new Error("OAuth login was interrupted."));
|
|
46
|
+
const writePage = (response, page, status = 200) => {
|
|
47
|
+
response.writeHead(status, pageHeaders);
|
|
48
|
+
response.end(options.renderPage(page, phase === "exchanging" ? undefined : retryPath));
|
|
49
|
+
};
|
|
50
|
+
const failed = (page) => {
|
|
51
|
+
phase = "failed";
|
|
52
|
+
kind = page;
|
|
53
|
+
clearTimeout(timer);
|
|
54
|
+
timer = setTimeout(() => stop(new Error("OAuth login expired while waiting for a retry.")), options.retryTimeoutMs ?? 600_000);
|
|
55
|
+
process.stderr.write(`Sign-in ${page === "cancelled" ? "was cancelled" : page === "timeout" ? "timed out" : "failed"}. No new credentials were saved.\nRetry in your browser: ${origin}${recoveryPath}\n`);
|
|
56
|
+
if (terminal)
|
|
57
|
+
process.stderr.write("Press Enter to try again, or Ctrl+C to stop.\n");
|
|
58
|
+
};
|
|
59
|
+
const begin = (retry, switchAccount = false) => {
|
|
60
|
+
attempt = options.createAttempt(redirectUri, retry, switchAccount);
|
|
61
|
+
// Browsers enforce form-action across redirects as well as the local POST.
|
|
62
|
+
// Only allow the configured application origin, never a callback parameter.
|
|
63
|
+
pageHeaders = {
|
|
64
|
+
...options.headers,
|
|
65
|
+
"content-security-policy": options.headers["content-security-policy"].replace("form-action 'self'", `form-action 'self' ${new URL(attempt.authorizationUrl).origin}`),
|
|
66
|
+
};
|
|
67
|
+
retryPath = `/retry/${randomBytes(32).toString("base64url")}`;
|
|
68
|
+
phase = "waiting";
|
|
69
|
+
kind = "waiting";
|
|
70
|
+
clearTimeout(timer);
|
|
71
|
+
timer = setTimeout(() => failed("timeout"), options.attemptTimeoutMs ?? 300_000);
|
|
72
|
+
return attempt.authorizationUrl;
|
|
73
|
+
};
|
|
74
|
+
const launch = (url) => {
|
|
75
|
+
// Always provide a copyable URL, including when the browser launcher fails.
|
|
76
|
+
process.stderr.write(`${url}\n`);
|
|
77
|
+
if (options.openBrowser) {
|
|
78
|
+
void options.openBrowser(url).catch(() => {
|
|
79
|
+
if (!ended)
|
|
80
|
+
process.stderr.write("Could not open the browser. Open the sign-in URL above manually.\n");
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
server.on("error", stop);
|
|
85
|
+
server.on("request", (request, response) => {
|
|
86
|
+
request.resume();
|
|
87
|
+
if (request.headers.host !== new URL(origin).host) {
|
|
88
|
+
response
|
|
89
|
+
.writeHead(403, pageHeaders)
|
|
90
|
+
.end(options.renderPage("invalid"));
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const url = new URL(request.url ?? "/", origin);
|
|
94
|
+
if (ended) {
|
|
95
|
+
response
|
|
96
|
+
.writeHead(410, pageHeaders)
|
|
97
|
+
.end(options.renderPage("timeout"));
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
if (url.pathname === recoveryPath && request.method === "GET") {
|
|
101
|
+
writePage(response, kind);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
if (url.pathname === retryPath && request.method === "POST") {
|
|
105
|
+
if ((request.headers.origin &&
|
|
106
|
+
request.headers.origin !== origin &&
|
|
107
|
+
// Referrer-Policy: no-referrer gives navigational POSTs an opaque Origin.
|
|
108
|
+
!(request.headers.origin === "null" &&
|
|
109
|
+
request.headers["sec-fetch-site"] === "same-origin")) ||
|
|
110
|
+
request.headers["sec-fetch-site"] === "cross-site") {
|
|
111
|
+
response
|
|
112
|
+
.writeHead(403, pageHeaders)
|
|
113
|
+
.end(options.renderPage("invalid"));
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
if (phase === "exchanging") {
|
|
117
|
+
writePage(response, "waiting", 409);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
const next = begin(true, url.searchParams.get("account") === "change");
|
|
121
|
+
// Redirect only to a URL constructed by the CLI, never a request parameter.
|
|
122
|
+
response.writeHead(303, { ...pageHeaders, location: next }).end();
|
|
123
|
+
process.stderr.write("Starting a fresh sign-in attempt in your browser.\n");
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
if (url.pathname !== "/callback/" || request.method !== "GET") {
|
|
127
|
+
response
|
|
128
|
+
.writeHead(404, pageHeaders)
|
|
129
|
+
.end(options.renderPage("invalid"));
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
const state = Buffer.from(url.searchParams.get("state") ?? "");
|
|
133
|
+
const expectedState = Buffer.from(attempt.state);
|
|
134
|
+
if (url.searchParams.getAll("state").length !== 1 ||
|
|
135
|
+
state.length !== expectedState.length ||
|
|
136
|
+
!timingSafeEqual(state, expectedState)) {
|
|
137
|
+
// Unrelated and stale callbacks cannot kill or consume the active attempt.
|
|
138
|
+
writePage(response, "invalid", 400);
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
if (phase !== "waiting") {
|
|
142
|
+
writePage(response, kind, 409);
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
const code = url.searchParams.get("code");
|
|
146
|
+
const error = url.searchParams.get("error");
|
|
147
|
+
if (error || !code || url.searchParams.getAll("code").length !== 1) {
|
|
148
|
+
failed(error === "access_denied" ? "cancelled" : "failed");
|
|
149
|
+
writePage(response, kind, 400);
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
phase = "exchanging";
|
|
153
|
+
clearTimeout(timer);
|
|
154
|
+
// Keep the browser request open until tokens, identity/context, and storage
|
|
155
|
+
// are all verified. Never show a success page for a failed token exchange.
|
|
156
|
+
void attempt.complete(code, controller.signal).then((value) => {
|
|
157
|
+
if (ended)
|
|
158
|
+
return;
|
|
159
|
+
ended = true;
|
|
160
|
+
succeeded = true;
|
|
161
|
+
response.writeHead(200, pageHeaders);
|
|
162
|
+
response.end(options.renderPage("success"));
|
|
163
|
+
resolve(value);
|
|
164
|
+
}, () => {
|
|
165
|
+
if (ended)
|
|
166
|
+
return;
|
|
167
|
+
failed("failed");
|
|
168
|
+
writePage(response, kind, 400);
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
options.signal?.addEventListener("abort", onAbort, { once: true });
|
|
172
|
+
// The foreground listener must be removed on every terminal outcome.
|
|
173
|
+
removeAbort = () => options.signal?.removeEventListener("abort", onAbort);
|
|
174
|
+
if (input.isTTY) {
|
|
175
|
+
terminal = createInterface({ input });
|
|
176
|
+
terminal.on("line", () => {
|
|
177
|
+
if (ended)
|
|
178
|
+
return;
|
|
179
|
+
if (phase === "exchanging") {
|
|
180
|
+
process.stderr.write("Finishing sign-in. Please wait, or press Ctrl+C to stop.\n");
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
launch(begin(true));
|
|
184
|
+
});
|
|
185
|
+
terminal.on("SIGINT", onAbort);
|
|
186
|
+
process.stderr.write("Press Enter to restart sign-in, or Ctrl+C to stop.\n");
|
|
187
|
+
}
|
|
188
|
+
const initial = begin(false);
|
|
189
|
+
process.stderr.write(`If sign-in is cancelled or the browser gets stuck, retry here: ${origin}${recoveryPath}\n`);
|
|
190
|
+
if (options.signal?.aborted)
|
|
191
|
+
onAbort();
|
|
192
|
+
else
|
|
193
|
+
launch(initial);
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
finally {
|
|
197
|
+
ended = true;
|
|
198
|
+
clearTimeout(timer);
|
|
199
|
+
removeAbort?.();
|
|
200
|
+
controller.abort();
|
|
201
|
+
terminal?.close();
|
|
202
|
+
if (terminal && wasFlowing)
|
|
203
|
+
input.resume();
|
|
204
|
+
server.close();
|
|
205
|
+
server.closeIdleConnections();
|
|
206
|
+
if (!succeeded)
|
|
207
|
+
server.closeAllConnections();
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=oauth-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-session.js","sourceRoot":"","sources":["../src/oauth-session.ts"],"names":[],"mappings":"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"}
|