@broberg/sso 0.19.1 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunk2F3RPYJV_cjs = require('./chunk-2F3RPYJV.cjs');
3
+ var chunkKEBSZBHL_cjs = require('./chunk-KEBSZBHL.cjs');
4
4
  var fs = require('fs');
5
5
  var http = require('http');
6
6
  var jose = require('jose');
@@ -48,37 +48,37 @@ async function verifyDpopProof(proof, o) {
48
48
  try {
49
49
  header = jose.decodeProtectedHeader(proof);
50
50
  } catch {
51
- throw new chunk2F3RPYJV_cjs.SsoError("DPoP proof is not a JWS");
51
+ throw new chunkKEBSZBHL_cjs.SsoError("DPoP proof is not a JWS");
52
52
  }
53
- if (header.typ !== "dpop+jwt") throw new chunk2F3RPYJV_cjs.SsoError(`DPoP proof has typ ${JSON.stringify(header.typ)}, not "dpop+jwt"`);
54
- if (!header.alg || !ASYMMETRIC.has(header.alg)) throw new chunk2F3RPYJV_cjs.SsoError(`DPoP proof alg ${JSON.stringify(header.alg)} is not an accepted asymmetric algorithm`);
53
+ if (header.typ !== "dpop+jwt") throw new chunkKEBSZBHL_cjs.SsoError(`DPoP proof has typ ${JSON.stringify(header.typ)}, not "dpop+jwt"`);
54
+ if (!header.alg || !ASYMMETRIC.has(header.alg)) throw new chunkKEBSZBHL_cjs.SsoError(`DPoP proof alg ${JSON.stringify(header.alg)} is not an accepted asymmetric algorithm`);
55
55
  const jwk = header.jwk;
56
- if (!jwk || typeof jwk !== "object") throw new chunk2F3RPYJV_cjs.SsoError("DPoP proof carries no jwk");
57
- if ("d" in jwk) throw new chunk2F3RPYJV_cjs.SsoError("DPoP proof jwk contains a private key");
56
+ if (!jwk || typeof jwk !== "object") throw new chunkKEBSZBHL_cjs.SsoError("DPoP proof carries no jwk");
57
+ if ("d" in jwk) throw new chunkKEBSZBHL_cjs.SsoError("DPoP proof jwk contains a private key");
58
58
  let payload;
59
59
  try {
60
60
  const key = await jose.importJWK(jwk, header.alg);
61
61
  ({ payload } = await jose.jwtVerify(proof, key, { typ: "dpop+jwt", algorithms: [header.alg] }));
62
62
  } catch (e) {
63
- throw new chunk2F3RPYJV_cjs.SsoError(`DPoP proof signature rejected: ${e instanceof Error ? e.message : String(e)}`);
63
+ throw new chunkKEBSZBHL_cjs.SsoError(`DPoP proof signature rejected: ${e instanceof Error ? e.message : String(e)}`);
64
64
  }
65
- if (await jose.calculateJwkThumbprint(jwk) !== o.jkt) throw new chunk2F3RPYJV_cjs.SsoError("DPoP proof key does not match the ticket's cnf.jkt");
66
- if (payload.htm !== o.method.toUpperCase()) throw new chunk2F3RPYJV_cjs.SsoError(`DPoP proof is for ${JSON.stringify(payload.htm)}, the request is ${o.method.toUpperCase()}`);
65
+ if (await jose.calculateJwkThumbprint(jwk) !== o.jkt) throw new chunkKEBSZBHL_cjs.SsoError("DPoP proof key does not match the ticket's cnf.jkt");
66
+ if (payload.htm !== o.method.toUpperCase()) throw new chunkKEBSZBHL_cjs.SsoError(`DPoP proof is for ${JSON.stringify(payload.htm)}, the request is ${o.method.toUpperCase()}`);
67
67
  let htu;
68
68
  try {
69
69
  htu = normalizeHtu(String(payload.htu));
70
70
  } catch {
71
- throw new chunk2F3RPYJV_cjs.SsoError("DPoP proof htu is not a URL");
71
+ throw new chunkKEBSZBHL_cjs.SsoError("DPoP proof htu is not a URL");
72
72
  }
73
- if (htu !== normalizeHtu(o.url)) throw new chunk2F3RPYJV_cjs.SsoError(`DPoP proof is for ${htu}, the request is ${normalizeHtu(o.url)}`);
73
+ if (htu !== normalizeHtu(o.url)) throw new chunkKEBSZBHL_cjs.SsoError(`DPoP proof is for ${htu}, the request is ${normalizeHtu(o.url)}`);
74
74
  const nowSec = Math.floor(o.now() / 1e3);
75
75
  if (typeof payload.iat !== "number" || Math.abs(nowSec - payload.iat) > o.iatWindowSec) {
76
- throw new chunk2F3RPYJV_cjs.SsoError(`DPoP proof iat is outside \xB1${o.iatWindowSec}s`);
76
+ throw new chunkKEBSZBHL_cjs.SsoError(`DPoP proof iat is outside \xB1${o.iatWindowSec}s`);
77
77
  }
78
- if (payload.ath !== await accessTokenHash(o.ticket)) throw new chunk2F3RPYJV_cjs.SsoError("DPoP proof ath does not match this ticket");
79
- if (typeof payload.jti !== "string" || payload.jti === "") throw new chunk2F3RPYJV_cjs.SsoError("DPoP proof has no jti");
78
+ if (payload.ath !== await accessTokenHash(o.ticket)) throw new chunkKEBSZBHL_cjs.SsoError("DPoP proof ath does not match this ticket");
79
+ if (typeof payload.jti !== "string" || payload.jti === "") throw new chunkKEBSZBHL_cjs.SsoError("DPoP proof has no jti");
80
80
  if (await o.replay.seen(`${o.jkt}:${payload.jti}`, o.iatWindowSec * 2 * 1e3)) {
81
- throw new chunk2F3RPYJV_cjs.SsoError("DPoP proof was already used (jti replay)");
81
+ throw new chunkKEBSZBHL_cjs.SsoError("DPoP proof was already used (jti replay)");
82
82
  }
83
83
  }
84
84
 
@@ -134,6 +134,22 @@ function jwtExp(token) {
134
134
  return null;
135
135
  }
136
136
  }
137
+ async function readTicketResponse(res, issuer, target, now) {
138
+ let body = {};
139
+ try {
140
+ body = await res.json();
141
+ } catch {
142
+ }
143
+ if (res.status >= 500) throw new TicketUnavailableError(`${issuer} answered ${res.status}`);
144
+ if (!res.ok || !body.access_token) {
145
+ const desc = body.error_description ?? "";
146
+ const code = desc.includes(":") ? desc.slice(0, desc.indexOf(":")).trim() : body.error ?? "exchange_refused";
147
+ throw new TicketExchangeError(`BID refused the ticket for ${target}: ${desc || body.error || res.status}`, code, res.status);
148
+ }
149
+ const nowSec = Math.floor(now() / 1e3);
150
+ const exp = jwtExp(body.access_token) ?? nowSec + (body.expires_in ?? 300);
151
+ return { token: body.access_token, exp };
152
+ }
137
153
  function createTicketClient(options = {}) {
138
154
  const issuer = (options.issuer ?? DEFAULT_ISSUER).replace(/\/+$/, "");
139
155
  const renewBeforeSec = options.renewBeforeSec ?? 30;
@@ -184,20 +200,7 @@ function createTicketClient(options = {}) {
184
200
  } catch (e) {
185
201
  throw new TicketUnavailableError(`${issuer} unreachable: ${e instanceof Error ? e.message : String(e)}`);
186
202
  }
187
- let body = {};
188
- try {
189
- body = await res.json();
190
- } catch {
191
- }
192
- if (res.status >= 500) throw new TicketUnavailableError(`${issuer} answered ${res.status}`);
193
- if (!res.ok || !body.access_token) {
194
- const desc = body.error_description ?? "";
195
- const code = desc.includes(":") ? desc.slice(0, desc.indexOf(":")).trim() : body.error ?? "exchange_refused";
196
- throw new TicketExchangeError(`BID refused the ticket for ${audience}: ${desc || body.error || res.status}`, code, res.status);
197
- }
198
- const nowSec = Math.floor(now() / 1e3);
199
- const exp = jwtExp(body.access_token) ?? nowSec + (body.expires_in ?? 300);
200
- return { token: body.access_token, exp };
203
+ return readTicketResponse(res, issuer, audience, now);
201
204
  }
202
205
  const client = {
203
206
  async authHeaders({ audience, scope, method, url }) {
@@ -226,6 +229,36 @@ function fetchTicket(opts) {
226
229
  shared ??= createTicketClient();
227
230
  return shared.get(opts);
228
231
  }
232
+ async function exchangeUserToken(opts) {
233
+ const issuer = (opts.issuer ?? DEFAULT_ISSUER).replace(/\/+$/, "");
234
+ const target = opts.resource ?? opts.audience;
235
+ if (!target) throw new TicketExchangeError("exchangeUserToken needs a receiver: resource (its URL) or audience (BID's name for it)", "malformed_request", 0);
236
+ const fetchImpl = opts.fetchImpl ?? fetch;
237
+ const now = opts.now ?? (() => Date.now());
238
+ const form = new URLSearchParams({
239
+ grant_type: "urn:ietf:params:oauth:grant-type:token-exchange",
240
+ subject_token: opts.subjectToken,
241
+ subject_token_type: "urn:ietf:params:oauth:token-type:access_token"
242
+ });
243
+ if (opts.resource) form.set("resource", opts.resource);
244
+ if (opts.audience) form.set("audience", opts.audience);
245
+ if (opts.scope) form.set("scope", opts.scope);
246
+ const tokenUrl = `${issuer}/oauth2/token`;
247
+ const headers = { "content-type": "application/x-www-form-urlencoded" };
248
+ if (opts.clientSecret) {
249
+ headers.authorization = `Basic ${btoa(`${encodeURIComponent(opts.clientId)}:${encodeURIComponent(opts.clientSecret)}`)}`;
250
+ } else {
251
+ form.set("client_id", opts.clientId);
252
+ }
253
+ if (opts.dpopKey) headers.dpop = await createDpopProof(opts.dpopKey, { method: "POST", url: tokenUrl, now });
254
+ let res;
255
+ try {
256
+ res = await fetchImpl(tokenUrl, { method: "POST", headers, body: form });
257
+ } catch (e) {
258
+ throw new TicketUnavailableError(`${issuer} unreachable: ${e instanceof Error ? e.message : String(e)}`);
259
+ }
260
+ return readTicketResponse(res, issuer, target, now);
261
+ }
229
262
  var PRINCIPAL_TYPES = ["human", "service", "agent", "user"];
230
263
  var TICKET_FORMAT_VERSION = 1;
231
264
  var MAX_ACT_DEPTH = 5;
@@ -241,10 +274,10 @@ function createTicketVerifier(options) {
241
274
  now = () => Date.now()
242
275
  } = options;
243
276
  const replayStore = options.replayStore ?? createMemoryReplayStore(now);
244
- if (!issuer) throw new chunk2F3RPYJV_cjs.SsoError("createTicketVerifier needs an issuer");
245
- if (!audience) throw new chunk2F3RPYJV_cjs.SsoError("createTicketVerifier needs this receiver's audience");
277
+ if (!issuer) throw new chunkKEBSZBHL_cjs.SsoError("createTicketVerifier needs an issuer");
278
+ if (!audience) throw new chunkKEBSZBHL_cjs.SsoError("createTicketVerifier needs this receiver's audience");
246
279
  let cachePromise = null;
247
- const cacheFor = (jwksUri) => chunk2F3RPYJV_cjs.createJwksCache({
280
+ const cacheFor = (jwksUri) => chunkKEBSZBHL_cjs.createJwksCache({
248
281
  jwksUri,
249
282
  fetchImpl,
250
283
  ...options.warmUp ? { warmUp: true } : {},
@@ -260,12 +293,12 @@ function createTicketVerifier(options) {
260
293
  if (!res.ok) throw new Error(`answered ${res.status}`);
261
294
  doc = await res.json();
262
295
  } catch (cause) {
263
- throw new chunk2F3RPYJV_cjs.JwksUnavailableError(`${url}: ${cause instanceof Error ? cause.message : String(cause)}`);
296
+ throw new chunkKEBSZBHL_cjs.JwksUnavailableError(`${url}: ${cause instanceof Error ? cause.message : String(cause)}`);
264
297
  }
265
298
  if (doc.issuer !== issuer) {
266
- throw new chunk2F3RPYJV_cjs.SsoError(`issuer is ${issuer} but ${url} says ${doc.issuer} \u2014 they must match exactly`);
299
+ throw new chunkKEBSZBHL_cjs.SsoError(`issuer is ${issuer} but ${url} says ${doc.issuer} \u2014 they must match exactly`);
267
300
  }
268
- if (!doc.jwks_uri) throw new chunk2F3RPYJV_cjs.SsoError(`${url} names no jwks_uri`);
301
+ if (!doc.jwks_uri) throw new chunkKEBSZBHL_cjs.SsoError(`${url} names no jwks_uri`);
269
302
  return cacheFor(doc.jwks_uri);
270
303
  })().catch((err) => {
271
304
  cachePromise = null;
@@ -281,51 +314,51 @@ function createTicketVerifier(options) {
281
314
  try {
282
315
  header = jose.decodeProtectedHeader(token);
283
316
  } catch {
284
- throw new chunk2F3RPYJV_cjs.SsoError("ticket is not a JWS");
317
+ throw new chunkKEBSZBHL_cjs.SsoError("ticket is not a JWS");
285
318
  }
286
- if (!header.kid) throw new chunk2F3RPYJV_cjs.SsoError("ticket has no kid \u2014 cannot pick a signing key");
287
- if (header.typ === "logout+jwt") throw new chunk2F3RPYJV_cjs.SsoError("a logout token is not a ticket");
319
+ if (!header.kid) throw new chunkKEBSZBHL_cjs.SsoError("ticket has no kid \u2014 cannot pick a signing key");
320
+ if (header.typ === "logout+jwt") throw new chunkKEBSZBHL_cjs.SsoError("a logout token is not a ticket");
288
321
  const cache = await keys();
289
322
  let payload;
290
323
  try {
291
324
  ({ payload } = await jose.jwtVerify(token, async () => cache.getKey(header.kid, header.alg ?? "EdDSA"), {
292
325
  issuer,
293
326
  audience,
294
- algorithms: chunk2F3RPYJV_cjs.ALLOWED_ALGS,
327
+ algorithms: chunkKEBSZBHL_cjs.ALLOWED_ALGS,
295
328
  clockTolerance: clockToleranceSec,
296
329
  requiredClaims: ["exp", "iat", "jti", "sub"]
297
330
  }));
298
331
  } catch (e) {
299
- if (e instanceof chunk2F3RPYJV_cjs.JwksUnavailableError) throw e;
300
- throw new chunk2F3RPYJV_cjs.SsoError(`ticket rejected: ${e instanceof Error ? e.message : String(e)}`);
332
+ if (e instanceof chunkKEBSZBHL_cjs.JwksUnavailableError) throw e;
333
+ throw new chunkKEBSZBHL_cjs.SsoError(`ticket rejected: ${e instanceof Error ? e.message : String(e)}`);
301
334
  }
302
- if ("events" in payload) throw new chunk2F3RPYJV_cjs.SsoError("a logout token is not a ticket");
303
- if ("nonce" in payload) throw new chunk2F3RPYJV_cjs.SsoError("an ID token is not a ticket");
335
+ if ("events" in payload) throw new chunkKEBSZBHL_cjs.SsoError("a logout token is not a ticket");
336
+ if ("nonce" in payload) throw new chunkKEBSZBHL_cjs.SsoError("an ID token is not a ticket");
304
337
  const type = payload.principal_type;
305
338
  if (typeof type !== "string" || !PRINCIPAL_TYPES.includes(type)) {
306
- throw new chunk2F3RPYJV_cjs.SsoError(`ticket has no valid principal_type (got ${JSON.stringify(type)})`);
339
+ throw new chunkKEBSZBHL_cjs.SsoError(`ticket has no valid principal_type (got ${JSON.stringify(type)})`);
307
340
  }
308
341
  const lifetime = payload.exp - payload.iat;
309
342
  if (lifetime > maxLifetimeSec) {
310
- throw new chunk2F3RPYJV_cjs.SsoError(`ticket claims a ${lifetime}s lifetime; at most ${maxLifetimeSec}s is accepted`);
343
+ throw new chunkKEBSZBHL_cjs.SsoError(`ticket claims a ${lifetime}s lifetime; at most ${maxLifetimeSec}s is accepted`);
311
344
  }
312
- if (typeof payload.sub !== "string" || payload.sub === "") throw new chunk2F3RPYJV_cjs.SsoError("ticket has no sub");
345
+ if (typeof payload.sub !== "string" || payload.sub === "") throw new chunkKEBSZBHL_cjs.SsoError("ticket has no sub");
313
346
  const scopes = typeof payload.scope === "string" ? payload.scope.split(" ").filter(Boolean) : [];
314
347
  const required = opts.scope === void 0 ? [] : Array.isArray(opts.scope) ? opts.scope : [opts.scope];
315
348
  const missing = required.filter((s) => !scopes.includes(s));
316
- if (missing.length) throw new chunk2F3RPYJV_cjs.SsoError(`ticket lacks scope ${missing.join(", ")}`);
349
+ if (missing.length) throw new chunkKEBSZBHL_cjs.SsoError(`ticket lacks scope ${missing.join(", ")}`);
317
350
  const ver = payload.ver === void 0 ? 0 : payload.ver;
318
351
  if (typeof ver !== "number" || !Number.isInteger(ver) || ver < 0) {
319
- throw new chunk2F3RPYJV_cjs.SsoError(`ticket has an invalid ver (got ${JSON.stringify(payload.ver)})`);
352
+ throw new chunkKEBSZBHL_cjs.SsoError(`ticket has an invalid ver (got ${JSON.stringify(payload.ver)})`);
320
353
  }
321
354
  if (ver > TICKET_FORMAT_VERSION) {
322
- throw new chunk2F3RPYJV_cjs.SsoError(`ticket format version ${ver} is newer than this @broberg/sso understands (${TICKET_FORMAT_VERSION}) \u2014 upgrade @broberg/sso`);
355
+ throw new chunkKEBSZBHL_cjs.SsoError(`ticket format version ${ver} is newer than this @broberg/sso understands (${TICKET_FORMAT_VERSION}) \u2014 upgrade @broberg/sso`);
323
356
  }
324
357
  const act = payload.act === void 0 ? null : readActor(payload.act, 1);
325
358
  const cnfRaw = payload.cnf;
326
359
  const cnf = cnfRaw && typeof cnfRaw.jkt === "string" && cnfRaw.jkt ? { jkt: cnfRaw.jkt } : null;
327
360
  if (cnf) {
328
- if (!opts.dpop?.proof) throw new chunk2F3RPYJV_cjs.SsoError("ticket is DPoP-bound (cnf.jkt) but no DPoP proof was presented");
361
+ if (!opts.dpop?.proof) throw new chunkKEBSZBHL_cjs.SsoError("ticket is DPoP-bound (cnf.jkt) but no DPoP proof was presented");
329
362
  await verifyDpopProof(opts.dpop.proof, {
330
363
  method: opts.dpop.method,
331
364
  url: opts.dpop.url,
@@ -336,11 +369,11 @@ function createTicketVerifier(options) {
336
369
  now
337
370
  });
338
371
  } else if (requireDpop) {
339
- throw new chunk2F3RPYJV_cjs.SsoError(cnfRaw !== void 0 ? "ticket has a cnf without a string jkt \u2014 DPoP is required here" : "this receiver requires DPoP; the ticket is not bound (no cnf.jkt)");
372
+ throw new chunkKEBSZBHL_cjs.SsoError(cnfRaw !== void 0 ? "ticket has a cnf without a string jkt \u2014 DPoP is required here" : "this receiver requires DPoP; the ticket is not bound (no cnf.jkt)");
340
373
  }
341
374
  const named = (v) => typeof v === "string" && v ? v : null;
342
375
  const clientId = type === "user" ? named(payload.client_id) ?? named(payload.azp) : named(payload.client_id) ?? payload.sub;
343
- if (clientId === null) throw new chunk2F3RPYJV_cjs.SsoError("a user ticket names no app (no client_id or azp)");
376
+ if (clientId === null) throw new chunkKEBSZBHL_cjs.SsoError("a user ticket names no app (no client_id or azp)");
344
377
  return {
345
378
  principal: payload.sub,
346
379
  type,
@@ -357,125 +390,125 @@ function createTicketVerifier(options) {
357
390
  };
358
391
  }
359
392
  function readActor(raw, depth) {
360
- if (depth > MAX_ACT_DEPTH) throw new chunk2F3RPYJV_cjs.SsoError(`ticket's delegation chain is deeper than ${MAX_ACT_DEPTH}`);
393
+ if (depth > MAX_ACT_DEPTH) throw new chunkKEBSZBHL_cjs.SsoError(`ticket's delegation chain is deeper than ${MAX_ACT_DEPTH}`);
361
394
  const link = raw;
362
395
  if (!link || typeof link !== "object" || typeof link.sub !== "string" || link.sub === "") {
363
- throw new chunk2F3RPYJV_cjs.SsoError(`ticket's act (link ${depth}) has no string sub`);
396
+ throw new chunkKEBSZBHL_cjs.SsoError(`ticket's act (link ${depth}) has no string sub`);
364
397
  }
365
398
  return link.act === void 0 ? { sub: link.sub } : { sub: link.sub, act: readActor(link.act, depth + 1) };
366
399
  }
367
400
 
368
401
  Object.defineProperty(exports, "AVATAR_TYPES", {
369
402
  enumerable: true,
370
- get: function () { return chunk2F3RPYJV_cjs.AVATAR_TYPES; }
403
+ get: function () { return chunkKEBSZBHL_cjs.AVATAR_TYPES; }
371
404
  });
372
405
  Object.defineProperty(exports, "DEFAULT_SESSION_MAX_AGE", {
373
406
  enumerable: true,
374
- get: function () { return chunk2F3RPYJV_cjs.DEFAULT_SESSION_MAX_AGE; }
407
+ get: function () { return chunkKEBSZBHL_cjs.DEFAULT_SESSION_MAX_AGE; }
375
408
  });
376
409
  Object.defineProperty(exports, "EMBEDDED_FLOW_MAX_AGE", {
377
410
  enumerable: true,
378
- get: function () { return chunk2F3RPYJV_cjs.EMBEDDED_FLOW_MAX_AGE; }
411
+ get: function () { return chunkKEBSZBHL_cjs.EMBEDDED_FLOW_MAX_AGE; }
379
412
  });
380
413
  Object.defineProperty(exports, "JwksError", {
381
414
  enumerable: true,
382
- get: function () { return chunk2F3RPYJV_cjs.JwksError; }
415
+ get: function () { return chunkKEBSZBHL_cjs.JwksError; }
383
416
  });
384
417
  Object.defineProperty(exports, "JwksUnavailableError", {
385
418
  enumerable: true,
386
- get: function () { return chunk2F3RPYJV_cjs.JwksUnavailableError; }
419
+ get: function () { return chunkKEBSZBHL_cjs.JwksUnavailableError; }
387
420
  });
388
421
  Object.defineProperty(exports, "JwksUnknownKeyError", {
389
422
  enumerable: true,
390
- get: function () { return chunk2F3RPYJV_cjs.JwksUnknownKeyError; }
423
+ get: function () { return chunkKEBSZBHL_cjs.JwksUnknownKeyError; }
391
424
  });
392
425
  Object.defineProperty(exports, "MAX_AVATAR_BYTES", {
393
426
  enumerable: true,
394
- get: function () { return chunk2F3RPYJV_cjs.MAX_AVATAR_BYTES; }
427
+ get: function () { return chunkKEBSZBHL_cjs.MAX_AVATAR_BYTES; }
395
428
  });
396
429
  Object.defineProperty(exports, "MAX_INVITATIONS", {
397
430
  enumerable: true,
398
- get: function () { return chunk2F3RPYJV_cjs.MAX_INVITATIONS; }
431
+ get: function () { return chunkKEBSZBHL_cjs.MAX_INVITATIONS; }
399
432
  });
400
433
  Object.defineProperty(exports, "SsoAppApiError", {
401
434
  enumerable: true,
402
- get: function () { return chunk2F3RPYJV_cjs.SsoAppApiError; }
435
+ get: function () { return chunkKEBSZBHL_cjs.SsoAppApiError; }
403
436
  });
404
437
  Object.defineProperty(exports, "SsoAvatarRejectedError", {
405
438
  enumerable: true,
406
- get: function () { return chunk2F3RPYJV_cjs.SsoAvatarRejectedError; }
439
+ get: function () { return chunkKEBSZBHL_cjs.SsoAvatarRejectedError; }
407
440
  });
408
441
  Object.defineProperty(exports, "SsoConfigError", {
409
442
  enumerable: true,
410
- get: function () { return chunk2F3RPYJV_cjs.SsoConfigError; }
443
+ get: function () { return chunkKEBSZBHL_cjs.SsoConfigError; }
411
444
  });
412
445
  Object.defineProperty(exports, "SsoError", {
413
446
  enumerable: true,
414
- get: function () { return chunk2F3RPYJV_cjs.SsoError; }
447
+ get: function () { return chunkKEBSZBHL_cjs.SsoError; }
415
448
  });
416
449
  Object.defineProperty(exports, "SsoInsufficientScopeError", {
417
450
  enumerable: true,
418
- get: function () { return chunk2F3RPYJV_cjs.SsoInsufficientScopeError; }
451
+ get: function () { return chunkKEBSZBHL_cjs.SsoInsufficientScopeError; }
419
452
  });
420
453
  Object.defineProperty(exports, "SsoIntrospectionUnavailableError", {
421
454
  enumerable: true,
422
- get: function () { return chunk2F3RPYJV_cjs.SsoIntrospectionUnavailableError; }
455
+ get: function () { return chunkKEBSZBHL_cjs.SsoIntrospectionUnavailableError; }
423
456
  });
424
457
  Object.defineProperty(exports, "SsoReauthError", {
425
458
  enumerable: true,
426
- get: function () { return chunk2F3RPYJV_cjs.SsoReauthError; }
459
+ get: function () { return chunkKEBSZBHL_cjs.SsoReauthError; }
427
460
  });
428
461
  Object.defineProperty(exports, "SsoTokenInactiveError", {
429
462
  enumerable: true,
430
- get: function () { return chunk2F3RPYJV_cjs.SsoTokenInactiveError; }
463
+ get: function () { return chunkKEBSZBHL_cjs.SsoTokenInactiveError; }
431
464
  });
432
465
  Object.defineProperty(exports, "cookieHeader", {
433
466
  enumerable: true,
434
- get: function () { return chunk2F3RPYJV_cjs.cookieHeader; }
467
+ get: function () { return chunkKEBSZBHL_cjs.cookieHeader; }
435
468
  });
436
469
  Object.defineProperty(exports, "createJwksCache", {
437
470
  enumerable: true,
438
- get: function () { return chunk2F3RPYJV_cjs.createJwksCache; }
471
+ get: function () { return chunkKEBSZBHL_cjs.createJwksCache; }
439
472
  });
440
473
  Object.defineProperty(exports, "createSsoClient", {
441
474
  enumerable: true,
442
- get: function () { return chunk2F3RPYJV_cjs.createSsoClient; }
475
+ get: function () { return chunkKEBSZBHL_cjs.createSsoClient; }
443
476
  });
444
477
  Object.defineProperty(exports, "loadSsoConfig", {
445
478
  enumerable: true,
446
- get: function () { return chunk2F3RPYJV_cjs.loadSsoConfig; }
479
+ get: function () { return chunkKEBSZBHL_cjs.loadSsoConfig; }
447
480
  });
448
481
  Object.defineProperty(exports, "memoryTokenStore", {
449
482
  enumerable: true,
450
- get: function () { return chunk2F3RPYJV_cjs.memoryTokenStore; }
483
+ get: function () { return chunkKEBSZBHL_cjs.memoryTokenStore; }
451
484
  });
452
485
  Object.defineProperty(exports, "openEmbeddedFlow", {
453
486
  enumerable: true,
454
- get: function () { return chunk2F3RPYJV_cjs.openEmbeddedFlow; }
487
+ get: function () { return chunkKEBSZBHL_cjs.openEmbeddedFlow; }
455
488
  });
456
489
  Object.defineProperty(exports, "readCookie", {
457
490
  enumerable: true,
458
- get: function () { return chunk2F3RPYJV_cjs.readCookie; }
491
+ get: function () { return chunkKEBSZBHL_cjs.readCookie; }
459
492
  });
460
493
  Object.defineProperty(exports, "sealEmbeddedFlow", {
461
494
  enumerable: true,
462
- get: function () { return chunk2F3RPYJV_cjs.sealEmbeddedFlow; }
495
+ get: function () { return chunkKEBSZBHL_cjs.sealEmbeddedFlow; }
463
496
  });
464
497
  Object.defineProperty(exports, "signSession", {
465
498
  enumerable: true,
466
- get: function () { return chunk2F3RPYJV_cjs.signSession; }
499
+ get: function () { return chunkKEBSZBHL_cjs.signSession; }
467
500
  });
468
501
  Object.defineProperty(exports, "signValue", {
469
502
  enumerable: true,
470
- get: function () { return chunk2F3RPYJV_cjs.signValue; }
503
+ get: function () { return chunkKEBSZBHL_cjs.signValue; }
471
504
  });
472
505
  Object.defineProperty(exports, "verifySession", {
473
506
  enumerable: true,
474
- get: function () { return chunk2F3RPYJV_cjs.verifySession; }
507
+ get: function () { return chunkKEBSZBHL_cjs.verifySession; }
475
508
  });
476
509
  Object.defineProperty(exports, "verifyValue", {
477
510
  enumerable: true,
478
- get: function () { return chunk2F3RPYJV_cjs.verifyValue; }
511
+ get: function () { return chunkKEBSZBHL_cjs.verifyValue; }
479
512
  });
480
513
  exports.DEFAULT_ISSUER = DEFAULT_ISSUER;
481
514
  exports.MAX_ACT_DEPTH = MAX_ACT_DEPTH;
@@ -489,6 +522,7 @@ exports.createDpopProof = createDpopProof;
489
522
  exports.createMemoryReplayStore = createMemoryReplayStore;
490
523
  exports.createTicketClient = createTicketClient;
491
524
  exports.createTicketVerifier = createTicketVerifier;
525
+ exports.exchangeUserToken = exchangeUserToken;
492
526
  exports.fetchTicket = fetchTicket;
493
527
  exports.normalizeHtu = normalizeHtu;
494
528
  exports.verifyDpopProof = verifyDpopProof;