@hearth-auth/sdk 3.0.0 → 3.1.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.
@@ -1,5 +1,5 @@
1
1
  import { AuthorizationModeMismatchError, ConfigurationError, DiscoveryError, OAuthFlowError, TokenExpiredError, } from "./errors.js";
2
- import { JwksClient } from "./jwks-client.js";
2
+ import { DEFAULT_AUDIENCE, JwksClient } from "./jwks-client.js";
3
3
  import { IntrospectionClient } from "./introspection-client.js";
4
4
  import { buildAuthorizationUrl, generateCodeChallenge, generateCodeVerifier } from "./pkce.js";
5
5
  /**
@@ -17,6 +17,8 @@ export class HearthClient {
17
17
  issuerUrl;
18
18
  clientId;
19
19
  clientSecret;
20
+ /** Expected `aud` of verified access tokens. Default `"hearth"`. */
21
+ audience;
20
22
  jwksTtl;
21
23
  introspectionEndpointOverride;
22
24
  /** HTTP timeout in milliseconds applied to all outbound fetch calls. */
@@ -42,6 +44,10 @@ export class HearthClient {
42
44
  this.issuerUrl = config.issuerUrl.replace(/\/$/, "");
43
45
  this.clientId = config.clientId;
44
46
  this.clientSecret = config.clientSecret;
47
+ if (config.audience === "") {
48
+ throw new ConfigurationError('audience must not be empty — leave it unset for the default "hearth"');
49
+ }
50
+ this.audience = config.audience ?? DEFAULT_AUDIENCE;
45
51
  this.jwksTtl = config.jwksTtl;
46
52
  this.introspectionEndpointOverride = config.introspectionEndpoint;
47
53
  this.httpTimeout = config.httpTimeout ?? 10_000;
@@ -121,7 +127,7 @@ export class HearthClient {
121
127
  // Pin iss/aud on the client itself, so a caller who reaches for the
122
128
  // exported JwksClient still gets them checked.
123
129
  issuer: this.issuerUrl,
124
- audience: this.clientId,
130
+ audience: this.audience,
125
131
  ttl: this.jwksTtl,
126
132
  httpTimeout: this.httpTimeout,
127
133
  });
@@ -230,21 +236,23 @@ export class HearthClient {
230
236
  * 2. `exp` claim (rejects expired tokens).
231
237
  * 3. `nbf` claim (rejects post-dated tokens).
232
238
  * 4. `iss` claim (must match configured `issuerUrl`).
233
- * 5. `aud` claim (validated when `clientId` is set in config).
239
+ * 5. `aud` claim (must contain the configured `audience`, default `"hearth"`).
240
+ * 6. `iat` claim (rejects a token issued in the future).
234
241
  *
235
- * `exp` and `nbf` allow a 5-second clock skew.
242
+ * `exp`, `nbf` and `iat` allow a 5-second clock skew.
236
243
  *
237
244
  * @throws {@link TokenExpiredError} — token is expired.
245
+ * @throws {@link TokenNotYetValidError} — `nbf` or `iat` is in the future.
238
246
  * @throws {@link TokenInvalidError} — signature invalid or JWT malformed.
239
247
  * @throws {@link TokenIssuerError} — issuer does not match `issuerUrl`.
240
- * @throws {@link TokenAudienceError} — audience does not include `clientId`.
248
+ * @throws {@link TokenAudienceError} — audience does not include `audience`.
241
249
  * @throws {@link JWKSFetchError} — JWKS endpoint unreachable.
242
250
  */
243
251
  async verifyToken(token) {
244
252
  const jc = await this.jwksClient();
245
253
  return jc.verify(token, {
246
254
  issuer: this.issuerUrl,
247
- audience: this.clientId,
255
+ audience: this.audience,
248
256
  });
249
257
  }
250
258
  // ── §4.5 — OAuth Flows ───────────────────────────────────────────────────
@@ -1 +1 @@
1
- {"version":3,"file":"hearth-client.js","sourceRoot":"","sources":["../src/hearth-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hearth-client.js","sourceRoot":"","sources":["../src/hearth-client.ts"],"names":[],"mappings":"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"}
package/dist/hearth.d.ts CHANGED
@@ -6,11 +6,22 @@ export interface HearthOptions {
6
6
  /** Realm ID to scope all requests to. */
7
7
  realmId: string;
8
8
  /**
9
- * Called synchronously on every `hasPermission` / `hasRole` /
10
- * `inGroup` / `inOrg` check. Return `null`/`undefined` when the
11
- * caller is unauthenticated.
9
+ * The realm's issuer URL, e.g. `https://hearth.example.com/realms/acme`.
10
+ * Tokens are verified against the JWKS this issuer publishes, and their
11
+ * `iss` must equal it.
12
12
  */
13
- getToken: () => string | null | undefined;
13
+ issuerUrl: string;
14
+ /**
15
+ * Expected `aud` of the token: the name of the API that checks it
16
+ * (RFC 9068 §4). Default `"hearth"`, the audience Hearth mints when a
17
+ * client names no resource. The check is always on.
18
+ */
19
+ audience?: string;
20
+ /**
21
+ * Called on every `hasPermission` / `hasRole` / `inGroup` / `inOrg`
22
+ * check. Return `null`/`undefined` when the caller is unauthenticated.
23
+ */
24
+ getToken: () => string | null | undefined | Promise<string | null | undefined>;
14
25
  /**
15
26
  * Optional session-version cache configuration (RFC HEA-930 § 13).
16
27
  *
@@ -40,42 +51,45 @@ export interface HearthHttpClient {
40
51
  /**
41
52
  * RBAC claim-oriented facade over the Hearth SDK.
42
53
  *
43
- * When `sessionVersions` is not configured all boolean predicates are
44
- * synchronous, lock-free, and decode the JWT returned by `getToken()` on
45
- * every call. No network traffic, no cache. When the token is absent or
46
- * malformed every predicate returns `false`.
54
+ * Every predicate verifies the token returned by `getToken()` before it
55
+ * reads a claim: the EdDSA signature against the realm JWKS (fetched once,
56
+ * then cached), plus `exp`, `nbf`, `iat`, `iss` and `aud`. A token that is
57
+ * absent or does not verify holds nothing, and the predicate resolves to
58
+ * `false`.
47
59
  *
48
60
  * When `sessionVersions.enabled` is `true`, the predicates additionally
49
- * validate the `sv` claim and may throw {@link SessionVersionRevokedError}
50
- * or {@link SessionVersionCacheStaleError} (see RFC HEA-930 § 8).
61
+ * validate the `sv` claim and may reject with
62
+ * {@link SessionVersionRevokedError} or {@link SessionVersionCacheStaleError}
63
+ * (see RFC HEA-930 § 8).
51
64
  */
52
65
  export interface HearthFacade {
53
66
  /**
54
- * Returns `true` iff the JWT `permissions` claim contains `permission`.
67
+ * Resolves `true` iff the token verifies and its `permissions` claim
68
+ * contains `permission`.
55
69
  *
56
- * May throw {@link SessionVersionRevokedError} or
70
+ * May reject with {@link SessionVersionRevokedError} or
57
71
  * {@link SessionVersionCacheStaleError} when session-version tracking
58
72
  * is enabled and the token's `sv` claim fails validation.
59
73
  */
60
- hasPermission(permission: string): boolean;
74
+ hasPermission(permission: string): Promise<boolean>;
61
75
  /**
62
- * Returns `true` iff the JWT `roles` claim contains `role`.
76
+ * Resolves `true` iff the token verifies and its `roles` claim contains `role`.
63
77
  *
64
- * Same session-version throw semantics as {@link hasPermission}.
78
+ * Same session-version semantics as {@link hasPermission}.
65
79
  */
66
- hasRole(role: string): boolean;
80
+ hasRole(role: string): Promise<boolean>;
67
81
  /**
68
- * Returns `true` iff the JWT `groups` claim contains `group`.
82
+ * Resolves `true` iff the token verifies and its `groups` claim contains `group`.
69
83
  *
70
- * Same session-version throw semantics as {@link hasPermission}.
84
+ * Same session-version semantics as {@link hasPermission}.
71
85
  */
72
- inGroup(group: string): boolean;
86
+ inGroup(group: string): Promise<boolean>;
73
87
  /**
74
- * Returns `true` iff the JWT `oid` claim equals `org`.
88
+ * Resolves `true` iff the token verifies and its `oid` claim equals `org`.
75
89
  *
76
- * Same session-version throw semantics as {@link hasPermission}.
90
+ * Same session-version semantics as {@link hasPermission}.
77
91
  */
78
- inOrg(org: string): boolean;
92
+ inOrg(org: string): Promise<boolean>;
79
93
  /**
80
94
  * Returns the age of the session-version cache in milliseconds.
81
95
  *
@@ -95,8 +109,8 @@ export interface HearthFacade {
95
109
  client: HearthHttpClient;
96
110
  }
97
111
  /**
98
- * Create a {@link HearthFacade} over the RBAC claim set embedded in the
99
- * JWT returned by `opts.getToken()`.
112
+ * Create a {@link HearthFacade} over the RBAC claims of the token returned
113
+ * by `opts.getToken()`. Each check verifies that token first.
100
114
  *
101
115
  * When `opts.sessionVersions.enabled` is `true` the facade additionally
102
116
  * starts a background session-version poll loop. Call `facade.stop()` to
package/dist/hearth.js CHANGED
@@ -1,41 +1,26 @@
1
- import { decodeJwt } from "jose";
2
1
  import { HearthApiClient } from "./client.js";
2
+ import { HearthClient } from "./hearth-client.js";
3
3
  import { SessionVersionCache } from "./session-version-cache.js";
4
- /**
5
- * Decode the middle JWT segment using `jose.decodeJwt`. Returns `null`
6
- * when the token is missing, malformed, or cannot be parsed as JSON.
7
- * Signature is NOT verified — the app trusts its own token.
8
- */
9
- function safeDecode(token) {
10
- if (!token || typeof token !== "string")
11
- return null;
12
- try {
13
- return decodeJwt(token);
14
- }
15
- catch {
16
- return null;
17
- }
18
- }
19
4
  function arrayContains(claim, value) {
20
5
  return Array.isArray(claim) && claim.includes(value);
21
6
  }
22
7
  /** Extract the `sv` claim as `bigint`, or `undefined` if absent/non-numeric. */
23
8
  function extractSv(c) {
24
- if (c.sv === undefined || c.sv === null)
25
- return undefined;
26
- if (typeof c.sv === "number")
27
- return BigInt(Math.trunc(c.sv));
28
- if (typeof c.sv === "bigint")
29
- return c.sv;
9
+ const sv = c.get("sv");
10
+ if (typeof sv === "number")
11
+ return BigInt(Math.trunc(sv));
12
+ if (typeof sv === "bigint")
13
+ return sv;
30
14
  return undefined;
31
15
  }
32
16
  /** Extract the `sid` claim as `string`, or `undefined` if absent. */
33
17
  function extractSid(c) {
34
- return typeof c.sid === "string" ? c.sid : undefined;
18
+ const sid = c.get("sid");
19
+ return typeof sid === "string" ? sid : undefined;
35
20
  }
36
21
  /**
37
- * Create a {@link HearthFacade} over the RBAC claim set embedded in the
38
- * JWT returned by `opts.getToken()`.
22
+ * Create a {@link HearthFacade} over the RBAC claims of the token returned
23
+ * by `opts.getToken()`. Each check verifies that token first.
39
24
  *
40
25
  * When `opts.sessionVersions.enabled` is `true` the facade additionally
41
26
  * starts a background session-version poll loop. Call `facade.stop()` to
@@ -46,48 +31,49 @@ export function createHearth(opts) {
46
31
  baseUrl: opts.baseUrl,
47
32
  realmId: opts.realmId,
48
33
  });
34
+ // Discovery and the JWKS are fetched on the first check and cached.
35
+ const verifier = new HearthClient({ issuerUrl: opts.issuerUrl, audience: opts.audience });
49
36
  let svCache = null;
50
37
  if (opts.sessionVersions?.enabled) {
51
38
  svCache = new SessionVersionCache(opts.baseUrl, opts.realmId, opts.sessionVersions);
52
39
  svCache.start();
53
40
  }
54
- function claims() {
55
- return safeDecode(opts.getToken());
56
- }
57
- /** Runs the sv check; throws on revoked or stale. No-op when sv absent. */
58
- function assertSv(c) {
59
- if (svCache !== null) {
60
- svCache.validateSv(extractSv(c), extractSid(c));
41
+ /**
42
+ * The verified claims of the current token, or `null` when there is no
43
+ * token or it does not verify. Runs the `sv` check on verified claims; that
44
+ * check throws on a revoked or stale session.
45
+ */
46
+ async function verifiedClaims() {
47
+ const token = await opts.getToken();
48
+ if (!token || typeof token !== "string")
49
+ return null;
50
+ let claims;
51
+ try {
52
+ claims = await verifier.verifyToken(token);
53
+ }
54
+ catch {
55
+ return null;
61
56
  }
57
+ svCache?.validateSv(extractSv(claims), extractSid(claims));
58
+ return claims;
62
59
  }
63
60
  return {
64
- hasPermission(permission) {
65
- const c = claims();
66
- if (c === null)
67
- return false;
68
- assertSv(c);
69
- return arrayContains(c.permissions, permission);
61
+ async hasPermission(permission) {
62
+ const c = await verifiedClaims();
63
+ return c !== null && arrayContains(c.get("permissions"), permission);
70
64
  },
71
- hasRole(role) {
72
- const c = claims();
73
- if (c === null)
74
- return false;
75
- assertSv(c);
76
- return arrayContains(c.roles, role);
65
+ async hasRole(role) {
66
+ const c = await verifiedClaims();
67
+ return c !== null && arrayContains(c.get("roles"), role);
77
68
  },
78
- inGroup(group) {
79
- const c = claims();
80
- if (c === null)
81
- return false;
82
- assertSv(c);
83
- return arrayContains(c.groups, group);
69
+ async inGroup(group) {
70
+ const c = await verifiedClaims();
71
+ return c !== null && arrayContains(c.get("groups"), group);
84
72
  },
85
- inOrg(org) {
86
- const c = claims();
87
- if (c === null)
88
- return false;
89
- assertSv(c);
90
- return typeof c.oid === "string" && c.oid === org;
73
+ async inOrg(org) {
74
+ const c = await verifiedClaims();
75
+ const oid = c?.get("oid");
76
+ return typeof oid === "string" && oid === org;
91
77
  },
92
78
  sessionVersionCacheAge() {
93
79
  return svCache?.age() ?? Number.POSITIVE_INFINITY;
@@ -96,10 +82,10 @@ export function createHearth(opts) {
96
82
  svCache?.stop();
97
83
  },
98
84
  client: {
99
- permissions() {
100
- const token = opts.getToken();
85
+ async permissions() {
86
+ const token = await opts.getToken();
101
87
  if (!token) {
102
- return Promise.reject(new Error("getToken() returned no token; cannot call permissions()"));
88
+ throw new Error("getToken() returned no token; cannot call permissions()");
103
89
  }
104
90
  return http.permissions(token);
105
91
  },
@@ -1 +1 @@
1
- {"version":3,"file":"hearth.js","sourceRoot":"","sources":["../src/hearth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hearth.js","sourceRoot":"","sources":["../src/hearth.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -2,7 +2,7 @@ export { HearthClient } from "./hearth-client.js";
2
2
  export { generateCodeVerifier, generateCodeChallenge, buildAuthorizationUrl, startLogin, } from "./pkce.js";
3
3
  export type { BuildAuthorizationUrlOptions, AuthorizationUrlResult, StartLoginOptions, StartLoginResult, } from "./pkce.js";
4
4
  export type { HearthClientConfig, OidcConfiguration } from "./hearth-client.js";
5
- export { JwksClient } from "./jwks-client.js";
5
+ export { DEFAULT_AUDIENCE, JwksClient } from "./jwks-client.js";
6
6
  export type { JwksClientConfig, VerifyOptions } from "./jwks-client.js";
7
7
  export { IntrospectionClient } from "./introspection-client.js";
8
8
  export type { IntrospectionClientConfig, IntrospectionResult } from "./introspection-client.js";
@@ -20,5 +20,5 @@ export { HearthContext, HearthProvider, useHasPermission, useHasRole, useInGroup
20
20
  export type { HearthProviderProps } from "./react.js";
21
21
  export type { AccessTokenAuthorizationMode, AuthorizeParams, AuthorizePermissionOptions, AuthorizeResponse, BootstrapResponse, CreateUserParams, ExchangeCodeOptions, JwksDocument, JsonWebKey, LoginBeginResult, MePermissionsResponse, OAuthClient, PageOptions, PageResponse, RegisterClientParams, Realm, SessionVersionConfig, StepUpAssertion, StepUpProof, SvDeltaEntry, SvDeltaResponse, SvSnapshotResponse, TokenExchangeParams, DeviceAuthorizationResponse, TokenResponse, UpdateRealmParams, UpdateUserParams, UserStatus, User, UserInfoResponse, WebAuthnAllowCredential, WebAuthnRegistrationBeginResponse, WebAuthnRegistrationCompleteRequest, WebAuthnRegistrationCompleteResponse, WebAuthnAuthenticationBeginResponse, WebAuthnAuthenticationCompleteRequest, } from "./types.js";
22
22
  export { SessionVersionCache } from "./session-version-cache.js";
23
- export { getAccessToken, getRefreshToken, getIdToken, isAuthenticated, clearTokens, createHearthAuth, } from "./browser-auth.js";
24
- export type { AuthConfig, HearthBrowserAuth } from "./browser-auth.js";
23
+ export { createHearthAuth } from "./browser-auth.js";
24
+ export type { AuthConfig, AuthStorage, HearthBrowserAuth, TokenStorage } from "./browser-auth.js";
package/dist/index.js CHANGED
@@ -3,7 +3,7 @@ export { HearthClient } from "./hearth-client.js";
3
3
  // PKCE browser utilities (RFC 7636).
4
4
  export { generateCodeVerifier, generateCodeChallenge, buildAuthorizationUrl, startLogin, } from "./pkce.js";
5
5
  // Lower-level primitives (JWKS and introspection).
6
- export { JwksClient } from "./jwks-client.js";
6
+ export { DEFAULT_AUDIENCE, JwksClient } from "./jwks-client.js";
7
7
  export { IntrospectionClient } from "./introspection-client.js";
8
8
  // Error types (spec §5).
9
9
  export { AuthorizationModeMismatchError, ConfigurationError, DiscoveryError, HearthSdkError, IntrospectionError, JWKSFetchError, OAuthFlowError, RequiredActionError, SessionVersionCacheStaleError, SessionVersionRevokedError, TokenAudienceError, TokenExpiredError, TokenInvalidError, TokenIssuerError, TokenNotYetValidError, TokenVerificationError, } from "./errors.js";
@@ -18,6 +18,6 @@ export { AdminClient } from "./admin.js";
18
18
  export { createHearth } from "./hearth.js";
19
19
  export { HearthContext, HearthProvider, useHasPermission, useHasRole, useInGroup, useInOrg, } from "./react.js";
20
20
  export { SessionVersionCache } from "./session-version-cache.js";
21
- // Browser auth: token store + PKCE login facade for SPAs.
22
- export { getAccessToken, getRefreshToken, getIdToken, isAuthenticated, clearTokens, createHearthAuth, } from "./browser-auth.js";
21
+ // Browser auth: PKCE login facade for SPAs; token getters live on the returned object.
22
+ export { createHearthAuth } from "./browser-auth.js";
23
23
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,qCAAqC;AACrC,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,UAAU,GACX,MAAM,WAAW,CAAC;AASnB,mDAAmD;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAGhE,yBAAyB;AACzB,OAAO,EACL,8BAA8B,EAC9B,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,6BAA6B,EAC7B,0BAA0B,EAC1B,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,aAAa,CAAC;AAErB,iEAAiE;AACjE,wFAAwF;AACxF,OAAO,EACL,uBAAuB,EACvB,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AAazB,wBAAwB;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,6DAA6D;AAC7D,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE3D,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAezC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EACL,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,QAAQ,GACT,MAAM,YAAY,CAAC;AAwCpB,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,0DAA0D;AAC1D,OAAO,EACL,cAAc,EACd,eAAe,EACf,UAAU,EACV,eAAe,EACf,WAAW,EACX,gBAAgB,GACjB,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,qCAAqC;AACrC,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,UAAU,GACX,MAAM,WAAW,CAAC;AASnB,mDAAmD;AACnD,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEhE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAGhE,yBAAyB;AACzB,OAAO,EACL,8BAA8B,EAC9B,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,6BAA6B,EAC7B,0BAA0B,EAC1B,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,aAAa,CAAC;AAErB,iEAAiE;AACjE,wFAAwF;AACxF,OAAO,EACL,uBAAuB,EACvB,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AAazB,wBAAwB;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,6DAA6D;AAC7D,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE3D,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAezC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EACL,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,QAAQ,GACT,MAAM,YAAY,CAAC;AAwCpB,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,uFAAuF;AACvF,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -4,9 +4,12 @@ import { Claims } from "./claims.js";
4
4
  export interface VerifyOptions {
5
5
  /** Expected `iss` claim. When provided, verification fails if the token's issuer differs. */
6
6
  issuer?: string;
7
- /** Expected `aud` claim(s). Skipped when absent. */
7
+ /**
8
+ * Expected `aud` claim(s) for this call. Overrides the client's configured
9
+ * `audience`; the check itself always runs.
10
+ */
8
11
  audience?: string | string[];
9
- /** Clock skew tolerance in seconds, applied to `exp` and `nbf`. Default: 5. */
12
+ /** Clock skew tolerance in seconds, applied to `exp`, `nbf` and `iat`. Default: 5. */
10
13
  clockSkewSeconds?: number;
11
14
  }
12
15
  /** Configuration for {@link JwksClient}. */
@@ -23,8 +26,11 @@ export interface JwksClientConfig {
23
26
  */
24
27
  issuer?: string;
25
28
  /**
26
- * Expected `aud` claim(s), pinned for every {@link JwksClient.verify} call
27
- * that does not override it. When neither is set the audience is not checked.
29
+ * Expected `aud` claim(s): the name of the API that verifies the token
30
+ * (RFC 9068 §4). Pinned for every {@link JwksClient.verify} call that does not
31
+ * override it. Default: {@link DEFAULT_AUDIENCE} (`"hearth"`), the audience
32
+ * Hearth mints when a client names no resource. An API registered as a
33
+ * protected resource sets its resource URI. The check is always on.
28
34
  */
29
35
  audience?: string | string[];
30
36
  /**
@@ -36,6 +42,11 @@ export interface JwksClientConfig {
36
42
  /** Timeout for outbound HTTP calls in milliseconds. Default: 10 000. */
37
43
  httpTimeout?: number;
38
44
  }
45
+ /**
46
+ * The audience Hearth puts in an access token when the client names no
47
+ * resource. Every verifier checks `aud` against it unless configured otherwise.
48
+ */
49
+ export declare const DEFAULT_AUDIENCE = "hearth";
39
50
  /**
40
51
  * JWKS-backed JWT verifier with key caching, automatic key rotation,
41
52
  * and full EdDSA / Ed25519 signature verification (spec §2).
@@ -47,7 +58,7 @@ export interface JwksClientConfig {
47
58
  export declare class JwksClient {
48
59
  private readonly jwksUri;
49
60
  readonly issuer: string | undefined;
50
- readonly audience: string | string[] | undefined;
61
+ readonly audience: string | string[];
51
62
  readonly ttl: number | undefined;
52
63
  readonly httpTimeout: number;
53
64
  /** Cached local key set and when it was fetched. */
@@ -57,17 +68,21 @@ export declare class JwksClient {
57
68
  /**
58
69
  * Verify a JWT using Ed25519/EdDSA JWKS-based local signature verification (spec §2).
59
70
  *
60
- * Executes all five spec §2 validation steps in order:
71
+ * Executes every validation step of the sdk-support-contract spec:
61
72
  * 1. Signature against cached JWKS — EdDSA only; RS256 and ES256 are refused.
62
73
  * 2. `exp` — rejects expired tokens.
63
74
  * 3. `iss` — always, against `options.issuer` or the client's configured
64
75
  * `issuer`. Throws {@link ConfigurationError} when neither is set.
65
- * 4. `aud` — when `options.audience` or the client's configured `audience` is set.
66
- * 5. `nbf` — when present, within clock skew tolerance.
76
+ * 4. `aud` — always, against `options.audience` or the client's configured
77
+ * `audience` (default `"hearth"`).
78
+ * 5. `iat` — not in the future, within clock skew tolerance.
79
+ * 6. `nbf` — when present, within clock skew tolerance.
67
80
  *
68
- * `jose` performs every check above; this method only maps its errors.
81
+ * `jose` performs every check above except the `iat` one; this method
82
+ * maps its errors.
69
83
  *
70
84
  * @throws {@link TokenExpiredError} when the token is expired.
85
+ * @throws {@link TokenNotYetValidError} when `nbf` or `iat` is in the future.
71
86
  * @throws {@link TokenInvalidError} when the signature or structure is invalid.
72
87
  * @throws {@link TokenIssuerError} when the issuer does not match.
73
88
  * @throws {@link TokenAudienceError} when the audience does not match.
@@ -1,6 +1,11 @@
1
1
  import { createLocalJWKSet, jwtVerify, errors as joseErrors } from "jose";
2
2
  import { Claims } from "./claims.js";
3
- import { ConfigurationError, JWKSFetchError, TokenExpiredError, TokenInvalidError, TokenIssuerError, TokenAudienceError, TokenNotYetValidError, } from "./errors.js";
3
+ import { ConfigurationError, JWKSFetchError, TokenExpiredError, TokenInvalidError, TokenIssuerError, TokenAudienceError, TokenNotYetValidError, TokenVerificationError, } from "./errors.js";
4
+ /**
5
+ * The audience Hearth puts in an access token when the client names no
6
+ * resource. Every verifier checks `aud` against it unless configured otherwise.
7
+ */
8
+ export const DEFAULT_AUDIENCE = "hearth";
4
9
  /**
5
10
  * JWKS-backed JWT verifier with key caching, automatic key rotation,
6
11
  * and full EdDSA / Ed25519 signature verification (spec §2).
@@ -20,7 +25,7 @@ export class JwksClient {
20
25
  constructor(config) {
21
26
  this.jwksUri = config.jwksUri;
22
27
  this.issuer = config.issuer;
23
- this.audience = config.audience;
28
+ this.audience = config.audience ?? DEFAULT_AUDIENCE;
24
29
  this.ttl = config.ttl;
25
30
  this.httpTimeout = config.httpTimeout ?? 10_000;
26
31
  }
@@ -40,17 +45,21 @@ export class JwksClient {
40
45
  /**
41
46
  * Verify a JWT using Ed25519/EdDSA JWKS-based local signature verification (spec §2).
42
47
  *
43
- * Executes all five spec §2 validation steps in order:
48
+ * Executes every validation step of the sdk-support-contract spec:
44
49
  * 1. Signature against cached JWKS — EdDSA only; RS256 and ES256 are refused.
45
50
  * 2. `exp` — rejects expired tokens.
46
51
  * 3. `iss` — always, against `options.issuer` or the client's configured
47
52
  * `issuer`. Throws {@link ConfigurationError} when neither is set.
48
- * 4. `aud` — when `options.audience` or the client's configured `audience` is set.
49
- * 5. `nbf` — when present, within clock skew tolerance.
53
+ * 4. `aud` — always, against `options.audience` or the client's configured
54
+ * `audience` (default `"hearth"`).
55
+ * 5. `iat` — not in the future, within clock skew tolerance.
56
+ * 6. `nbf` — when present, within clock skew tolerance.
50
57
  *
51
- * `jose` performs every check above; this method only maps its errors.
58
+ * `jose` performs every check above except the `iat` one; this method
59
+ * maps its errors.
52
60
  *
53
61
  * @throws {@link TokenExpiredError} when the token is expired.
62
+ * @throws {@link TokenNotYetValidError} when `nbf` or `iat` is in the future.
54
63
  * @throws {@link TokenInvalidError} when the signature or structure is invalid.
55
64
  * @throws {@link TokenIssuerError} when the issuer does not match.
56
65
  * @throws {@link TokenAudienceError} when the audience does not match.
@@ -70,6 +79,10 @@ export class JwksClient {
70
79
  "`iss` would accept a token minted by any issuer sharing this JWKS.");
71
80
  }
72
81
  const audience = options?.audience ?? this.audience;
82
+ if (audience === "" || (Array.isArray(audience) && audience.length === 0)) {
83
+ throw new ConfigurationError("JwksClient.verify requires an expected audience — leave `audience` unset " +
84
+ 'for the default "hearth", or set the API\'s resource URI.');
85
+ }
73
86
  let keySet = await this.getKeySet();
74
87
  const doVerify = async (ks) => {
75
88
  const { payload } = await jwtVerify(token, ks, {
@@ -83,6 +96,12 @@ export class JwksClient {
83
96
  requiredClaims: ["exp"],
84
97
  clockTolerance,
85
98
  });
99
+ // jose checks that `iat` is a number but not that it lies in the past.
100
+ // A token issued "later than now" (beyond the skew) is not yet valid.
101
+ if (typeof payload.iat === "number" &&
102
+ payload.iat > Math.floor(Date.now() / 1000) + clockTolerance) {
103
+ throw new TokenNotYetValidError(new Date(payload.iat * 1000));
104
+ }
86
105
  return new Claims(payload);
87
106
  };
88
107
  try {
@@ -107,6 +126,8 @@ export class JwksClient {
107
126
  * `issuer` and `audience` are the values the check actually used.
108
127
  */
109
128
  mapJoseError(err, issuer, audience) {
129
+ if (err instanceof TokenVerificationError)
130
+ throw err;
110
131
  if (err instanceof joseErrors.JWTExpired) {
111
132
  const exp = err.payload?.exp;
112
133
  throw new TokenExpiredError(exp ? new Date(exp * 1000) : new Date(0));
@@ -124,7 +145,7 @@ export class JwksClient {
124
145
  if (claim === "aud") {
125
146
  const raw = err.payload?.["aud"];
126
147
  const actual = Array.isArray(raw) ? raw : [String(raw ?? "")];
127
- const expected = Array.isArray(audience) ? (audience[0] ?? "") : (audience ?? "");
148
+ const expected = Array.isArray(audience) ? (audience[0] ?? "") : audience;
128
149
  throw new TokenAudienceError(expected, actual);
129
150
  }
130
151
  throw new TokenInvalidError(`JWT claim validation failed (${claim}): ${err.message}`);