@gaballahtech/seba 0.2.1 → 0.5.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.
Files changed (76) hide show
  1. package/ARCHITECTURE.md +4 -2
  2. package/CHANGELOG.md +130 -0
  3. package/MIGRATION.md +60 -0
  4. package/README.md +174 -8
  5. package/SECURITY.md +1 -1
  6. package/assets/seba-icon-favicon.png +0 -0
  7. package/assets/seba-icon-solid.png +0 -0
  8. package/assets/seba-logo-inverse.png +0 -0
  9. package/assets/seba-logo-monochrome.png +0 -0
  10. package/assets/seba-logo-primary.png +0 -0
  11. package/dist/assets/icons.d.ts +32 -0
  12. package/dist/assets/icons.d.ts.map +1 -0
  13. package/dist/assets/icons.js +30 -0
  14. package/dist/assets/icons.js.map +1 -0
  15. package/dist/assets/png-data.d.ts +8 -0
  16. package/dist/assets/png-data.d.ts.map +1 -0
  17. package/dist/assets/png-data.js +13 -0
  18. package/dist/assets/png-data.js.map +1 -0
  19. package/dist/browser/platform.d.ts +6 -0
  20. package/dist/browser/platform.d.ts.map +1 -1
  21. package/dist/browser/platform.js +17 -0
  22. package/dist/browser/platform.js.map +1 -1
  23. package/dist/browser/storage.d.ts +3 -2
  24. package/dist/browser/storage.d.ts.map +1 -1
  25. package/dist/browser/storage.js +26 -14
  26. package/dist/browser/storage.js.map +1 -1
  27. package/dist/cli.d.ts +61 -0
  28. package/dist/cli.d.ts.map +1 -0
  29. package/dist/cli.js +223 -0
  30. package/dist/cli.js.map +1 -0
  31. package/dist/core/client.d.ts +18 -8
  32. package/dist/core/client.d.ts.map +1 -1
  33. package/dist/core/client.js +130 -6
  34. package/dist/core/client.js.map +1 -1
  35. package/dist/core/errors.d.ts +10 -1
  36. package/dist/core/errors.d.ts.map +1 -1
  37. package/dist/core/errors.js +7 -2
  38. package/dist/core/errors.js.map +1 -1
  39. package/dist/core/events.d.ts +27 -0
  40. package/dist/core/events.d.ts.map +1 -0
  41. package/dist/core/events.js +45 -0
  42. package/dist/core/events.js.map +1 -0
  43. package/dist/core/http.d.ts.map +1 -1
  44. package/dist/core/http.js +6 -1
  45. package/dist/core/http.js.map +1 -1
  46. package/dist/core/oidc.d.ts +17 -7
  47. package/dist/core/oidc.d.ts.map +1 -1
  48. package/dist/core/oidc.js +76 -27
  49. package/dist/core/oidc.js.map +1 -1
  50. package/dist/core/session.d.ts +10 -3
  51. package/dist/core/session.d.ts.map +1 -1
  52. package/dist/core/session.js +131 -20
  53. package/dist/core/session.js.map +1 -1
  54. package/dist/element.d.ts +43 -0
  55. package/dist/element.d.ts.map +1 -0
  56. package/dist/element.js +416 -0
  57. package/dist/element.js.map +1 -0
  58. package/dist/index.d.ts +6 -1
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.js +3 -0
  61. package/dist/index.js.map +1 -1
  62. package/dist/pod.d.ts +50 -0
  63. package/dist/pod.d.ts.map +1 -0
  64. package/dist/pod.js +264 -0
  65. package/dist/pod.js.map +1 -0
  66. package/dist/react/index.d.ts +52 -0
  67. package/dist/react/index.d.ts.map +1 -0
  68. package/dist/react/index.js +87 -0
  69. package/dist/react/index.js.map +1 -0
  70. package/dist/seba.d.ts +40 -1
  71. package/dist/seba.d.ts.map +1 -1
  72. package/dist/seba.js +90 -2
  73. package/dist/seba.js.map +1 -1
  74. package/dist/types.d.ts +140 -6
  75. package/dist/types.d.ts.map +1 -1
  76. package/package.json +27 -1
package/dist/core/oidc.js CHANGED
@@ -116,32 +116,32 @@ export function parseAuthorizationResponse(callbackUrl, pending) {
116
116
  url = new URL(callbackUrl);
117
117
  }
118
118
  catch {
119
- throw new SebaAuthError(`The authorization response "${callbackUrl}" is not a valid URL.`);
119
+ throw new SebaAuthError(`The authorization response "${callbackUrl}" is not a valid URL.`, { stage: "authorization-response" });
120
120
  }
121
121
  const params = url.searchParams;
122
122
  const providerError = params.get("error");
123
123
  if (providerError !== null) {
124
124
  const description = params.get("error_description");
125
125
  throw new SebaAuthError(`The identity provider returned the error "${providerError}"` +
126
- (description === null ? "." : `: ${description}`));
126
+ (description === null ? "." : `: ${description}`), { stage: "authorization-response" });
127
127
  }
128
128
  const state = params.get("state");
129
129
  if (state === null || state !== pending.state) {
130
130
  throw new SebaAuthError("The authorization response state does not match the pending login. " +
131
- "The response was ignored; start the login again from the application.");
131
+ "The response was ignored; start the login again from the application.", { stage: "authorization-response-state" });
132
132
  }
133
133
  const issuer = params.get("iss");
134
134
  if (issuer === null || issuer === "") {
135
135
  throw new SebaAuthError("The authorization response does not contain the RFC 9207 \"iss\" parameter. " +
136
- `Expected "${pending.issuer}". Solid-OIDC requires providers to return it; the response was rejected.`);
136
+ `Expected "${pending.issuer}". Solid-OIDC requires providers to return it; the response was rejected.`, { stage: "authorization-response-iss" });
137
137
  }
138
138
  if (issuer !== pending.issuer) {
139
139
  throw new SebaAuthError(`The authorization response was issued by "${issuer}", but this login was started for "${pending.issuer}". ` +
140
- "This is a mix-up attempt or a misconfigured provider; the response was rejected.");
140
+ "This is a mix-up attempt or a misconfigured provider; the response was rejected.", { stage: "authorization-response-iss" });
141
141
  }
142
142
  const code = params.get("code");
143
143
  if (code === null || code === "") {
144
- throw new SebaAuthError("The authorization response does not contain an authorization code.");
144
+ throw new SebaAuthError("The authorization response does not contain an authorization code.", { stage: "authorization-response" });
145
145
  }
146
146
  return code;
147
147
  }
@@ -156,7 +156,8 @@ export function parseAuthorizationResponse(callbackUrl, pending) {
156
156
  */
157
157
  export async function requestTokenResponse(input) {
158
158
  let nonce = input.nonce;
159
- for (let attempt = 0; attempt < 2; attempt += 1) {
159
+ const attempts = 1 + (input.maxNonceRetries === undefined ? 1 : Math.max(0, input.maxNonceRetries));
160
+ for (let attempt = 0; attempt < attempts; attempt += 1) {
160
161
  const headers = {
161
162
  "content-type": "application/x-www-form-urlencoded",
162
163
  accept: "application/json",
@@ -174,9 +175,9 @@ export async function requestTokenResponse(input) {
174
175
  const response = await httpFetch(input.tokenEndpoint, { method: "POST", headers, body: input.body.toString(), redirect: "manual" }, { fetchImpl: input.fetchImpl });
175
176
  if (isOk(response)) {
176
177
  const text = await readText(response, "token");
177
- const body = parseJson(text, "The token response", (message) => new SebaAuthError(message));
178
+ const body = parseJson(text, "The token response", (message) => new SebaAuthError(message, { stage: "token-response" }));
178
179
  if (typeof body !== "object" || body === null || Array.isArray(body)) {
179
- throw new SebaAuthError("The token response is not a JSON object.");
180
+ throw new SebaAuthError("The token response is not a JSON object.", { stage: "token-response" });
180
181
  }
181
182
  return { ok: true, body: body, response };
182
183
  }
@@ -185,7 +186,7 @@ export async function requestTokenResponse(input) {
185
186
  const parsed = safeJson(text);
186
187
  const error = typeof parsed?.["error"] === "string" ? parsed["error"] : `http_${String(response.status)}`;
187
188
  const description = typeof parsed?.["error_description"] === "string" ? parsed["error_description"] : undefined;
188
- if (error === "use_dpop_nonce" && challenge !== null && attempt === 0) {
189
+ if (error === "use_dpop_nonce" && challenge !== null && attempt + 1 < attempts) {
189
190
  nonce = challenge;
190
191
  continue;
191
192
  }
@@ -227,10 +228,11 @@ export async function exchangeAuthorizationCode(input) {
227
228
  body,
228
229
  signer: input.signer,
229
230
  fetchImpl: input.fetchImpl,
231
+ ...(input.maxDpopNonceRetries === undefined ? {} : { maxNonceRetries: input.maxDpopNonceRetries }),
230
232
  });
231
233
  if (!outcome.ok) {
232
234
  throw new SebaAuthError(`The token endpoint rejected the authorization code with "${outcome.error}"` +
233
- (outcome.description === undefined ? "." : `: ${outcome.description}`));
235
+ (outcome.description === undefined ? "." : `: ${outcome.description}`), { stage: "token-exchange" });
234
236
  }
235
237
  const tokens = parseTokenSet(outcome.body);
236
238
  const identity = await validateIdToken({
@@ -241,6 +243,7 @@ export async function exchangeAuthorizationCode(input) {
241
243
  signer: input.signer,
242
244
  fetchImpl: input.fetchImpl,
243
245
  requireDpopBinding: input.configuration.scopesSupported?.includes("webid") === true,
246
+ ...(input.configuration.allowNonCompliantCnf === true ? { allowNonCompliantCnf: true } : {}),
244
247
  ...(input.expectedWebId === undefined ? {} : { expectedWebId: input.expectedWebId }),
245
248
  ...(input.jwks === undefined ? {} : { jwks: input.jwks }),
246
249
  });
@@ -259,7 +262,7 @@ export function parseTokenSet(body) {
259
262
  const tokenType = requireString(body["token_type"], "token_type");
260
263
  if (tokenType.toLowerCase() !== "dpop") {
261
264
  throw new SebaAuthError(`The provider returned token_type "${tokenType}", but SEBA requires DPoP-bound tokens. ` +
262
- "The token was discarded; check that the provider supports DPoP.");
265
+ "The token was discarded; check that the provider supports DPoP.", { stage: "token-response" });
263
266
  }
264
267
  const idToken = requireString(body["id_token"], "id_token");
265
268
  const tokens = { accessToken, tokenType: "DPoP", idToken };
@@ -283,10 +286,24 @@ export function parseTokenSet(body) {
283
286
  function requireString(value, field) {
284
287
  if (typeof value !== "string" || value === "") {
285
288
  throw new SebaAuthError(`The token response does not contain a usable "${field}" value. ` +
286
- "SEBA requires DPoP-bound access tokens together with an ID token.");
289
+ "SEBA requires DPoP-bound access tokens together with an ID token.", { stage: "token-response" });
287
290
  }
288
291
  return value;
289
292
  }
293
+ /**
294
+ * Copy the user's compliance-tolerance opt-ins onto a freshly discovered provider
295
+ * configuration, so every token-validation path (login, restore, refresh) honours
296
+ * flags that were declared on {@link SebaConfig} instead of being silently dropped.
297
+ * Only `true` values are copied; omitempty otherwise.
298
+ */
299
+ export function applyComplianceTolerances(configuration, tolerances) {
300
+ if (tolerances?.allowNonCompliantAudience === true) {
301
+ configuration.allowNonCompliantAudience = true;
302
+ }
303
+ if (tolerances?.allowNonCompliantCnf === true) {
304
+ configuration.allowNonCompliantCnf = true;
305
+ }
306
+ }
290
307
  /**
291
308
  * Validate an ID token and derive the authenticated identity.
292
309
  *
@@ -296,6 +313,20 @@ function requireString(value, field) {
296
313
  *
297
314
  * @param input - Token, provider configuration, client identity and expectations.
298
315
  */
316
+ let nonCompliantAudienceWarned = false;
317
+ export function hasNonCompliantAudienceWarned() {
318
+ return nonCompliantAudienceWarned;
319
+ }
320
+ export function setNonCompliantAudienceWarned(value) {
321
+ nonCompliantAudienceWarned = value;
322
+ }
323
+ let nonCompliantCnfWarned = false;
324
+ export function hasNonCompliantCnfWarned() {
325
+ return nonCompliantCnfWarned;
326
+ }
327
+ export function setNonCompliantCnfWarned(value) {
328
+ nonCompliantCnfWarned = value;
329
+ }
299
330
  export async function validateIdToken(input) {
300
331
  const jwks = input.jwks ?? createJwks(input.configuration.jwksUri, input.fetchImpl);
301
332
  let payload;
@@ -311,41 +342,49 @@ export async function validateIdToken(input) {
311
342
  }
312
343
  catch (error) {
313
344
  if (error instanceof joseErrors.JOSEError) {
314
- throw new SebaAuthError(`The ID token failed validation: ${error.message}.`, { cause: error });
345
+ throw new SebaAuthError(`The ID token failed validation: ${error.message}.`, { cause: error, stage: "id-token-signature" });
315
346
  }
316
347
  if (error instanceof SebaError) {
317
348
  throw error;
318
349
  }
319
- throw new SebaAuthError("The ID token could not be verified.", { cause: error });
350
+ throw new SebaAuthError("The ID token could not be verified.", { cause: error, stage: "id-token-signature" });
320
351
  }
321
352
  const audience = payload["aud"];
322
353
  const audiences = Array.isArray(audience) ? audience : [audience];
323
354
  const azp = payload["azp"];
324
355
  if (azp !== undefined && azp !== input.clientId) {
325
- throw new SebaAuthError(`The ID token was issued to authorized party "${String(azp)}", not to this client ("${input.clientId}").`);
356
+ throw new SebaAuthError(`The ID token was issued to authorized party "${String(azp)}", not to this client ("${input.clientId}").`, { stage: "id-token-azp" });
326
357
  }
327
358
  if (audiences.length > 1 && azp === undefined) {
328
- throw new SebaAuthError("The ID token has multiple audiences but no \"azp\" claim.");
359
+ throw new SebaAuthError("The ID token has multiple audiences but no \"azp\" claim.", { stage: "id-token-azp" });
329
360
  }
330
361
  const solidRequired = input.configuration.scopesSupported?.includes("webid") === true;
331
362
  if (solidRequired && !audiences.includes("solid")) {
332
- throw new SebaAuthError("The ID token audience does not include \"solid\". Solid-OIDC requires it when the provider advertises the webid scope.");
363
+ if (!input.configuration.allowNonCompliantAudience) {
364
+ throw new SebaAuthError("The ID token audience does not include \"solid\". Solid-OIDC requires it when the provider advertises the webid scope.", { stage: "id-token-audience" });
365
+ }
366
+ if (!hasNonCompliantAudienceWarned()) {
367
+ setNonCompliantAudienceWarned(true);
368
+ console.warn("[SEBA] WARNING: Accepting an ID token without \"solid\" in aud because " +
369
+ "allowNonCompliantAudience is enabled. This weakens Solid-OIDC §8.1 audience " +
370
+ "guarantees. Disable this flag once your provider is compliant.");
371
+ }
333
372
  }
334
373
  if (input.nonce !== undefined && payload["nonce"] !== input.nonce) {
335
- throw new SebaAuthError("The ID token nonce does not match the login that was started.");
374
+ throw new SebaAuthError("The ID token nonce does not match the login that was started.", { stage: "id-token-nonce" });
336
375
  }
337
376
  const issuedAt = payload["iat"];
338
377
  if (typeof issuedAt !== "number" || !Number.isFinite(issuedAt)) {
339
- throw new SebaAuthError("The ID token has no usable \"iat\" claim.");
378
+ throw new SebaAuthError("The ID token has no usable \"iat\" claim.", { stage: "id-token-iat" });
340
379
  }
341
380
  const nowSeconds = Math.floor(Date.now() / 1000);
342
381
  if (issuedAt > nowSeconds + CLOCK_TOLERANCE_SECONDS) {
343
- throw new SebaAuthError("The ID token was issued in the future; check the device clock.");
382
+ throw new SebaAuthError("The ID token was issued in the future; check the device clock.", { stage: "id-token-iat" });
344
383
  }
345
384
  await checkDpopBinding(payload, input);
346
385
  const subject = payload["sub"];
347
386
  if (typeof subject !== "string" || subject === "") {
348
- throw new SebaAuthError("The ID token has no usable \"sub\" claim.");
387
+ throw new SebaAuthError("The ID token has no usable \"sub\" claim.", { stage: "id-token-sub" });
349
388
  }
350
389
  if (input.expectedSubject !== undefined && subject !== input.expectedSubject) {
351
390
  throw new SebaAuthError("The ID token subject does not match the stored session.");
@@ -353,7 +392,7 @@ export async function validateIdToken(input) {
353
392
  const webId = extractWebId(payload, subject);
354
393
  if (input.expectedWebId !== undefined && webId !== input.expectedWebId) {
355
394
  throw new SebaAuthError(`The provider authenticated "${webId}", but this login requested "${input.expectedWebId}". ` +
356
- "The session was not created.");
395
+ "The session was not created.", { stage: "id-token-webid" });
357
396
  }
358
397
  return { webId, issuer: input.configuration.issuer, subject };
359
398
  }
@@ -364,18 +403,28 @@ async function checkDpopBinding(payload, input) {
364
403
  : undefined;
365
404
  if (boundThumbprint !== undefined) {
366
405
  if (input.signer === undefined) {
367
- throw new SebaAuthError("The ID token is bound to a DPoP key that is not available locally.");
406
+ throw new SebaAuthError("The ID token is bound to a DPoP key that is not available locally.", { stage: "id-token-cnf-binding" });
368
407
  }
369
408
  const thumbprint = await input.signer.thumbprint();
370
409
  if (boundThumbprint !== thumbprint) {
371
410
  throw new SebaAuthError("The ID token is bound to a different DPoP key than the one used for this session. " +
372
- "The token was discarded.");
411
+ "The token was discarded.", { stage: "id-token-cnf-binding" });
373
412
  }
374
413
  return;
375
414
  }
376
415
  if (input.requireDpopBinding === true) {
416
+ if (input.allowNonCompliantCnf === true) {
417
+ if (!hasNonCompliantCnfWarned()) {
418
+ setNonCompliantCnfWarned(true);
419
+ console.warn("[SEBA] WARNING: Accepting an ID token without \"cnf.jkt\" because " +
420
+ "allowNonCompliantCnf is enabled. This weakens Solid-OIDC §8.1 DPoP-binding " +
421
+ "guarantees on the ID token; DPoP proofs remain mandatory on every request. " +
422
+ "Disable this flag once your provider is compliant.");
423
+ }
424
+ return;
425
+ }
377
426
  throw new SebaAuthError("The ID token is not bound to a DPoP key (\"cnf.jkt\"), but the provider advertises the webid scope. " +
378
- "Solid-OIDC requires DPoP-bound tokens.");
427
+ "Solid-OIDC requires DPoP-bound tokens.", { stage: "id-token-cnf-binding" });
379
428
  }
380
429
  }
381
430
  function extractWebId(payload, subject) {
@@ -387,7 +436,7 @@ function extractWebId(payload, subject) {
387
436
  }
388
437
  catch {
389
438
  throw new SebaAuthError(`The ID token identifies the user as "${candidate}", which is not an absolute URL. ` +
390
- "A WebID must be an https URL; the session was not created.");
439
+ "A WebID must be an https URL; the session was not created.", { stage: "id-token-webid" });
391
440
  }
392
441
  if (url.protocol !== "https:" && !(url.protocol === "http:" && isLoopbackHost(url.hostname))) {
393
442
  throw new SebaAuthError(`The ID token identifies the user as "${candidate}", which does not use https. ` +
@@ -1 +1 @@
1
- {"version":3,"file":"oidc.js","sourceRoot":"","sources":["../../src/core/oidc.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"oidc.js","sourceRoot":"","sources":["../../src/core/oidc.ts"],"names":[],"mappings":"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"}
@@ -10,7 +10,7 @@
10
10
  * - transient failures never clear a still-valid refresh token.
11
11
  */
12
12
  import { type Identity } from "./oidc.js";
13
- import type { DPoPSigner, OIDCConfiguration, PersistedKey, Session, SessionStorageAdapter, TokenSet } from "../types.js";
13
+ import type { DPoPSigner, OIDCConfiguration, PersistedKey, Session, SessionChangeListener, SessionStorageAdapter, TokenSet } from "../types.js";
14
14
  /** Refresh an access token this long before it expires (milliseconds). */
15
15
  export declare const EXPIRY_SKEW_MS = 30000;
16
16
  /** A logged in session held in memory. */
@@ -25,8 +25,8 @@ export interface SessionState {
25
25
  readonly key: PersistedKey;
26
26
  /** Client identifier the session belongs to. */
27
27
  readonly clientId: string;
28
- /** Discovery metadata used for refresh and revocation. */
29
- readonly configuration: OIDCConfiguration;
28
+ /** Discovery metadata used for refresh and revocation; `null` for sessions resumed without discovery. */
29
+ readonly configuration: OIDCConfiguration | null;
30
30
  /** Access token expiry (epoch milliseconds), or `null` when unknown. */
31
31
  readonly expiresAt: number | null;
32
32
  }
@@ -40,8 +40,15 @@ export interface SessionManagerOptions {
40
40
  readonly fetchImpl: typeof fetch;
41
41
  /** Re-discover a provider when restoring a session. */
42
42
  readonly discover: (issuer: string) => Promise<OIDCConfiguration>;
43
+ /**
44
+ * How many `use_dpop_nonce` challenges the token endpoint may issue before giving up.
45
+ * @defaultValue 1
46
+ */
47
+ readonly maxDpopNonceRetries?: number;
43
48
  /** Non-sensitive diagnostics. */
44
49
  readonly debug?: (message: string) => void;
50
+ /** Receives session transitions (`login`, `restore`, `logout`, `expired`). */
51
+ readonly onSessionChange?: SessionChangeListener;
45
52
  }
46
53
  /**
47
54
  * Owns the current session and its persistence.
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/core/session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,EAAwD,KAAK,QAAQ,EAAE,MAAM,WAAW,CAAC;AAChG,OAAO,KAAK,EACV,UAAU,EACV,iBAAiB,EACjB,YAAY,EAEZ,OAAO,EACP,qBAAqB,EACrB,QAAQ,EACT,MAAM,aAAa,CAAC;AAErB,0EAA0E;AAC1E,eAAO,MAAM,cAAc,QAAS,CAAC;AAKrC,0CAA0C;AAC1C,MAAM,WAAW,YAAY;IAC3B,4DAA4D;IAC5D,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC1B,iDAAiD;IACjD,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,gDAAgD;IAChD,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,2DAA2D;IAC3D,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAC;IAC3B,gDAAgD;IAChD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,0DAA0D;IAC1D,QAAQ,CAAC,aAAa,EAAE,iBAAiB,CAAC;IAC1C,wEAAwE;IACxE,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAED,0CAA0C;AAC1C,MAAM,WAAW,qBAAqB;IACpC,+DAA+D;IAC/D,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,qCAAqC;IACrC,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAC;IACxC,oCAAoC;IACpC,QAAQ,CAAC,SAAS,EAAE,OAAO,KAAK,CAAC;IACjC,uDAAuD;IACvD,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAClE,iCAAiC;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5C;AAED;;;;GAIG;AACH,qBAAa,cAAc;;gBAKb,OAAO,EAAE,qBAAqB;IAI1C,wDAAwD;IACxD,IAAI,OAAO,IAAI,YAAY,GAAG,IAAI,CAEjC;IAED,8CAA8C;IAC9C,IAAI,eAAe,IAAI,OAAO,CAE7B;IAED;;;;OAIG;IACH,OAAO,IAAI,YAAY;IAOvB,sDAAsD;IACtD,eAAe,IAAI,OAAO,GAAG,IAAI;IAOjC;;;;;;OAMG;IACG,KAAK,CAAC,KAAK,EAAE;QACjB,MAAM,EAAE,QAAQ,CAAC;QACjB,QAAQ,EAAE,QAAQ,CAAC;QACnB,MAAM,EAAE,UAAU,CAAC;QACnB,GAAG,EAAE,YAAY,CAAC;QAClB,aAAa,EAAE,iBAAiB,CAAC;KAClC,GAAG,OAAO,CAAC,YAAY,CAAC;IAkCzB;;;;;;;OAOG;IACG,OAAO,IAAI,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IA2BxC,8EAA8E;IAC9E,IAAI,SAAS,IAAI,MAAM,GAAG,IAAI,CAE7B;IAED;;;;;OAKG;IACG,eAAe,CAAC,KAAK,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IA0InD;;;;;OAKG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAqD7B,yDAAyD;IACnD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IASjC,8EAA8E;IAC9E,SAAS,IAAI,OAAO;CAerB;AAMD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,IAAI,WAAW,GAAG,QAAQ,CAItF"}
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/core/session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,EAAwD,KAAK,QAAQ,EAAE,MAAM,WAAW,CAAC;AAChG,OAAO,KAAK,EACV,UAAU,EACV,iBAAiB,EACjB,YAAY,EAEZ,OAAO,EACP,qBAAqB,EAErB,qBAAqB,EACrB,QAAQ,EACT,MAAM,aAAa,CAAC;AAErB,0EAA0E;AAC1E,eAAO,MAAM,cAAc,QAAS,CAAC;AAKrC,0CAA0C;AAC1C,MAAM,WAAW,YAAY;IAC3B,4DAA4D;IAC5D,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC1B,iDAAiD;IACjD,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,gDAAgD;IAChD,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,2DAA2D;IAC3D,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAC;IAC3B,gDAAgD;IAChD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,yGAAyG;IACzG,QAAQ,CAAC,aAAa,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACjD,wEAAwE;IACxE,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAED,0CAA0C;AAC1C,MAAM,WAAW,qBAAqB;IACpC,+DAA+D;IAC/D,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,qCAAqC;IACrC,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAC;IACxC,oCAAoC;IACpC,QAAQ,CAAC,SAAS,EAAE,OAAO,KAAK,CAAC;IACjC,uDAAuD;IACvD,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAClE;;;OAGG;IACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IACtC,iCAAiC;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,8EAA8E;IAC9E,QAAQ,CAAC,eAAe,CAAC,EAAE,qBAAqB,CAAC;CAClD;AAED;;;;GAIG;AACH,qBAAa,cAAc;;gBAMb,OAAO,EAAE,qBAAqB;IAI1C,wDAAwD;IACxD,IAAI,OAAO,IAAI,YAAY,GAAG,IAAI,CAEjC;IAED,8CAA8C;IAC9C,IAAI,eAAe,IAAI,OAAO,CAE7B;IAED;;;;OAIG;IACH,OAAO,IAAI,YAAY;IAOvB,sDAAsD;IACtD,eAAe,IAAI,OAAO,GAAG,IAAI;IAOjC;;;;;;OAMG;IACG,KAAK,CAAC,KAAK,EAAE;QACjB,MAAM,EAAE,QAAQ,CAAC;QACjB,QAAQ,EAAE,QAAQ,CAAC;QACnB,MAAM,EAAE,UAAU,CAAC;QACnB,GAAG,EAAE,YAAY,CAAC;QAClB,aAAa,EAAE,iBAAiB,CAAC;KAClC,GAAG,OAAO,CAAC,YAAY,CAAC;IAgDzB;;;;;;;OAOG;IACG,OAAO,IAAI,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAsFxC,8EAA8E;IAC9E,IAAI,SAAS,IAAI,MAAM,GAAG,IAAI,CAE7B;IAED;;;;;OAKG;IACG,eAAe,CAAC,KAAK,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IA6JnD;;;;;OAKG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAgE7B,yDAAyD;IACnD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IASjC,8EAA8E;IAC9E,SAAS,IAAI,OAAO;CA2CrB;AAMD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,IAAI,WAAW,GAAG,QAAQ,CAItF"}
@@ -26,6 +26,7 @@ export class SessionManager {
26
26
  #options;
27
27
  #state = null;
28
28
  #refreshing = null;
29
+ #expiredNotified = false;
29
30
  constructor(options) {
30
31
  this.#options = options;
31
32
  }
@@ -73,27 +74,38 @@ export class SessionManager {
73
74
  expiresAt: expiresAtFrom(input.tokens),
74
75
  };
75
76
  this.#state = state;
76
- if (input.tokens.refreshToken !== undefined) {
77
- const record = {
78
- version: 1,
79
- webId: state.identity.webId,
80
- provider: state.identity.issuer,
81
- clientId: state.clientId,
82
- refreshToken: input.tokens.refreshToken,
83
- key: input.key,
84
- createdAt: Date.now(),
85
- ...(input.tokens.scope === undefined ? {} : { scope: input.tokens.scope }),
86
- };
87
- try {
88
- await this.#options.storage.save(record);
89
- }
90
- catch (error) {
91
- this.#log("session storage is unavailable; the session will not survive a reload", error);
92
- }
77
+ const noRefreshToken = input.tokens.refreshToken === undefined;
78
+ const record = {
79
+ version: 1,
80
+ webId: state.identity.webId,
81
+ provider: state.identity.issuer,
82
+ clientId: state.clientId,
83
+ ...(noRefreshToken
84
+ ? {
85
+ // With no refresh token there is nothing else to fetch with after a
86
+ // reload, so the access token is stored to keep the session alive
87
+ // until it expires. It is never stored for refresh-token sessions.
88
+ accessToken: input.tokens.accessToken,
89
+ accessTokenExpiresAt: state.expiresAt,
90
+ subject: input.identity.subject,
91
+ }
92
+ : {}),
93
+ ...(noRefreshToken ? {} : { refreshToken: input.tokens.refreshToken }),
94
+ key: input.key,
95
+ createdAt: Date.now(),
96
+ ...(input.tokens.scope === undefined ? {} : { scope: input.tokens.scope }),
97
+ };
98
+ try {
99
+ await this.#options.storage.save(record);
93
100
  }
94
- else {
95
- this.#log("the provider issued no refresh token; the session will not survive a reload");
101
+ catch (error) {
102
+ this.#log("session storage is unavailable; the session will not survive a reload", error);
103
+ }
104
+ if (noRefreshToken) {
105
+ this.#log("the provider issued no refresh token; the session is stored with its access token and expires when the token does");
96
106
  }
107
+ this.#expiredNotified = false;
108
+ this.#emit("login");
97
109
  return state;
98
110
  }
99
111
  /**
@@ -119,12 +131,58 @@ export class SessionManager {
119
131
  }
120
132
  catch (error) {
121
133
  await this.clearLocal();
134
+ this.#signalExpired();
122
135
  throw new SebaSessionExpiredError("The stored DPoP key is unusable; the session was cleared.", {
123
136
  cause: error,
124
137
  });
125
138
  }
139
+ if (record.refreshToken === undefined) {
140
+ return this.#restoreWithoutRefreshToken(record, signer);
141
+ }
126
142
  const configuration = await this.#options.discover(record.provider);
127
143
  await this.#refreshWith(record, signer, configuration);
144
+ this.#expiredNotified = false;
145
+ this.#emit("restore");
146
+ return this.toPublicSession();
147
+ }
148
+ /**
149
+ * Resume a session stored without a refresh token. The stored access token is
150
+ * reused while it is still valid; once it expires the record is cleared with a
151
+ * clear error because nothing on disk can renew it.
152
+ */
153
+ async #restoreWithoutRefreshToken(record, signer) {
154
+ if (record.accessToken === undefined || record.accessToken === "") {
155
+ await this.clearLocal();
156
+ this.#signalExpired();
157
+ throw new SebaSessionExpiredError("The stored session has no usable credential; it was cleared. Sign in again.");
158
+ }
159
+ if (record.accessTokenExpiresAt !== undefined &&
160
+ record.accessTokenExpiresAt !== null &&
161
+ Date.now() >= record.accessTokenExpiresAt - EXPIRY_SKEW_MS) {
162
+ await this.clearLocal();
163
+ this.#signalExpired();
164
+ throw new SebaSessionExpiredError("The stored access token has expired and the provider issued no refresh token, so the session was cleared. Sign in again.");
165
+ }
166
+ const tokens = {
167
+ // Only the access token matters here: sessions restored without a refresh
168
+ // token cannot refresh, so idToken is never read on this path.
169
+ tokenType: "DPoP",
170
+ accessToken: record.accessToken,
171
+ idToken: "",
172
+ ...(record.scope === undefined ? {} : { scope: record.scope }),
173
+ };
174
+ this.#state = {
175
+ tokens,
176
+ identity: { webId: record.webId, issuer: record.provider, subject: record.subject ?? record.webId },
177
+ signer,
178
+ key: record.key,
179
+ clientId: this.#options.clientId,
180
+ configuration: null,
181
+ expiresAt: record.accessTokenExpiresAt ?? null,
182
+ };
183
+ this.#log("restored the session with the stored access token (the provider issued no refresh token; it expires with the token)");
184
+ this.#expiredNotified = false;
185
+ this.#emit("restore");
128
186
  return this.toPublicSession();
129
187
  }
130
188
  /** Access token expiry, or `null` when the provider did not advertise one. */
@@ -138,9 +196,14 @@ export class SessionManager {
138
196
  * @throws {@link SebaAuthError} when no session exists.
139
197
  */
140
198
  async refreshIfNeeded(force = false) {
199
+ if (this.#state === null && this.#expiredNotified) {
200
+ throw new SebaSessionExpiredError("The session has expired. Sign in again.");
201
+ }
141
202
  const state = this.require();
142
203
  if (state.tokens.refreshToken === undefined) {
143
204
  if (force) {
205
+ await this.clearLocal();
206
+ this.#signalExpired();
144
207
  throw new SebaSessionExpiredError("The access token was rejected and no refresh token is available. Sign in again.");
145
208
  }
146
209
  return;
@@ -169,8 +232,15 @@ export class SessionManager {
169
232
  const record = await this.#options.storage.load();
170
233
  const refreshToken = state.tokens.refreshToken ?? record?.refreshToken;
171
234
  if (refreshToken === undefined) {
235
+ await this.clearLocal();
236
+ this.#signalExpired();
172
237
  throw new SebaSessionExpiredError("No refresh token is available. Sign in again.");
173
238
  }
239
+ if (state.configuration === null) {
240
+ await this.clearLocal();
241
+ this.#signalExpired();
242
+ throw new SebaSessionExpiredError("No provider metadata is available for this session. Sign in again.");
243
+ }
174
244
  const stored = record ?? {
175
245
  version: 1,
176
246
  webId: state.identity.webId,
@@ -183,6 +253,9 @@ export class SessionManager {
183
253
  await this.#refreshWith(stored, state.signer, state.configuration);
184
254
  }
185
255
  async #refreshWith(record, signer, configuration) {
256
+ if (record.refreshToken === undefined) {
257
+ throw new SebaSessionExpiredError("No refresh token is available. Sign in again.");
258
+ }
186
259
  const body = new URLSearchParams({
187
260
  grant_type: "refresh_token",
188
261
  refresh_token: record.refreshToken,
@@ -193,6 +266,7 @@ export class SessionManager {
193
266
  body,
194
267
  signer,
195
268
  fetchImpl: this.#options.fetchImpl,
269
+ maxNonceRetries: this.#options.maxDpopNonceRetries,
196
270
  });
197
271
  if (!outcome.ok) {
198
272
  if (outcome.status >= 500) {
@@ -200,6 +274,7 @@ export class SessionManager {
200
274
  }
201
275
  if (TERMINAL_REFRESH_ERRORS.has(outcome.error)) {
202
276
  await this.clearLocal();
277
+ this.#signalExpired();
203
278
  throw new SebaSessionExpiredError(`The stored session is no longer valid ("${outcome.error}"). Sign in again.`);
204
279
  }
205
280
  throw new SebaAuthError(`The token endpoint rejected the refresh request with "${outcome.error}"` +
@@ -215,6 +290,7 @@ export class SessionManager {
215
290
  signer,
216
291
  fetchImpl: this.#options.fetchImpl,
217
292
  requireDpopBinding: configuration.scopesSupported?.includes("webid") === true,
293
+ ...(configuration.allowNonCompliantCnf === true ? { allowNonCompliantCnf: true } : {}),
218
294
  expectedWebId: record.webId,
219
295
  });
220
296
  }
@@ -225,6 +301,7 @@ export class SessionManager {
225
301
  // repeat the failure on every restore. Network/JWKS transport errors are not
226
302
  // SebaAuthError and keep the record.
227
303
  await this.clearLocal();
304
+ this.#signalExpired();
228
305
  throw new SebaSessionExpiredError("The refreshed ID token does not match the stored session, so the session was cleared. Sign in again.", { cause: error });
229
306
  }
230
307
  throw error;
@@ -266,7 +343,9 @@ export class SessionManager {
266
343
  const refreshToken = state?.tokens.refreshToken ?? record?.refreshToken;
267
344
  let configuration = state?.configuration;
268
345
  let signer = state?.signer;
269
- if (refreshToken !== undefined && record !== null && (configuration === undefined || signer === undefined)) {
346
+ if (refreshToken !== undefined &&
347
+ record !== null &&
348
+ (configuration === undefined || configuration === null || signer === undefined)) {
270
349
  try {
271
350
  configuration ??= await this.#options.discover(record.provider);
272
351
  signer ??= await loadDPoPKey(record.key);
@@ -276,7 +355,12 @@ export class SessionManager {
276
355
  }
277
356
  }
278
357
  await this.clearLocal();
358
+ this.#emit("logout");
279
359
  if (refreshToken === undefined || configuration?.revocationEndpoint === undefined || signer === undefined) {
360
+ if (refreshToken !== undefined && configuration?.revocationEndpoint === undefined) {
361
+ this.#log("the provider does not advertise a revocation endpoint; the refresh token remains " +
362
+ "valid on the server until it expires (or is revoked out-of-band). Local state was cleared.");
363
+ }
280
364
  return;
281
365
  }
282
366
  try {
@@ -326,6 +410,33 @@ export class SessionManager {
326
410
  }
327
411
  return state.expiresAt !== null && Date.now() >= state.expiresAt - EXPIRY_SKEW_MS;
328
412
  }
413
+ /** Emit a transition; listener failures never break the session flow. */
414
+ #emit(reason) {
415
+ const listener = this.#options.onSessionChange;
416
+ if (listener === undefined) {
417
+ return;
418
+ }
419
+ try {
420
+ listener({ reason, session: this.toPublicSession() });
421
+ }
422
+ catch {
423
+ // Application callbacks must not interrupt session handling.
424
+ }
425
+ }
426
+ /**
427
+ * Emit `expired` at most once per session.
428
+ *
429
+ * The in-memory session is dropped first so the event always carries
430
+ * `session: null`, matching {@link SessionChangeEvent}.
431
+ */
432
+ #signalExpired() {
433
+ if (this.#expiredNotified) {
434
+ return;
435
+ }
436
+ this.#expiredNotified = true;
437
+ this.#state = null;
438
+ this.#emit("expired");
439
+ }
329
440
  #log(message, error) {
330
441
  if (this.#options.debug === undefined) {
331
442
  return;