@keycardai/oauth 0.17.0 → 0.18.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.
@@ -0,0 +1,41 @@
1
+ import { type AuthenticateOptions } from "./pkce.js";
2
+ import type { TokenResponse } from "./tokenExchange.js";
3
+ export interface ResolveIssuerFromChallengeOptions {
4
+ signal?: AbortSignal;
5
+ }
6
+ export interface ResolvedChallenge {
7
+ /** The authorization server issuer URL (first entry of `authorization_servers`). */
8
+ issuer: string;
9
+ /** The protected resource identifier from the metadata document, when present. */
10
+ resource?: string;
11
+ }
12
+ /**
13
+ * Resolve the authorization server issuer from a `WWW-Authenticate` challenge
14
+ * (RFC 9728).
15
+ *
16
+ * Parses the `resource_metadata` URL out of the header, fetches the protected
17
+ * resource metadata document, and returns the first entry of its
18
+ * `authorization_servers` array as the issuer, along with the document's
19
+ * `resource` identifier when present.
20
+ *
21
+ * Throws an `Error` when the header has no `resource_metadata` parameter, the
22
+ * metadata fetch fails, or the document is missing a valid
23
+ * `authorization_servers` array.
24
+ */
25
+ export declare function resolveIssuerFromChallenge(wwwAuthenticateHeader: string, options?: ResolveIssuerFromChallengeOptions): Promise<ResolvedChallenge>;
26
+ /**
27
+ * Full authorization-code-with-PKCE flow driven by a `WWW-Authenticate`
28
+ * challenge from a protected resource.
29
+ *
30
+ * Resolves the authorization server issuer from the challenge's
31
+ * `resource_metadata` document (RFC 9728) via `resolveIssuerFromChallenge`,
32
+ * then runs `authenticate()` against it. When the caller does not set
33
+ * `options.resource`, it defaults to the `resource` identifier from the
34
+ * metadata document, scoping the issued token's audience to that resource.
35
+ *
36
+ * **Requires Node.js.** Uses `node:http` and `node:child_process` via
37
+ * dynamic import. Importing this module is safe in any runtime; only
38
+ * *calling* `authenticateFromChallenge()` requires Node.js.
39
+ */
40
+ export declare function authenticateFromChallenge(wwwAuthenticateHeader: string, options: AuthenticateOptions): Promise<TokenResponse>;
41
+ //# sourceMappingURL=challenge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"challenge.d.ts","sourceRoot":"","sources":["../../src/challenge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,mBAAmB,EAAE,MAAM,WAAW,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAMxD,MAAM,WAAW,iCAAiC;IAChD,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,oFAAoF;IACpF,MAAM,EAAE,MAAM,CAAC;IACf,kFAAkF;IAClF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAmBD;;;;;;;;;;;;GAYG;AACH,wBAAsB,0BAA0B,CAC9C,qBAAqB,EAAE,MAAM,EAC7B,OAAO,GAAE,iCAAsC,GAC9C,OAAO,CAAC,iBAAiB,CAAC,CA6C5B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,yBAAyB,CAC7C,qBAAqB,EAAE,MAAM,EAC7B,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,aAAa,CAAC,CAMxB"}
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveIssuerFromChallenge = resolveIssuerFromChallenge;
4
+ exports.authenticateFromChallenge = authenticateFromChallenge;
5
+ const pkce_js_1 = require("./pkce.js");
6
+ /**
7
+ * Extract the `resource_metadata` parameter value from a `WWW-Authenticate`
8
+ * header (RFC 9728 §5.1). Handles quoted values alongside other challenge
9
+ * parameters (e.g. `realm`, `error`). Returns undefined when absent.
10
+ */
11
+ function extractResourceMetadataUrl(wwwAuthenticateHeader) {
12
+ // Quoted form: resource_metadata="https://..."
13
+ const quoted = /resource_metadata\s*=\s*"([^"]+)"/.exec(wwwAuthenticateHeader);
14
+ if (quoted) {
15
+ return quoted[1];
16
+ }
17
+ // Unquoted token form: resource_metadata=https://... (terminated by comma,
18
+ // whitespace, or end of header).
19
+ const unquoted = /resource_metadata\s*=\s*([^",\s]+)/.exec(wwwAuthenticateHeader);
20
+ return unquoted ? unquoted[1] : undefined;
21
+ }
22
+ /**
23
+ * Resolve the authorization server issuer from a `WWW-Authenticate` challenge
24
+ * (RFC 9728).
25
+ *
26
+ * Parses the `resource_metadata` URL out of the header, fetches the protected
27
+ * resource metadata document, and returns the first entry of its
28
+ * `authorization_servers` array as the issuer, along with the document's
29
+ * `resource` identifier when present.
30
+ *
31
+ * Throws an `Error` when the header has no `resource_metadata` parameter, the
32
+ * metadata fetch fails, or the document is missing a valid
33
+ * `authorization_servers` array.
34
+ */
35
+ async function resolveIssuerFromChallenge(wwwAuthenticateHeader, options = {}) {
36
+ const metadataUrl = extractResourceMetadataUrl(wwwAuthenticateHeader);
37
+ if (!metadataUrl) {
38
+ throw new Error("WWW-Authenticate header does not contain a resource_metadata parameter (RFC 9728)");
39
+ }
40
+ const response = await fetch(metadataUrl, { signal: options.signal });
41
+ if (!response.ok) {
42
+ throw new Error(`Failed to fetch protected resource metadata from "${metadataUrl}" (HTTP ${response.status})`);
43
+ }
44
+ let json;
45
+ try {
46
+ json = await response.json();
47
+ }
48
+ catch {
49
+ throw new Error(`Protected resource metadata at "${metadataUrl}" is not valid JSON`);
50
+ }
51
+ if (!json || typeof json !== "object" || Array.isArray(json)) {
52
+ throw new Error(`Protected resource metadata at "${metadataUrl}" is not a JSON object`);
53
+ }
54
+ const document = json;
55
+ const authorizationServers = document.authorization_servers;
56
+ if (!Array.isArray(authorizationServers) ||
57
+ authorizationServers.length === 0 ||
58
+ !authorizationServers.every((entry) => typeof entry === "string")) {
59
+ throw new Error(`Protected resource metadata at "${metadataUrl}" does not contain a non-empty authorization_servers array`);
60
+ }
61
+ return {
62
+ issuer: authorizationServers[0],
63
+ resource: typeof document.resource === "string" ? document.resource : undefined,
64
+ };
65
+ }
66
+ /**
67
+ * Full authorization-code-with-PKCE flow driven by a `WWW-Authenticate`
68
+ * challenge from a protected resource.
69
+ *
70
+ * Resolves the authorization server issuer from the challenge's
71
+ * `resource_metadata` document (RFC 9728) via `resolveIssuerFromChallenge`,
72
+ * then runs `authenticate()` against it. When the caller does not set
73
+ * `options.resource`, it defaults to the `resource` identifier from the
74
+ * metadata document, scoping the issued token's audience to that resource.
75
+ *
76
+ * **Requires Node.js.** Uses `node:http` and `node:child_process` via
77
+ * dynamic import. Importing this module is safe in any runtime; only
78
+ * *calling* `authenticateFromChallenge()` requires Node.js.
79
+ */
80
+ async function authenticateFromChallenge(wwwAuthenticateHeader, options) {
81
+ const { issuer, resource } = await resolveIssuerFromChallenge(wwwAuthenticateHeader);
82
+ return (0, pkce_js_1.authenticate)(issuer, {
83
+ ...options,
84
+ resource: options.resource ?? resource,
85
+ });
86
+ }
87
+ //# sourceMappingURL=challenge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"challenge.js","sourceRoot":"","sources":["../../src/challenge.ts"],"names":[],"mappings":";;AAgDA,gEAgDC;AAgBD,8DASC;AAzHD,uCAAmE;AAkBnE;;;;GAIG;AACH,SAAS,0BAA0B,CAAC,qBAA6B;IAC/D,+CAA+C;IAC/C,MAAM,MAAM,GAAG,mCAAmC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAC/E,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC;IACD,2EAA2E;IAC3E,iCAAiC;IACjC,MAAM,QAAQ,GAAG,oCAAoC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAClF,OAAO,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC5C,CAAC;AAED;;;;;;;;;;;;GAYG;AACI,KAAK,UAAU,0BAA0B,CAC9C,qBAA6B,EAC7B,UAA6C,EAAE;IAE/C,MAAM,WAAW,GAAG,0BAA0B,CAAC,qBAAqB,CAAC,CAAC;IACtE,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,mFAAmF,CACpF,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACtE,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,qDAAqD,WAAW,WAAW,QAAQ,CAAC,MAAM,GAAG,CAC9F,CAAC;IACJ,CAAC;IAED,IAAI,IAAa,CAAC;IAClB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAa,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,mCAAmC,WAAW,qBAAqB,CACpE,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7D,MAAM,IAAI,KAAK,CACb,mCAAmC,WAAW,wBAAwB,CACvE,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAG,IAA+B,CAAC;IAEjD,MAAM,oBAAoB,GAAG,QAAQ,CAAC,qBAAqB,CAAC;IAC5D,IACE,CAAC,KAAK,CAAC,OAAO,CAAC,oBAAoB,CAAC;QACpC,oBAAoB,CAAC,MAAM,KAAK,CAAC;QACjC,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,EAClF,CAAC;QACD,MAAM,IAAI,KAAK,CACb,mCAAmC,WAAW,4DAA4D,CAC3G,CAAC;IACJ,CAAC;IAED,OAAO;QACL,MAAM,EAAE,oBAAoB,CAAC,CAAC,CAAC;QAC/B,QAAQ,EAAE,OAAO,QAAQ,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;KAChF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;GAaG;AACI,KAAK,UAAU,yBAAyB,CAC7C,qBAA6B,EAC7B,OAA4B;IAE5B,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,0BAA0B,CAAC,qBAAqB,CAAC,CAAC;IACrF,OAAO,IAAA,sBAAY,EAAC,MAAM,EAAE;QAC1B,GAAG,OAAO;QACV,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,QAAQ;KACvC,CAAC,CAAC;AACL,CAAC"}
@@ -19,4 +19,6 @@ export { AccessContext, TokenVerifier, ClientSecret } from "./server/index.js";
19
19
  export type { ErrorDetail, AccessContextStatus, AccessToken, TokenVerifierOptions, ClientSecretCredentials, } from "./server/index.js";
20
20
  export { generateCodeVerifier, generateCodeChallenge, generatePkcePair, exchangeAuthorizationCode, buildAuthorizeUrl, authenticate, } from "./pkce.js";
21
21
  export type { Pkce, ExchangeAuthorizationCodeOptions, AuthorizeUrlParams, AuthenticateOptions, } from "./pkce.js";
22
+ export { resolveIssuerFromChallenge, authenticateFromChallenge } from "./challenge.js";
23
+ export type { ResolveIssuerFromChallengeOptions, ResolvedChallenge, } from "./challenge.js";
22
24
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAC3G,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,gCAAgC,EAAE,MAAM,gBAAgB,CAAC;AAClE,YAAY,EAAE,gCAAgC,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,EACL,SAAS,EACT,eAAe,EACf,iBAAiB,EACjB,UAAU,EACV,iBAAiB,EACjB,sBAAsB,EACtB,mBAAmB,EACnB,8BAA8B,EAC9B,SAAS,EACT,kBAAkB,EAClB,sBAAsB,EACtB,cAAc,EACd,oBAAoB,GACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpE,YAAY,EACV,oBAAoB,EACpB,aAAa,EACb,0BAA0B,EAC1B,eAAe,EACf,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,YAAY,EACV,wBAAwB,EACxB,8BAA8B,EAC9B,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,YAAY,EACV,yBAAyB,EACzB,0BAA0B,EAC1B,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC/E,YAAY,EACV,WAAW,EACX,mBAAmB,EACnB,WAAW,EACX,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,gBAAgB,EAChB,yBAAyB,EACzB,iBAAiB,EACjB,YAAY,GACb,MAAM,WAAW,CAAC;AACnB,YAAY,EACV,IAAI,EACJ,gCAAgC,EAChC,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAC3G,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,gCAAgC,EAAE,MAAM,gBAAgB,CAAC;AAClE,YAAY,EAAE,gCAAgC,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,EACL,SAAS,EACT,eAAe,EACf,iBAAiB,EACjB,UAAU,EACV,iBAAiB,EACjB,sBAAsB,EACtB,mBAAmB,EACnB,8BAA8B,EAC9B,SAAS,EACT,kBAAkB,EAClB,sBAAsB,EACtB,cAAc,EACd,oBAAoB,GACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpE,YAAY,EACV,oBAAoB,EACpB,aAAa,EACb,0BAA0B,EAC1B,eAAe,EACf,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,YAAY,EACV,wBAAwB,EACxB,8BAA8B,EAC9B,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,YAAY,EACV,yBAAyB,EACzB,0BAA0B,EAC1B,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC/E,YAAY,EACV,WAAW,EACX,mBAAmB,EACnB,WAAW,EACX,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,gBAAgB,EAChB,yBAAyB,EACzB,iBAAiB,EACjB,YAAY,GACb,MAAM,WAAW,CAAC;AACnB,YAAY,EACV,IAAI,EACJ,gCAAgC,EAChC,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,0BAA0B,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AACvF,YAAY,EACV,iCAAiC,EACjC,iBAAiB,GAClB,MAAM,gBAAgB,CAAC"}
package/dist/cjs/index.js CHANGED
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.authenticate = exports.buildAuthorizeUrl = exports.exchangeAuthorizationCode = exports.generatePkcePair = exports.generateCodeChallenge = exports.generateCodeVerifier = exports.ClientSecret = exports.TokenVerifier = exports.AccessContext = exports.registerClient = exports.ClientCredentialsClient = exports.TokenType = exports.TokenExchangeClient = exports.buildSubstituteUserToken = exports.JWTVerifier = exports.JWTSigner = exports.JWKSKeyNotFoundError = exports.JWKSFetchError = exports.JWKSUriValidationError = exports.JWKSDiscoveryError = exports.JWKSError = exports.AuthProviderConfigurationError = exports.ResourceAccessError = exports.InsufficientScopeError = exports.InvalidTokenError = exports.OAuthError = exports.UnauthorizedError = exports.BadRequestError = exports.HTTPError = exports.fetchAuthorizationServerMetadata = exports.base64url = exports.JWKSOAuthKeyring = void 0;
6
+ exports.authenticateFromChallenge = exports.resolveIssuerFromChallenge = exports.authenticate = exports.buildAuthorizeUrl = exports.exchangeAuthorizationCode = exports.generatePkcePair = exports.generateCodeChallenge = exports.generateCodeVerifier = exports.ClientSecret = exports.TokenVerifier = exports.AccessContext = exports.registerClient = exports.ClientCredentialsClient = exports.TokenType = exports.TokenExchangeClient = exports.buildSubstituteUserToken = exports.JWTVerifier = exports.JWTSigner = exports.JWKSKeyNotFoundError = exports.JWKSFetchError = exports.JWKSUriValidationError = exports.JWKSDiscoveryError = exports.JWKSError = exports.AuthProviderConfigurationError = exports.ResourceAccessError = exports.InsufficientScopeError = exports.InvalidTokenError = exports.OAuthError = exports.UnauthorizedError = exports.BadRequestError = exports.HTTPError = exports.fetchAuthorizationServerMetadata = exports.base64url = exports.JWKSOAuthKeyring = void 0;
7
7
  var keyring_js_1 = require("./keyring.js");
8
8
  Object.defineProperty(exports, "JWKSOAuthKeyring", { enumerable: true, get: function () { return keyring_js_1.JWKSOAuthKeyring; } });
9
9
  var base64url_js_1 = require("./base64url.js");
@@ -48,4 +48,7 @@ Object.defineProperty(exports, "generatePkcePair", { enumerable: true, get: func
48
48
  Object.defineProperty(exports, "exchangeAuthorizationCode", { enumerable: true, get: function () { return pkce_js_1.exchangeAuthorizationCode; } });
49
49
  Object.defineProperty(exports, "buildAuthorizeUrl", { enumerable: true, get: function () { return pkce_js_1.buildAuthorizeUrl; } });
50
50
  Object.defineProperty(exports, "authenticate", { enumerable: true, get: function () { return pkce_js_1.authenticate; } });
51
+ var challenge_js_1 = require("./challenge.js");
52
+ Object.defineProperty(exports, "resolveIssuerFromChallenge", { enumerable: true, get: function () { return challenge_js_1.resolveIssuerFromChallenge; } });
53
+ Object.defineProperty(exports, "authenticateFromChallenge", { enumerable: true, get: function () { return challenge_js_1.authenticateFromChallenge; } });
51
54
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;AACA,2CAAgD;AAAvC,8GAAA,gBAAgB,OAAA;AACzB,+CAAsD;AAA7C,0HAAA,OAAO,OAAa;AAC7B,+CAAkE;AAAzD,gIAAA,gCAAgC,OAAA;AAEzC,yCAcqB;AAbnB,sGAAA,SAAS,OAAA;AACT,4GAAA,eAAe,OAAA;AACf,8GAAA,iBAAiB,OAAA;AACjB,uGAAA,UAAU,OAAA;AACV,8GAAA,iBAAiB,OAAA;AACjB,mHAAA,sBAAsB,OAAA;AACtB,gHAAA,mBAAmB,OAAA;AACnB,2HAAA,8BAA8B,OAAA;AAC9B,sGAAA,SAAS,OAAA;AACT,+GAAA,kBAAkB,OAAA;AAClB,mHAAA,sBAAsB,OAAA;AACtB,2GAAA,cAAc,OAAA;AACd,iHAAA,oBAAoB,OAAA;AAEtB,6CAA4C;AAAnC,sGAAA,SAAS,OAAA;AAElB,iDAAgD;AAAvC,0GAAA,WAAW,OAAA;AACpB,6DAAmE;AAA1D,6HAAA,wBAAwB,OAAA;AACjC,uDAAoE;AAA3D,uHAAA,mBAAmB,OAAA;AAAE,6GAAA,SAAS,OAAA;AAQvC,+DAAiE;AAAxD,+HAAA,uBAAuB,OAAA;AAOhC,qDAAmD;AAA1C,iHAAA,cAAc,OAAA;AAMvB,8CAA+E;AAAtE,yGAAA,aAAa,OAAA;AAAE,yGAAA,aAAa,OAAA;AAAE,wGAAA,YAAY,OAAA;AAQnD,qCAOmB;AANjB,+GAAA,oBAAoB,OAAA;AACpB,gHAAA,qBAAqB,OAAA;AACrB,2GAAA,gBAAgB,OAAA;AAChB,oHAAA,yBAAyB,OAAA;AACzB,4GAAA,iBAAiB,OAAA;AACjB,uGAAA,YAAY,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;AACA,2CAAgD;AAAvC,8GAAA,gBAAgB,OAAA;AACzB,+CAAsD;AAA7C,0HAAA,OAAO,OAAa;AAC7B,+CAAkE;AAAzD,gIAAA,gCAAgC,OAAA;AAEzC,yCAcqB;AAbnB,sGAAA,SAAS,OAAA;AACT,4GAAA,eAAe,OAAA;AACf,8GAAA,iBAAiB,OAAA;AACjB,uGAAA,UAAU,OAAA;AACV,8GAAA,iBAAiB,OAAA;AACjB,mHAAA,sBAAsB,OAAA;AACtB,gHAAA,mBAAmB,OAAA;AACnB,2HAAA,8BAA8B,OAAA;AAC9B,sGAAA,SAAS,OAAA;AACT,+GAAA,kBAAkB,OAAA;AAClB,mHAAA,sBAAsB,OAAA;AACtB,2GAAA,cAAc,OAAA;AACd,iHAAA,oBAAoB,OAAA;AAEtB,6CAA4C;AAAnC,sGAAA,SAAS,OAAA;AAElB,iDAAgD;AAAvC,0GAAA,WAAW,OAAA;AACpB,6DAAmE;AAA1D,6HAAA,wBAAwB,OAAA;AACjC,uDAAoE;AAA3D,uHAAA,mBAAmB,OAAA;AAAE,6GAAA,SAAS,OAAA;AAQvC,+DAAiE;AAAxD,+HAAA,uBAAuB,OAAA;AAOhC,qDAAmD;AAA1C,iHAAA,cAAc,OAAA;AAMvB,8CAA+E;AAAtE,yGAAA,aAAa,OAAA;AAAE,yGAAA,aAAa,OAAA;AAAE,wGAAA,YAAY,OAAA;AAQnD,qCAOmB;AANjB,+GAAA,oBAAoB,OAAA;AACpB,gHAAA,qBAAqB,OAAA;AACrB,2GAAA,gBAAgB,OAAA;AAChB,oHAAA,yBAAyB,OAAA;AACzB,4GAAA,iBAAiB,OAAA;AACjB,uGAAA,YAAY,OAAA;AAQd,+CAAuF;AAA9E,0HAAA,0BAA0B,OAAA;AAAE,yHAAA,yBAAyB,OAAA"}
@@ -0,0 +1,41 @@
1
+ import { type AuthenticateOptions } from "./pkce.js";
2
+ import type { TokenResponse } from "./tokenExchange.js";
3
+ export interface ResolveIssuerFromChallengeOptions {
4
+ signal?: AbortSignal;
5
+ }
6
+ export interface ResolvedChallenge {
7
+ /** The authorization server issuer URL (first entry of `authorization_servers`). */
8
+ issuer: string;
9
+ /** The protected resource identifier from the metadata document, when present. */
10
+ resource?: string;
11
+ }
12
+ /**
13
+ * Resolve the authorization server issuer from a `WWW-Authenticate` challenge
14
+ * (RFC 9728).
15
+ *
16
+ * Parses the `resource_metadata` URL out of the header, fetches the protected
17
+ * resource metadata document, and returns the first entry of its
18
+ * `authorization_servers` array as the issuer, along with the document's
19
+ * `resource` identifier when present.
20
+ *
21
+ * Throws an `Error` when the header has no `resource_metadata` parameter, the
22
+ * metadata fetch fails, or the document is missing a valid
23
+ * `authorization_servers` array.
24
+ */
25
+ export declare function resolveIssuerFromChallenge(wwwAuthenticateHeader: string, options?: ResolveIssuerFromChallengeOptions): Promise<ResolvedChallenge>;
26
+ /**
27
+ * Full authorization-code-with-PKCE flow driven by a `WWW-Authenticate`
28
+ * challenge from a protected resource.
29
+ *
30
+ * Resolves the authorization server issuer from the challenge's
31
+ * `resource_metadata` document (RFC 9728) via `resolveIssuerFromChallenge`,
32
+ * then runs `authenticate()` against it. When the caller does not set
33
+ * `options.resource`, it defaults to the `resource` identifier from the
34
+ * metadata document, scoping the issued token's audience to that resource.
35
+ *
36
+ * **Requires Node.js.** Uses `node:http` and `node:child_process` via
37
+ * dynamic import. Importing this module is safe in any runtime; only
38
+ * *calling* `authenticateFromChallenge()` requires Node.js.
39
+ */
40
+ export declare function authenticateFromChallenge(wwwAuthenticateHeader: string, options: AuthenticateOptions): Promise<TokenResponse>;
41
+ //# sourceMappingURL=challenge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"challenge.d.ts","sourceRoot":"","sources":["../../src/challenge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,mBAAmB,EAAE,MAAM,WAAW,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAMxD,MAAM,WAAW,iCAAiC;IAChD,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,oFAAoF;IACpF,MAAM,EAAE,MAAM,CAAC;IACf,kFAAkF;IAClF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAmBD;;;;;;;;;;;;GAYG;AACH,wBAAsB,0BAA0B,CAC9C,qBAAqB,EAAE,MAAM,EAC7B,OAAO,GAAE,iCAAsC,GAC9C,OAAO,CAAC,iBAAiB,CAAC,CA6C5B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,yBAAyB,CAC7C,qBAAqB,EAAE,MAAM,EAC7B,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,aAAa,CAAC,CAMxB"}
@@ -0,0 +1,83 @@
1
+ import { authenticate } from "./pkce.js";
2
+ /**
3
+ * Extract the `resource_metadata` parameter value from a `WWW-Authenticate`
4
+ * header (RFC 9728 §5.1). Handles quoted values alongside other challenge
5
+ * parameters (e.g. `realm`, `error`). Returns undefined when absent.
6
+ */
7
+ function extractResourceMetadataUrl(wwwAuthenticateHeader) {
8
+ // Quoted form: resource_metadata="https://..."
9
+ const quoted = /resource_metadata\s*=\s*"([^"]+)"/.exec(wwwAuthenticateHeader);
10
+ if (quoted) {
11
+ return quoted[1];
12
+ }
13
+ // Unquoted token form: resource_metadata=https://... (terminated by comma,
14
+ // whitespace, or end of header).
15
+ const unquoted = /resource_metadata\s*=\s*([^",\s]+)/.exec(wwwAuthenticateHeader);
16
+ return unquoted ? unquoted[1] : undefined;
17
+ }
18
+ /**
19
+ * Resolve the authorization server issuer from a `WWW-Authenticate` challenge
20
+ * (RFC 9728).
21
+ *
22
+ * Parses the `resource_metadata` URL out of the header, fetches the protected
23
+ * resource metadata document, and returns the first entry of its
24
+ * `authorization_servers` array as the issuer, along with the document's
25
+ * `resource` identifier when present.
26
+ *
27
+ * Throws an `Error` when the header has no `resource_metadata` parameter, the
28
+ * metadata fetch fails, or the document is missing a valid
29
+ * `authorization_servers` array.
30
+ */
31
+ export async function resolveIssuerFromChallenge(wwwAuthenticateHeader, options = {}) {
32
+ const metadataUrl = extractResourceMetadataUrl(wwwAuthenticateHeader);
33
+ if (!metadataUrl) {
34
+ throw new Error("WWW-Authenticate header does not contain a resource_metadata parameter (RFC 9728)");
35
+ }
36
+ const response = await fetch(metadataUrl, { signal: options.signal });
37
+ if (!response.ok) {
38
+ throw new Error(`Failed to fetch protected resource metadata from "${metadataUrl}" (HTTP ${response.status})`);
39
+ }
40
+ let json;
41
+ try {
42
+ json = await response.json();
43
+ }
44
+ catch {
45
+ throw new Error(`Protected resource metadata at "${metadataUrl}" is not valid JSON`);
46
+ }
47
+ if (!json || typeof json !== "object" || Array.isArray(json)) {
48
+ throw new Error(`Protected resource metadata at "${metadataUrl}" is not a JSON object`);
49
+ }
50
+ const document = json;
51
+ const authorizationServers = document.authorization_servers;
52
+ if (!Array.isArray(authorizationServers) ||
53
+ authorizationServers.length === 0 ||
54
+ !authorizationServers.every((entry) => typeof entry === "string")) {
55
+ throw new Error(`Protected resource metadata at "${metadataUrl}" does not contain a non-empty authorization_servers array`);
56
+ }
57
+ return {
58
+ issuer: authorizationServers[0],
59
+ resource: typeof document.resource === "string" ? document.resource : undefined,
60
+ };
61
+ }
62
+ /**
63
+ * Full authorization-code-with-PKCE flow driven by a `WWW-Authenticate`
64
+ * challenge from a protected resource.
65
+ *
66
+ * Resolves the authorization server issuer from the challenge's
67
+ * `resource_metadata` document (RFC 9728) via `resolveIssuerFromChallenge`,
68
+ * then runs `authenticate()` against it. When the caller does not set
69
+ * `options.resource`, it defaults to the `resource` identifier from the
70
+ * metadata document, scoping the issued token's audience to that resource.
71
+ *
72
+ * **Requires Node.js.** Uses `node:http` and `node:child_process` via
73
+ * dynamic import. Importing this module is safe in any runtime; only
74
+ * *calling* `authenticateFromChallenge()` requires Node.js.
75
+ */
76
+ export async function authenticateFromChallenge(wwwAuthenticateHeader, options) {
77
+ const { issuer, resource } = await resolveIssuerFromChallenge(wwwAuthenticateHeader);
78
+ return authenticate(issuer, {
79
+ ...options,
80
+ resource: options.resource ?? resource,
81
+ });
82
+ }
83
+ //# sourceMappingURL=challenge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"challenge.js","sourceRoot":"","sources":["../../src/challenge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAA4B,MAAM,WAAW,CAAC;AAkBnE;;;;GAIG;AACH,SAAS,0BAA0B,CAAC,qBAA6B;IAC/D,+CAA+C;IAC/C,MAAM,MAAM,GAAG,mCAAmC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAC/E,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC;IACD,2EAA2E;IAC3E,iCAAiC;IACjC,MAAM,QAAQ,GAAG,oCAAoC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAClF,OAAO,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC5C,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,qBAA6B,EAC7B,UAA6C,EAAE;IAE/C,MAAM,WAAW,GAAG,0BAA0B,CAAC,qBAAqB,CAAC,CAAC;IACtE,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,mFAAmF,CACpF,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACtE,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,qDAAqD,WAAW,WAAW,QAAQ,CAAC,MAAM,GAAG,CAC9F,CAAC;IACJ,CAAC;IAED,IAAI,IAAa,CAAC;IAClB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAa,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,mCAAmC,WAAW,qBAAqB,CACpE,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7D,MAAM,IAAI,KAAK,CACb,mCAAmC,WAAW,wBAAwB,CACvE,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAG,IAA+B,CAAC;IAEjD,MAAM,oBAAoB,GAAG,QAAQ,CAAC,qBAAqB,CAAC;IAC5D,IACE,CAAC,KAAK,CAAC,OAAO,CAAC,oBAAoB,CAAC;QACpC,oBAAoB,CAAC,MAAM,KAAK,CAAC;QACjC,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,EAClF,CAAC;QACD,MAAM,IAAI,KAAK,CACb,mCAAmC,WAAW,4DAA4D,CAC3G,CAAC;IACJ,CAAC;IAED,OAAO;QACL,MAAM,EAAE,oBAAoB,CAAC,CAAC,CAAC;QAC/B,QAAQ,EAAE,OAAO,QAAQ,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;KAChF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,qBAA6B,EAC7B,OAA4B;IAE5B,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,0BAA0B,CAAC,qBAAqB,CAAC,CAAC;IACrF,OAAO,YAAY,CAAC,MAAM,EAAE;QAC1B,GAAG,OAAO;QACV,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,QAAQ;KACvC,CAAC,CAAC;AACL,CAAC"}
@@ -19,4 +19,6 @@ export { AccessContext, TokenVerifier, ClientSecret } from "./server/index.js";
19
19
  export type { ErrorDetail, AccessContextStatus, AccessToken, TokenVerifierOptions, ClientSecretCredentials, } from "./server/index.js";
20
20
  export { generateCodeVerifier, generateCodeChallenge, generatePkcePair, exchangeAuthorizationCode, buildAuthorizeUrl, authenticate, } from "./pkce.js";
21
21
  export type { Pkce, ExchangeAuthorizationCodeOptions, AuthorizeUrlParams, AuthenticateOptions, } from "./pkce.js";
22
+ export { resolveIssuerFromChallenge, authenticateFromChallenge } from "./challenge.js";
23
+ export type { ResolveIssuerFromChallengeOptions, ResolvedChallenge, } from "./challenge.js";
22
24
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAC3G,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,gCAAgC,EAAE,MAAM,gBAAgB,CAAC;AAClE,YAAY,EAAE,gCAAgC,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,EACL,SAAS,EACT,eAAe,EACf,iBAAiB,EACjB,UAAU,EACV,iBAAiB,EACjB,sBAAsB,EACtB,mBAAmB,EACnB,8BAA8B,EAC9B,SAAS,EACT,kBAAkB,EAClB,sBAAsB,EACtB,cAAc,EACd,oBAAoB,GACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpE,YAAY,EACV,oBAAoB,EACpB,aAAa,EACb,0BAA0B,EAC1B,eAAe,EACf,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,YAAY,EACV,wBAAwB,EACxB,8BAA8B,EAC9B,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,YAAY,EACV,yBAAyB,EACzB,0BAA0B,EAC1B,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC/E,YAAY,EACV,WAAW,EACX,mBAAmB,EACnB,WAAW,EACX,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,gBAAgB,EAChB,yBAAyB,EACzB,iBAAiB,EACjB,YAAY,GACb,MAAM,WAAW,CAAC;AACnB,YAAY,EACV,IAAI,EACJ,gCAAgC,EAChC,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAC3G,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,gCAAgC,EAAE,MAAM,gBAAgB,CAAC;AAClE,YAAY,EAAE,gCAAgC,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,EACL,SAAS,EACT,eAAe,EACf,iBAAiB,EACjB,UAAU,EACV,iBAAiB,EACjB,sBAAsB,EACtB,mBAAmB,EACnB,8BAA8B,EAC9B,SAAS,EACT,kBAAkB,EAClB,sBAAsB,EACtB,cAAc,EACd,oBAAoB,GACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpE,YAAY,EACV,oBAAoB,EACpB,aAAa,EACb,0BAA0B,EAC1B,eAAe,EACf,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,YAAY,EACV,wBAAwB,EACxB,8BAA8B,EAC9B,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,YAAY,EACV,yBAAyB,EACzB,0BAA0B,EAC1B,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC/E,YAAY,EACV,WAAW,EACX,mBAAmB,EACnB,WAAW,EACX,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,gBAAgB,EAChB,yBAAyB,EACzB,iBAAiB,EACjB,YAAY,GACb,MAAM,WAAW,CAAC;AACnB,YAAY,EACV,IAAI,EACJ,gCAAgC,EAChC,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,0BAA0B,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AACvF,YAAY,EACV,iCAAiC,EACjC,iBAAiB,GAClB,MAAM,gBAAgB,CAAC"}
package/dist/esm/index.js CHANGED
@@ -10,4 +10,5 @@ export { ClientCredentialsClient } from "./clientCredentials.js";
10
10
  export { registerClient } from "./registration.js";
11
11
  export { AccessContext, TokenVerifier, ClientSecret } from "./server/index.js";
12
12
  export { generateCodeVerifier, generateCodeChallenge, generatePkcePair, exchangeAuthorizationCode, buildAuthorizeUrl, authenticate, } from "./pkce.js";
13
+ export { resolveIssuerFromChallenge, authenticateFromChallenge } from "./challenge.js";
13
14
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,gCAAgC,EAAE,MAAM,gBAAgB,CAAC;AAElE,OAAO,EACL,SAAS,EACT,eAAe,EACf,iBAAiB,EACjB,UAAU,EACV,iBAAiB,EACjB,sBAAsB,EACtB,mBAAmB,EACnB,8BAA8B,EAC9B,SAAS,EACT,kBAAkB,EAClB,sBAAsB,EACtB,cAAc,EACd,oBAAoB,GACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAQpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAOjE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAMnD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAQ/E,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,gBAAgB,EAChB,yBAAyB,EACzB,iBAAiB,EACjB,YAAY,GACb,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,gCAAgC,EAAE,MAAM,gBAAgB,CAAC;AAElE,OAAO,EACL,SAAS,EACT,eAAe,EACf,iBAAiB,EACjB,UAAU,EACV,iBAAiB,EACjB,sBAAsB,EACtB,mBAAmB,EACnB,8BAA8B,EAC9B,SAAS,EACT,kBAAkB,EAClB,sBAAsB,EACtB,cAAc,EACd,oBAAoB,GACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAQpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAOjE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAMnD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAQ/E,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,gBAAgB,EAChB,yBAAyB,EACzB,iBAAiB,EACjB,YAAY,GACb,MAAM,WAAW,CAAC;AAOnB,OAAO,EAAE,0BAA0B,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@keycardai/oauth",
3
- "version": "0.17.0",
3
+ "version": "0.18.0",
4
4
  "description": "[Preview] OAuth 2.0 primitives for Keycard: JWKS keyring, JWT signing/verification, server-tier token verifier, AccessContext, ClientSecret credentials, and impersonation via RFC 8693 token exchange",
5
5
  "license": "MIT",
6
6
  "repository": {