@baukit/auth-node 0.3.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/LICENSE +21 -0
- package/README.md +76 -0
- package/dist/cache.d.ts +38 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +316 -0
- package/dist/cache.js.map +1 -0
- package/dist/device-flow.d.ts +80 -0
- package/dist/device-flow.d.ts.map +1 -0
- package/dist/device-flow.js +567 -0
- package/dist/device-flow.js.map +1 -0
- package/dist/errors.d.ts +13 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +38 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1,567 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { createHash, randomBytes } from 'node:crypto';
|
|
3
|
+
import { NodeTokenCache } from './cache.js';
|
|
4
|
+
import { AuthNodeError } from './errors.js';
|
|
5
|
+
const DEFAULT_SCOPES = ['openid', 'profile', 'offline_access'];
|
|
6
|
+
const DEFAULT_DEVICE_INTERVAL_SECONDS = 5;
|
|
7
|
+
const SLOW_DOWN_INCREMENT_SECONDS = 5;
|
|
8
|
+
const DEFAULT_MAX_RESPONSE_BYTES = 64 * 1024;
|
|
9
|
+
const DEFAULT_REQUEST_TIMEOUT_MS = 15_000;
|
|
10
|
+
const DEFAULT_LOGIN_TIMEOUT_MS = 10 * 60 * 1000;
|
|
11
|
+
const DEFAULT_REFRESH_LEEWAY_SECONDS = 60;
|
|
12
|
+
const DISPLAY_CLAIMS_MAX_BYTES = 16 * 1024;
|
|
13
|
+
const DEVICE_GRANT = 'urn:ietf:params:oauth:grant-type:device_code';
|
|
14
|
+
const refreshFlights = new Map();
|
|
15
|
+
/** Node OIDC device-flow client. It never writes to stdout, stderr, or a logger. */
|
|
16
|
+
export class DeviceFlowClient {
|
|
17
|
+
#config;
|
|
18
|
+
#environment;
|
|
19
|
+
#cache;
|
|
20
|
+
#metadataPromise;
|
|
21
|
+
constructor(config, environment = {}) {
|
|
22
|
+
this.#config = normalizeConfig(config);
|
|
23
|
+
this.#environment = {
|
|
24
|
+
fetch: environment.fetch ?? globalThis.fetch,
|
|
25
|
+
now: environment.now ?? Date.now,
|
|
26
|
+
sleep: environment.sleep ?? abortableDelay,
|
|
27
|
+
...(environment.signal === undefined ? {} : { signal: environment.signal }),
|
|
28
|
+
...(environment.environmentToken === undefined
|
|
29
|
+
? {}
|
|
30
|
+
: { environmentToken: environment.environmentToken }),
|
|
31
|
+
};
|
|
32
|
+
this.#cache = new NodeTokenCache({
|
|
33
|
+
...config.cache,
|
|
34
|
+
now: config.cache.now ?? this.#environment.now,
|
|
35
|
+
sleep: config.cache.sleep ?? this.#environment.sleep,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
discover(signal) {
|
|
39
|
+
const requestSignal = combineSignals(this.#environment.signal, signal);
|
|
40
|
+
this.#metadataPromise ??= discoverDeviceProvider(this.#config.issuer, this.#config.endpointPolicy, this.#environment.fetch, {
|
|
41
|
+
maxResponseBytes: this.#config.maxResponseBytes,
|
|
42
|
+
requestTimeoutMs: this.#config.requestTimeoutMs,
|
|
43
|
+
...(requestSignal === undefined ? {} : { signal: requestSignal }),
|
|
44
|
+
}).catch((error) => {
|
|
45
|
+
this.#metadataPromise = undefined;
|
|
46
|
+
throw error;
|
|
47
|
+
});
|
|
48
|
+
return this.#metadataPromise;
|
|
49
|
+
}
|
|
50
|
+
async login(options = {}) {
|
|
51
|
+
const parentSignal = combineSignals(this.#environment.signal, options.signal);
|
|
52
|
+
const total = timeoutSignal(parentSignal, this.#config.loginTimeoutMs);
|
|
53
|
+
try {
|
|
54
|
+
const metadata = await this.discover(total.signal);
|
|
55
|
+
const device = await this.#authorizeDevice(metadata, total.signal);
|
|
56
|
+
const verification = {
|
|
57
|
+
verificationUri: device.verificationUri,
|
|
58
|
+
userCode: device.userCode,
|
|
59
|
+
...(device.verificationUriComplete === undefined
|
|
60
|
+
? {}
|
|
61
|
+
: { verificationUriComplete: device.verificationUriComplete }),
|
|
62
|
+
};
|
|
63
|
+
await options.presentation?.showVerification?.(verification);
|
|
64
|
+
const browserUri = device.verificationUriComplete ?? device.verificationUri;
|
|
65
|
+
await options.presentation?.openBrowser?.(browserUri);
|
|
66
|
+
const token = await this.#poll(metadata, device, total.signal, options.presentation);
|
|
67
|
+
const profile = this.#toCachedProfile(token);
|
|
68
|
+
await this.#cache.write(this.#config.profile, profile, total.signal);
|
|
69
|
+
return profile;
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
throw mapAbort(error, parentSignal, total.didTimeout());
|
|
73
|
+
}
|
|
74
|
+
finally {
|
|
75
|
+
total.dispose();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
async accessToken(options = {}) {
|
|
79
|
+
const environmentToken = (await this.#environment.environmentToken?.())?.trim();
|
|
80
|
+
if (environmentToken)
|
|
81
|
+
return environmentToken;
|
|
82
|
+
const signal = combineSignals(this.#environment.signal, options.signal);
|
|
83
|
+
throwIfAborted(signal);
|
|
84
|
+
const cached = await this.#cache.read(this.#config.profile);
|
|
85
|
+
if (cached === undefined || !this.#matchesConfig(cached)) {
|
|
86
|
+
throw new AuthNodeError('no_cached_session');
|
|
87
|
+
}
|
|
88
|
+
if (options.forceRefresh !== true && this.#isFresh(cached))
|
|
89
|
+
return cached.accessToken;
|
|
90
|
+
if (cached.refreshToken === undefined)
|
|
91
|
+
throw new AuthNodeError('no_cached_session');
|
|
92
|
+
const flightKey = `${this.#cache.path}\0${this.#config.profile}`;
|
|
93
|
+
let flight = refreshFlights.get(flightKey);
|
|
94
|
+
if (flight === undefined) {
|
|
95
|
+
flight = this.#refreshUnderLock(cached, options.forceRefresh === true, signal);
|
|
96
|
+
refreshFlights.set(flightKey, flight);
|
|
97
|
+
const clearFlight = () => {
|
|
98
|
+
if (refreshFlights.get(flightKey) === flight)
|
|
99
|
+
refreshFlights.delete(flightKey);
|
|
100
|
+
};
|
|
101
|
+
void flight.then(clearFlight, clearFlight);
|
|
102
|
+
}
|
|
103
|
+
return (await flight).accessToken;
|
|
104
|
+
}
|
|
105
|
+
logout(signal) {
|
|
106
|
+
return this.#cache.remove(this.#config.profile, combineSignals(this.#environment.signal, signal));
|
|
107
|
+
}
|
|
108
|
+
/** Returns unverified claims for display text only. Never use them for authorization or identity keys. */
|
|
109
|
+
async displayClaims() {
|
|
110
|
+
const cached = await this.#cache.read(this.#config.profile);
|
|
111
|
+
if (cached === undefined)
|
|
112
|
+
return undefined;
|
|
113
|
+
return decodeDisplayOnlyClaims(cached.idToken ?? cached.accessToken);
|
|
114
|
+
}
|
|
115
|
+
async #authorizeDevice(metadata, signal) {
|
|
116
|
+
const codeVerifier = randomBytes(32).toString('base64url');
|
|
117
|
+
const codeChallenge = createHash('sha256').update(codeVerifier).digest('base64url');
|
|
118
|
+
const response = await postForm(metadata.deviceAuthorizationEndpoint, {
|
|
119
|
+
client_id: this.#config.clientId,
|
|
120
|
+
scope: this.#config.scopes.join(' '),
|
|
121
|
+
code_challenge: codeChallenge,
|
|
122
|
+
code_challenge_method: 'S256',
|
|
123
|
+
...(this.#config.audience === undefined ? {} : { audience: this.#config.audience }),
|
|
124
|
+
}, this.#environment.fetch, this.#requestOptions(signal), 'invalid_device_response', 'device_authorization_failed');
|
|
125
|
+
if (!response.response.ok) {
|
|
126
|
+
throw new AuthNodeError('device_authorization_failed', { status: response.response.status });
|
|
127
|
+
}
|
|
128
|
+
const body = response.body;
|
|
129
|
+
const verificationUri = requiredString(body, 'verification_uri', 'invalid_device_response');
|
|
130
|
+
validateWebUrl(verificationUri, this.#config.endpointPolicy.allowLoopbackHttp);
|
|
131
|
+
const verificationUriComplete = optionalString(body, 'verification_uri_complete');
|
|
132
|
+
if (verificationUriComplete !== undefined) {
|
|
133
|
+
validateWebUrl(verificationUriComplete, this.#config.endpointPolicy.allowLoopbackHttp);
|
|
134
|
+
}
|
|
135
|
+
return {
|
|
136
|
+
deviceCode: requiredString(body, 'device_code', 'invalid_device_response'),
|
|
137
|
+
userCode: requiredString(body, 'user_code', 'invalid_device_response'),
|
|
138
|
+
verificationUri,
|
|
139
|
+
...(verificationUriComplete === undefined ? {} : { verificationUriComplete }),
|
|
140
|
+
expiresIn: requiredPositiveInteger(body, 'expires_in', 'invalid_device_response'),
|
|
141
|
+
interval: optionalPositiveInteger(body, 'interval', 'invalid_device_response') ??
|
|
142
|
+
DEFAULT_DEVICE_INTERVAL_SECONDS,
|
|
143
|
+
codeVerifier,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
async #poll(metadata, device, signal, presentation) {
|
|
147
|
+
const deviceDeadline = this.#environment.now() + device.expiresIn * 1000;
|
|
148
|
+
let intervalSeconds = device.interval;
|
|
149
|
+
await presentation?.showStatus?.('waiting');
|
|
150
|
+
while (this.#environment.now() < deviceDeadline) {
|
|
151
|
+
await this.#environment.sleep(intervalSeconds * 1000, signal);
|
|
152
|
+
throwIfAborted(signal);
|
|
153
|
+
if (this.#environment.now() >= deviceDeadline)
|
|
154
|
+
break;
|
|
155
|
+
const result = await postForm(metadata.tokenEndpoint, {
|
|
156
|
+
grant_type: DEVICE_GRANT,
|
|
157
|
+
device_code: device.deviceCode,
|
|
158
|
+
client_id: this.#config.clientId,
|
|
159
|
+
code_verifier: device.codeVerifier,
|
|
160
|
+
}, this.#environment.fetch, this.#requestOptions(signal), 'invalid_token_response', 'device_authorization_failed');
|
|
161
|
+
if (result.response.ok) {
|
|
162
|
+
await presentation?.showStatus?.('authorized');
|
|
163
|
+
return parseTokenResponse(result.body);
|
|
164
|
+
}
|
|
165
|
+
const oauthError = optionalString(result.body, 'error');
|
|
166
|
+
if (oauthError === 'authorization_pending')
|
|
167
|
+
continue;
|
|
168
|
+
if (oauthError === 'slow_down') {
|
|
169
|
+
intervalSeconds += SLOW_DOWN_INCREMENT_SECONDS;
|
|
170
|
+
await presentation?.showStatus?.('slow-down');
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
if (oauthError === 'access_denied')
|
|
174
|
+
throw new AuthNodeError('device_authorization_denied');
|
|
175
|
+
if (oauthError === 'expired_token')
|
|
176
|
+
throw new AuthNodeError('device_authorization_expired');
|
|
177
|
+
throw new AuthNodeError('device_authorization_failed', { status: result.response.status });
|
|
178
|
+
}
|
|
179
|
+
throw new AuthNodeError('device_authorization_expired');
|
|
180
|
+
}
|
|
181
|
+
async #refreshUnderLock(observed, forceRefresh, signal) {
|
|
182
|
+
return this.#cache.withLock(async (transaction) => {
|
|
183
|
+
const current = await transaction.read(this.#config.profile);
|
|
184
|
+
if (current === undefined || !this.#matchesConfig(current)) {
|
|
185
|
+
throw new AuthNodeError('no_cached_session');
|
|
186
|
+
}
|
|
187
|
+
if (current.accessToken !== observed.accessToken ||
|
|
188
|
+
(!forceRefresh && this.#isFresh(current))) {
|
|
189
|
+
return current;
|
|
190
|
+
}
|
|
191
|
+
if (current.refreshToken === undefined)
|
|
192
|
+
throw new AuthNodeError('no_cached_session');
|
|
193
|
+
const metadata = await this.discover(signal);
|
|
194
|
+
const result = await postForm(metadata.tokenEndpoint, {
|
|
195
|
+
grant_type: 'refresh_token',
|
|
196
|
+
refresh_token: current.refreshToken,
|
|
197
|
+
client_id: this.#config.clientId,
|
|
198
|
+
...(this.#config.audience === undefined ? {} : { audience: this.#config.audience }),
|
|
199
|
+
}, this.#environment.fetch, this.#requestOptions(signal), 'invalid_token_response', 'refresh_failed');
|
|
200
|
+
if (!result.response.ok) {
|
|
201
|
+
throw new AuthNodeError('refresh_failed', {
|
|
202
|
+
retryable: result.response.status >= 500,
|
|
203
|
+
status: result.response.status,
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
const token = parseTokenResponse(result.body);
|
|
207
|
+
const refreshed = this.#toCachedProfile(token, current.refreshToken);
|
|
208
|
+
await transaction.write(this.#config.profile, refreshed);
|
|
209
|
+
return refreshed;
|
|
210
|
+
}, signal);
|
|
211
|
+
}
|
|
212
|
+
#toCachedProfile(token, previousRefreshToken) {
|
|
213
|
+
const refreshToken = token.refreshToken ?? previousRefreshToken;
|
|
214
|
+
return {
|
|
215
|
+
accessToken: token.accessToken,
|
|
216
|
+
...(refreshToken === undefined ? {} : { refreshToken }),
|
|
217
|
+
...(token.idToken === undefined ? {} : { idToken: token.idToken }),
|
|
218
|
+
tokenType: token.tokenType,
|
|
219
|
+
expiresAt: this.#environment.now() + token.expiresIn * 1000,
|
|
220
|
+
issuer: this.#config.issuer,
|
|
221
|
+
clientId: this.#config.clientId,
|
|
222
|
+
scopes: this.#config.scopes,
|
|
223
|
+
...(this.#config.audience === undefined ? {} : { audience: this.#config.audience }),
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
#isFresh(profile) {
|
|
227
|
+
return profile.expiresAt > this.#environment.now() + this.#config.refreshLeewayMs;
|
|
228
|
+
}
|
|
229
|
+
#matchesConfig(profile) {
|
|
230
|
+
return (profile.issuer === this.#config.issuer &&
|
|
231
|
+
profile.clientId === this.#config.clientId &&
|
|
232
|
+
profile.audience === this.#config.audience &&
|
|
233
|
+
profile.scopes.length === this.#config.scopes.length &&
|
|
234
|
+
profile.scopes.every((scope, index) => scope === this.#config.scopes[index]));
|
|
235
|
+
}
|
|
236
|
+
#requestOptions(signal) {
|
|
237
|
+
return {
|
|
238
|
+
maxResponseBytes: this.#config.maxResponseBytes,
|
|
239
|
+
requestTimeoutMs: this.#config.requestTimeoutMs,
|
|
240
|
+
...(signal === undefined ? {} : { signal }),
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
export async function discoverDeviceProvider(configuredIssuer, policy, fetchImplementation, options) {
|
|
245
|
+
const normalizedPolicy = normalizePolicy(policy);
|
|
246
|
+
const requestOptions = {
|
|
247
|
+
maxResponseBytes: positiveInteger(options.maxResponseBytes, 'maximum response size'),
|
|
248
|
+
requestTimeoutMs: positiveInteger(options.requestTimeoutMs, 'request timeout'),
|
|
249
|
+
...(options.signal === undefined ? {} : { signal: options.signal }),
|
|
250
|
+
};
|
|
251
|
+
const issuer = normalizeWebUrl(configuredIssuer, normalizedPolicy.allowLoopbackHttp, 'issuer');
|
|
252
|
+
const discoveryUrl = `${issuer}/.well-known/openid-configuration`;
|
|
253
|
+
let result;
|
|
254
|
+
try {
|
|
255
|
+
result = await requestJson(discoveryUrl, { headers: { Accept: 'application/json' } }, fetchImplementation, requestOptions, 'invalid_discovery_document', 'discovery_failed');
|
|
256
|
+
}
|
|
257
|
+
catch (error) {
|
|
258
|
+
if (error instanceof AuthNodeError)
|
|
259
|
+
throw error;
|
|
260
|
+
throw new AuthNodeError('discovery_failed');
|
|
261
|
+
}
|
|
262
|
+
if (!result.response.ok) {
|
|
263
|
+
throw new AuthNodeError('discovery_failed', {
|
|
264
|
+
retryable: result.response.status >= 500,
|
|
265
|
+
status: result.response.status,
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
const discoveredIssuer = normalizeWebUrl(requiredString(result.body, 'issuer', 'invalid_discovery_document'), normalizedPolicy.allowLoopbackHttp, 'issuer');
|
|
269
|
+
const allowedIssuers = new Set([issuer, ...normalizedPolicy.issuerAllowlist]);
|
|
270
|
+
if (!allowedIssuers.has(discoveredIssuer))
|
|
271
|
+
throw new AuthNodeError('issuer_mismatch');
|
|
272
|
+
const tokenEndpoint = validateDiscoveredEndpoint(requiredString(result.body, 'token_endpoint', 'invalid_discovery_document'), discoveredIssuer, normalizedPolicy);
|
|
273
|
+
const deviceAuthorizationEndpoint = validateDiscoveredEndpoint(requiredString(result.body, 'device_authorization_endpoint', 'invalid_discovery_document'), discoveredIssuer, normalizedPolicy);
|
|
274
|
+
return { issuer: discoveredIssuer, tokenEndpoint, deviceAuthorizationEndpoint };
|
|
275
|
+
}
|
|
276
|
+
/** Decodes a small allowlist of unverified JWT claims for display text only. */
|
|
277
|
+
export function decodeDisplayOnlyClaims(token) {
|
|
278
|
+
try {
|
|
279
|
+
const payload = token.split('.')[1];
|
|
280
|
+
if (payload === undefined || Buffer.byteLength(payload) > DISPLAY_CLAIMS_MAX_BYTES)
|
|
281
|
+
return undefined;
|
|
282
|
+
const decoded = Buffer.from(payload, 'base64url').toString('utf8');
|
|
283
|
+
if (Buffer.byteLength(decoded) > DISPLAY_CLAIMS_MAX_BYTES)
|
|
284
|
+
return undefined;
|
|
285
|
+
const value = JSON.parse(decoded);
|
|
286
|
+
if (!isRecord(value))
|
|
287
|
+
return undefined;
|
|
288
|
+
const subject = optionalString(value, 'sub');
|
|
289
|
+
const name = optionalString(value, 'name');
|
|
290
|
+
const preferredUsername = optionalString(value, 'preferred_username');
|
|
291
|
+
const email = optionalString(value, 'email');
|
|
292
|
+
const expiresAt = optionalPositiveInteger(value, 'exp', 'invalid_token_response');
|
|
293
|
+
return {
|
|
294
|
+
...(subject === undefined ? {} : { subject }),
|
|
295
|
+
...(name === undefined ? {} : { name }),
|
|
296
|
+
...(preferredUsername === undefined ? {} : { preferredUsername }),
|
|
297
|
+
...(email === undefined ? {} : { email }),
|
|
298
|
+
...(expiresAt === undefined ? {} : { expiresAt }),
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
catch {
|
|
302
|
+
return undefined;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
async function postForm(endpoint, fields, fetchImplementation, options, invalidResponseCode, requestFailureCode) {
|
|
306
|
+
return requestJson(endpoint, {
|
|
307
|
+
method: 'POST',
|
|
308
|
+
headers: {
|
|
309
|
+
Accept: 'application/json',
|
|
310
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
311
|
+
},
|
|
312
|
+
body: new URLSearchParams(fields),
|
|
313
|
+
}, fetchImplementation, options, invalidResponseCode, requestFailureCode);
|
|
314
|
+
}
|
|
315
|
+
async function requestJson(input, init, fetchImplementation, options, invalidResponseCode, requestFailureCode) {
|
|
316
|
+
const requestTimeout = timeoutSignal(options.signal, options.requestTimeoutMs);
|
|
317
|
+
try {
|
|
318
|
+
const response = await fetchImplementation(input, { ...init, signal: requestTimeout.signal });
|
|
319
|
+
const declaredLength = Number(response.headers.get('content-length'));
|
|
320
|
+
if (Number.isFinite(declaredLength) && declaredLength > options.maxResponseBytes) {
|
|
321
|
+
throw new AuthNodeError(invalidResponseCode);
|
|
322
|
+
}
|
|
323
|
+
let text = '';
|
|
324
|
+
if (response.body !== null) {
|
|
325
|
+
const reader = response.body.getReader();
|
|
326
|
+
const decoder = new TextDecoder();
|
|
327
|
+
let bytes = 0;
|
|
328
|
+
for (;;) {
|
|
329
|
+
const chunk = await reader.read();
|
|
330
|
+
if (chunk.done)
|
|
331
|
+
break;
|
|
332
|
+
bytes += chunk.value.byteLength;
|
|
333
|
+
if (bytes > options.maxResponseBytes) {
|
|
334
|
+
await reader.cancel().catch(() => undefined);
|
|
335
|
+
throw new AuthNodeError(invalidResponseCode);
|
|
336
|
+
}
|
|
337
|
+
text += decoder.decode(chunk.value, { stream: true });
|
|
338
|
+
}
|
|
339
|
+
text += decoder.decode();
|
|
340
|
+
}
|
|
341
|
+
let value;
|
|
342
|
+
try {
|
|
343
|
+
value = JSON.parse(text);
|
|
344
|
+
}
|
|
345
|
+
catch {
|
|
346
|
+
throw new AuthNodeError(invalidResponseCode);
|
|
347
|
+
}
|
|
348
|
+
if (!isRecord(value))
|
|
349
|
+
throw new AuthNodeError(invalidResponseCode);
|
|
350
|
+
return { response, body: value };
|
|
351
|
+
}
|
|
352
|
+
catch (error) {
|
|
353
|
+
const mapped = mapAbort(error, options.signal, requestTimeout.didTimeout());
|
|
354
|
+
if (mapped instanceof AuthNodeError)
|
|
355
|
+
throw mapped;
|
|
356
|
+
throw new AuthNodeError(requestFailureCode, { retryable: true });
|
|
357
|
+
}
|
|
358
|
+
finally {
|
|
359
|
+
requestTimeout.dispose();
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
function parseTokenResponse(body) {
|
|
363
|
+
const refreshToken = optionalString(body, 'refresh_token');
|
|
364
|
+
const idToken = optionalString(body, 'id_token');
|
|
365
|
+
return {
|
|
366
|
+
accessToken: requiredString(body, 'access_token', 'invalid_token_response'),
|
|
367
|
+
...(refreshToken === undefined ? {} : { refreshToken }),
|
|
368
|
+
...(idToken === undefined ? {} : { idToken }),
|
|
369
|
+
tokenType: optionalString(body, 'token_type') ?? 'Bearer',
|
|
370
|
+
expiresIn: requiredPositiveInteger(body, 'expires_in', 'invalid_token_response'),
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
function normalizeConfig(config) {
|
|
374
|
+
const policy = normalizePolicy(config.endpointPolicy ?? {});
|
|
375
|
+
const issuer = normalizeWebUrl(config.issuer, policy.allowLoopbackHttp, 'issuer');
|
|
376
|
+
const clientId = requiredText(config.clientId, 'OIDC client ID');
|
|
377
|
+
const scopes = normalizeScopes(config.scopes);
|
|
378
|
+
return {
|
|
379
|
+
issuer,
|
|
380
|
+
clientId,
|
|
381
|
+
scopes,
|
|
382
|
+
...(config.audience === undefined
|
|
383
|
+
? {}
|
|
384
|
+
: { audience: requiredText(config.audience, 'audience') }),
|
|
385
|
+
profile: config.profile ?? 'default',
|
|
386
|
+
endpointPolicy: policy,
|
|
387
|
+
maxResponseBytes: positiveInteger(config.maxResponseBytes ?? DEFAULT_MAX_RESPONSE_BYTES, 'maximum response size'),
|
|
388
|
+
requestTimeoutMs: positiveInteger(config.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS, 'request timeout'),
|
|
389
|
+
loginTimeoutMs: positiveInteger(config.loginTimeoutMs ?? DEFAULT_LOGIN_TIMEOUT_MS, 'login timeout'),
|
|
390
|
+
refreshLeewayMs: nonNegativeInteger(config.refreshLeewaySeconds ?? DEFAULT_REFRESH_LEEWAY_SECONDS, 'refresh leeway') * 1000,
|
|
391
|
+
};
|
|
392
|
+
}
|
|
393
|
+
function normalizePolicy(policy) {
|
|
394
|
+
const allowLoopbackHttp = policy.allowLoopbackHttp ?? false;
|
|
395
|
+
return {
|
|
396
|
+
allowLoopbackHttp,
|
|
397
|
+
issuerAllowlist: (policy.issuerAllowlist ?? []).map((issuer) => normalizeWebUrl(issuer, allowLoopbackHttp, 'issuer')),
|
|
398
|
+
endpointOriginAllowlist: (policy.endpointOriginAllowlist ?? []).map((origin) => {
|
|
399
|
+
const url = parseUrl(origin, 'config');
|
|
400
|
+
if (url.origin !== url.toString().replace(/\/$/u, '') || url.username || url.password) {
|
|
401
|
+
throw new TypeError('endpoint origin allowlist entries must contain only an origin.');
|
|
402
|
+
}
|
|
403
|
+
validateWebUrl(url.toString(), allowLoopbackHttp);
|
|
404
|
+
return url.origin;
|
|
405
|
+
}),
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
function validateDiscoveredEndpoint(value, issuer, policy) {
|
|
409
|
+
const endpoint = parseUrl(value, 'provider');
|
|
410
|
+
validateWebUrl(endpoint.toString(), policy.allowLoopbackHttp);
|
|
411
|
+
if (endpoint.username || endpoint.password || endpoint.hash) {
|
|
412
|
+
throw new AuthNodeError('endpoint_policy_violation');
|
|
413
|
+
}
|
|
414
|
+
const issuerUrl = parseUrl(issuer, 'provider');
|
|
415
|
+
const originAllowed = endpoint.origin === issuerUrl.origin ||
|
|
416
|
+
policy.endpointOriginAllowlist.includes(endpoint.origin);
|
|
417
|
+
if (!originAllowed)
|
|
418
|
+
throw new AuthNodeError('endpoint_policy_violation');
|
|
419
|
+
if (endpoint.origin === issuerUrl.origin) {
|
|
420
|
+
const issuerPath = issuerUrl.pathname.replace(/\/$/u, '');
|
|
421
|
+
const relatedPath = issuerPath.length === 0 ||
|
|
422
|
+
endpoint.pathname === issuerPath ||
|
|
423
|
+
endpoint.pathname.startsWith(`${issuerPath}/`);
|
|
424
|
+
if (!relatedPath)
|
|
425
|
+
throw new AuthNodeError('endpoint_policy_violation');
|
|
426
|
+
}
|
|
427
|
+
return endpoint.toString();
|
|
428
|
+
}
|
|
429
|
+
function normalizeWebUrl(value, allowLoopbackHttp, label) {
|
|
430
|
+
const url = parseUrl(requiredText(value, `OIDC ${label}`), 'config');
|
|
431
|
+
if (url.search || url.hash || url.username || url.password) {
|
|
432
|
+
throw new TypeError(`OIDC ${label} must not contain credentials, a query, or a fragment.`);
|
|
433
|
+
}
|
|
434
|
+
validateWebUrl(url.toString(), allowLoopbackHttp);
|
|
435
|
+
return url.toString().replace(/\/+$/u, '');
|
|
436
|
+
}
|
|
437
|
+
function validateWebUrl(value, allowLoopbackHttp) {
|
|
438
|
+
const url = parseUrl(value, 'provider');
|
|
439
|
+
if (url.protocol === 'https:')
|
|
440
|
+
return;
|
|
441
|
+
if (url.protocol === 'http:' && allowLoopbackHttp && isLoopback(url.hostname))
|
|
442
|
+
return;
|
|
443
|
+
throw new AuthNodeError('endpoint_policy_violation');
|
|
444
|
+
}
|
|
445
|
+
function parseUrl(value, source) {
|
|
446
|
+
try {
|
|
447
|
+
return new URL(value);
|
|
448
|
+
}
|
|
449
|
+
catch {
|
|
450
|
+
if (source === 'config')
|
|
451
|
+
throw new TypeError('OIDC URL is invalid.');
|
|
452
|
+
throw new AuthNodeError('endpoint_policy_violation');
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
function isLoopback(hostname) {
|
|
456
|
+
const host = hostname.replace(/^\[|\]$/gu, '').toLowerCase();
|
|
457
|
+
return host === 'localhost' || host === '::1' || /^127(?:\.\d{1,3}){3}$/u.test(host);
|
|
458
|
+
}
|
|
459
|
+
function normalizeScopes(scopes) {
|
|
460
|
+
const values = scopes ?? DEFAULT_SCOPES;
|
|
461
|
+
const normalized = values.map((scope) => requiredText(scope, 'OIDC scope'));
|
|
462
|
+
if (!normalized.includes('openid'))
|
|
463
|
+
normalized.unshift('openid');
|
|
464
|
+
return [...new Set(normalized)];
|
|
465
|
+
}
|
|
466
|
+
function requiredString(value, key, code) {
|
|
467
|
+
const result = optionalString(value, key);
|
|
468
|
+
if (result === undefined)
|
|
469
|
+
throw new AuthNodeError(code);
|
|
470
|
+
return result;
|
|
471
|
+
}
|
|
472
|
+
function optionalString(value, key) {
|
|
473
|
+
const result = value[key];
|
|
474
|
+
return typeof result === 'string' && result.length > 0 ? result : undefined;
|
|
475
|
+
}
|
|
476
|
+
function requiredPositiveInteger(value, key, code) {
|
|
477
|
+
const result = optionalPositiveInteger(value, key, code);
|
|
478
|
+
if (result === undefined)
|
|
479
|
+
throw new AuthNodeError(code);
|
|
480
|
+
return result;
|
|
481
|
+
}
|
|
482
|
+
function optionalPositiveInteger(value, key, code) {
|
|
483
|
+
const result = value[key];
|
|
484
|
+
if (result === undefined)
|
|
485
|
+
return undefined;
|
|
486
|
+
if (!Number.isSafeInteger(result) || result <= 0)
|
|
487
|
+
throw new AuthNodeError(code);
|
|
488
|
+
return result;
|
|
489
|
+
}
|
|
490
|
+
function requiredText(value, label) {
|
|
491
|
+
const trimmed = value.trim();
|
|
492
|
+
if (trimmed.length === 0)
|
|
493
|
+
throw new TypeError(`${label} must not be empty.`);
|
|
494
|
+
return trimmed;
|
|
495
|
+
}
|
|
496
|
+
function positiveInteger(value, label) {
|
|
497
|
+
if (!Number.isSafeInteger(value) || value <= 0)
|
|
498
|
+
throw new RangeError(`${label} must be positive.`);
|
|
499
|
+
return value;
|
|
500
|
+
}
|
|
501
|
+
function nonNegativeInteger(value, label) {
|
|
502
|
+
if (!Number.isSafeInteger(value) || value < 0) {
|
|
503
|
+
throw new RangeError(`${label} must be a non-negative integer.`);
|
|
504
|
+
}
|
|
505
|
+
return value;
|
|
506
|
+
}
|
|
507
|
+
function isRecord(value) {
|
|
508
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
509
|
+
}
|
|
510
|
+
function throwIfAborted(signal) {
|
|
511
|
+
if (signal?.aborted === true)
|
|
512
|
+
throw new AuthNodeError('aborted');
|
|
513
|
+
}
|
|
514
|
+
function mapAbort(error, parentSignal, timedOut) {
|
|
515
|
+
if (parentSignal?.aborted === true)
|
|
516
|
+
return new AuthNodeError('aborted');
|
|
517
|
+
if (timedOut)
|
|
518
|
+
return new AuthNodeError('login_timeout', { retryable: true });
|
|
519
|
+
return error;
|
|
520
|
+
}
|
|
521
|
+
function combineSignals(first, second) {
|
|
522
|
+
if (first === undefined)
|
|
523
|
+
return second;
|
|
524
|
+
if (second === undefined)
|
|
525
|
+
return first;
|
|
526
|
+
return AbortSignal.any([first, second]);
|
|
527
|
+
}
|
|
528
|
+
function timeoutSignal(parent, milliseconds) {
|
|
529
|
+
const controller = new AbortController();
|
|
530
|
+
let timedOut = false;
|
|
531
|
+
const timeout = setTimeout(() => {
|
|
532
|
+
timedOut = true;
|
|
533
|
+
controller.abort();
|
|
534
|
+
}, milliseconds);
|
|
535
|
+
const abortFromParent = () => {
|
|
536
|
+
controller.abort();
|
|
537
|
+
};
|
|
538
|
+
parent?.addEventListener('abort', abortFromParent, { once: true });
|
|
539
|
+
if (parent?.aborted === true)
|
|
540
|
+
controller.abort();
|
|
541
|
+
return {
|
|
542
|
+
signal: controller.signal,
|
|
543
|
+
didTimeout: () => timedOut,
|
|
544
|
+
dispose: () => {
|
|
545
|
+
clearTimeout(timeout);
|
|
546
|
+
parent?.removeEventListener('abort', abortFromParent);
|
|
547
|
+
},
|
|
548
|
+
};
|
|
549
|
+
}
|
|
550
|
+
function abortableDelay(milliseconds, signal) {
|
|
551
|
+
return new Promise((resolveDelay, reject) => {
|
|
552
|
+
if (signal?.aborted === true) {
|
|
553
|
+
reject(new AuthNodeError('aborted'));
|
|
554
|
+
return;
|
|
555
|
+
}
|
|
556
|
+
const onAbort = () => {
|
|
557
|
+
clearTimeout(timeout);
|
|
558
|
+
reject(new AuthNodeError('aborted'));
|
|
559
|
+
};
|
|
560
|
+
const timeout = setTimeout(() => {
|
|
561
|
+
signal?.removeEventListener('abort', onAbort);
|
|
562
|
+
resolveDelay();
|
|
563
|
+
}, milliseconds);
|
|
564
|
+
signal?.addEventListener('abort', onAbort, { once: true });
|
|
565
|
+
});
|
|
566
|
+
}
|
|
567
|
+
//# sourceMappingURL=device-flow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device-flow.js","sourceRoot":"","sources":["../src/device-flow.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type AuthNodeErrorCode = 'aborted' | 'cache_corrupt' | 'cache_lock_timeout' | 'cache_permission' | 'cache_read_failed' | 'cache_symlink' | 'cache_write_failed' | 'device_authorization_denied' | 'device_authorization_expired' | 'device_authorization_failed' | 'discovery_failed' | 'endpoint_policy_violation' | 'invalid_device_response' | 'invalid_discovery_document' | 'invalid_token_response' | 'issuer_mismatch' | 'login_timeout' | 'no_cached_session' | 'refresh_failed';
|
|
2
|
+
/** An authentication failure whose message never includes tokens or provider response bodies. */
|
|
3
|
+
export declare class AuthNodeError extends Error {
|
|
4
|
+
readonly code: AuthNodeErrorCode;
|
|
5
|
+
readonly retryable: boolean;
|
|
6
|
+
readonly status: number | undefined;
|
|
7
|
+
constructor(code: AuthNodeErrorCode, options?: {
|
|
8
|
+
readonly retryable?: boolean;
|
|
9
|
+
readonly status?: number;
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
export declare function safeAuthNodeErrorMessage(cause: unknown): string;
|
|
13
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GACzB,SAAS,GACT,eAAe,GACf,oBAAoB,GACpB,kBAAkB,GAClB,mBAAmB,GACnB,eAAe,GACf,oBAAoB,GACpB,6BAA6B,GAC7B,8BAA8B,GAC9B,6BAA6B,GAC7B,kBAAkB,GAClB,2BAA2B,GAC3B,yBAAyB,GACzB,4BAA4B,GAC5B,wBAAwB,GACxB,iBAAiB,GACjB,eAAe,GACf,mBAAmB,GACnB,gBAAgB,CAAC;AAwBrB,iGAAiG;AACjG,qBAAa,aAAc,SAAQ,KAAK;IACtC,SAAgB,IAAI,EAAE,iBAAiB,CAAC;IACxC,SAAgB,SAAS,EAAE,OAAO,CAAC;IACnC,SAAgB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;gBAGzC,IAAI,EAAE,iBAAiB,EACvB,OAAO,GAAE;QAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAO;CAQ3E;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAE/D"}
|