@frontmcp/auth 1.9.1-rc.3 → 1.9.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/authorities/authorities.context.d.ts.map +1 -1
- package/authorities/authorities.evaluator.d.ts.map +1 -1
- package/context/frontmcp-auth-context.factory.d.ts +7 -5
- package/context/frontmcp-auth-context.factory.d.ts.map +1 -1
- package/context/frontmcp-auth-context.impl.d.ts +2 -1
- package/context/frontmcp-auth-context.impl.d.ts.map +1 -1
- package/detection/auth-provider-detection.d.ts +2 -0
- package/detection/auth-provider-detection.d.ts.map +1 -1
- package/esm/index.mjs +77 -13
- package/esm/package.json +5 -5
- package/fetch/fetch-credential-middleware.d.ts +11 -1
- package/fetch/fetch-credential-middleware.d.ts.map +1 -1
- package/fetch/index.d.ts +2 -2
- package/fetch/index.d.ts.map +1 -1
- package/index.d.ts +3 -3
- package/index.d.ts.map +1 -1
- package/index.js +79 -13
- package/jwks/jwks.service.d.ts +2 -1
- package/jwks/jwks.service.d.ts.map +1 -1
- package/package.json +5 -5
- package/session/utils/auth-token.utils.d.ts.map +1 -1
- package/utils/index.d.ts +1 -0
- package/utils/index.d.ts.map +1 -1
- package/utils/token-scopes.utils.d.ts +11 -0
- package/utils/token-scopes.utils.d.ts.map +1 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authorities.context.d.ts","sourceRoot":"","sources":["../../src/authorities/authorities.context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"authorities.context.d.ts","sourceRoot":"","sources":["../../src/authorities/authorities.context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,KAAK,EAAE,4BAA4B,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE9F;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAelF;AA0BD;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,YAAY,CAAC,KAAK;IAClE,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC,CAAC;AAEF;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;IAC1F,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,SAAS,GAAG,WAAW,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAI9G;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAExD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAGxF;AAQD;;GAEG;AACH,MAAM,WAAW,gCAAgC;IAC/C,aAAa,CAAC,EAAE,wBAAwB,CAAC;IACzC,cAAc,CAAC,EAAE,gBAAgB,CAAC;IAClC,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAC7C;AAED;;GAEG;AACH,qBAAa,yBAAyB;IACpC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAuC;IACrE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA+B;IAC9D,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAuB;gBAEhD,OAAO,GAAE,gCAAqC;IAM1D;;OAEG;IACH,KAAK,CACH,QAAQ,EAAE,OAAO,CAAC,YAAY,CAAC,EAC/B,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACnC,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAc,GACxC,4BAA4B;CAoEhC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authorities.evaluator.d.ts","sourceRoot":"","sources":["../../src/authorities/authorities.evaluator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAEV,UAAU,EACV,4BAA4B,EAC5B,iBAAiB,EACjB,qBAAqB,EACrB,eAAe,EACf,WAAW,EACX,aAAa,EACd,MAAM,qBAAqB,CAAC;AAM7B;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,EAAE,4BAA4B,GAAG,iBAAiB,CA4B/G;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,qBAAqB,EAC7B,GAAG,EAAE,4BAA4B,GAChC,iBAAiB,CA4BnB;
|
|
1
|
+
{"version":3,"file":"authorities.evaluator.d.ts","sourceRoot":"","sources":["../../src/authorities/authorities.evaluator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAEV,UAAU,EACV,4BAA4B,EAC5B,iBAAiB,EACjB,qBAAqB,EACrB,eAAe,EACf,WAAW,EACX,aAAa,EACd,MAAM,qBAAqB,CAAC;AAM7B;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,EAAE,4BAA4B,GAAG,iBAAiB,CA4B/G;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,qBAAqB,EAC7B,GAAG,EAAE,4BAA4B,GAChC,iBAAiB,CA4BnB;AAqGD;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,4BAA4B,GAAG,iBAAiB,CAsCrG;AAMD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,4BAA4B,GAAG,MAAM,GAAG,SAAS,CAc3G;AAgDD;;;GAGG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,WAAW,GAAG,WAAW,EAAE,EACnC,GAAG,EAAE,4BAA4B,GAChC,OAAO,CAAC,iBAAiB,CAAC,CAS5B"}
|
|
@@ -4,9 +4,10 @@
|
|
|
4
4
|
* This is the recommended entry point — prefer `buildAuthContext()` over
|
|
5
5
|
* directly constructing `FrontMcpAuthContextImpl`.
|
|
6
6
|
*/
|
|
7
|
-
import type
|
|
8
|
-
import
|
|
9
|
-
import type
|
|
7
|
+
import { type ClaimsResolverFn } from '../authorities/authorities.context';
|
|
8
|
+
import { type AuthoritiesClaimsMapping } from '../authorities/authorities.profiles';
|
|
9
|
+
import { type AuthContextPipe, type FrontMcpAuthContext } from './frontmcp-auth-context';
|
|
10
|
+
import { type AuthContextSourceInfo } from './frontmcp-auth-context.impl';
|
|
10
11
|
/**
|
|
11
12
|
* Build a {@link FrontMcpAuthContext} from raw auth information.
|
|
12
13
|
*
|
|
@@ -17,6 +18,7 @@ import type { AuthContextSourceInfo } from './frontmcp-auth-context.impl';
|
|
|
17
18
|
* @param authInfo - Raw auth info (e.g., from MCP SDK AuthInfo, JWT payload, etc.)
|
|
18
19
|
* @param claimsMapping - Optional IdP-specific claims mapping (Keycloak, Auth0, Okta, etc.)
|
|
19
20
|
* @param pipes - Optional pipe functions that extract custom fields from claims
|
|
21
|
+
* @param claimsResolver - Optional resolver that decides the roles, permissions and claims (it wins over claimsMapping)
|
|
20
22
|
* @returns A frozen, immutable FrontMcpAuthContext instance (with custom extensions if pipes provided)
|
|
21
23
|
*
|
|
22
24
|
* @example
|
|
@@ -34,6 +36,6 @@ import type { AuthContextSourceInfo } from './frontmcp-auth-context.impl';
|
|
|
34
36
|
* ]);
|
|
35
37
|
* ```
|
|
36
38
|
*/
|
|
37
|
-
export declare function buildAuthContext(authInfo: AuthContextSourceInfo, claimsMapping?: AuthoritiesClaimsMapping): FrontMcpAuthContext;
|
|
38
|
-
export declare function buildAuthContext(authInfo: AuthContextSourceInfo, claimsMapping: AuthoritiesClaimsMapping | undefined, pipes: AuthContextPipe[]): Promise<FrontMcpAuthContext>;
|
|
39
|
+
export declare function buildAuthContext(authInfo: AuthContextSourceInfo, claimsMapping?: AuthoritiesClaimsMapping, pipes?: undefined, claimsResolver?: ClaimsResolverFn): FrontMcpAuthContext;
|
|
40
|
+
export declare function buildAuthContext(authInfo: AuthContextSourceInfo, claimsMapping: AuthoritiesClaimsMapping | undefined, pipes: AuthContextPipe[], claimsResolver?: ClaimsResolverFn): Promise<FrontMcpAuthContext>;
|
|
39
41
|
//# sourceMappingURL=frontmcp-auth-context.factory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frontmcp-auth-context.factory.d.ts","sourceRoot":"","sources":["../../src/context/frontmcp-auth-context.factory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAC;AACpF,OAAO,KAAK,EAAE,mBAAmB,EAAE,
|
|
1
|
+
{"version":3,"file":"frontmcp-auth-context.factory.d.ts","sourceRoot":"","sources":["../../src/context/frontmcp-auth-context.factory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,KAAK,wBAAwB,EAAE,MAAM,qCAAqC,CAAC;AACpF,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACzF,OAAO,EAA2B,KAAK,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAEnG;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,qBAAqB,EAC/B,aAAa,CAAC,EAAE,wBAAwB,EACxC,KAAK,CAAC,EAAE,SAAS,EACjB,cAAc,CAAC,EAAE,gBAAgB,GAChC,mBAAmB,CAAC;AACvB,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,qBAAqB,EAC/B,aAAa,EAAE,wBAAwB,GAAG,SAAS,EACnD,KAAK,EAAE,eAAe,EAAE,EACxB,cAAc,CAAC,EAAE,gBAAgB,GAChC,OAAO,CAAC,mBAAmB,CAAC,CAAC"}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* roles/permissions using the same `resolveDotPath` utility used by the
|
|
6
6
|
* authorities engine, and exposes convenience query methods.
|
|
7
7
|
*/
|
|
8
|
+
import { type ClaimsResolverFn } from '../authorities/authorities.context';
|
|
8
9
|
import type { AuthoritiesClaimsMapping } from '../authorities/authorities.profiles';
|
|
9
10
|
import type { FrontMcpAuthContext, FrontMcpAuthUser } from './frontmcp-auth-context';
|
|
10
11
|
/**
|
|
@@ -53,7 +54,7 @@ export declare class FrontMcpAuthContextImpl implements FrontMcpAuthContext {
|
|
|
53
54
|
readonly claims: Readonly<Record<string, unknown>>;
|
|
54
55
|
readonly roles: readonly string[];
|
|
55
56
|
readonly permissions: readonly string[];
|
|
56
|
-
constructor(source: AuthContextSourceInfo, claimsMapping?: AuthoritiesClaimsMapping);
|
|
57
|
+
constructor(source: AuthContextSourceInfo, claimsMapping?: AuthoritiesClaimsMapping, claimsResolver?: ClaimsResolverFn);
|
|
57
58
|
hasRole(role: string): boolean;
|
|
58
59
|
hasAllRoles(roles: readonly string[]): boolean;
|
|
59
60
|
hasAnyRole(roles: readonly string[]): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frontmcp-auth-context.impl.d.ts","sourceRoot":"","sources":["../../src/context/frontmcp-auth-context.impl.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"frontmcp-auth-context.impl.d.ts","sourceRoot":"","sources":["../../src/context/frontmcp-auth-context.impl.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAIL,KAAK,gBAAgB,EACtB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAC;AACpF,OAAO,KAAK,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAErF;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,mCAAmC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wCAAwC;IACxC,IAAI,CAAC,EAAE;QACL,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;QACvB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;IACF,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iCAAiC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,yDAAyD;IACzD,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAgBD;;;;;GAKG;AACH,qBAAa,uBAAwB,YAAW,mBAAmB;IACjE,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACnD,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;gBAGtC,MAAM,EAAE,qBAAqB,EAC7B,aAAa,CAAC,EAAE,wBAAwB,EACxC,cAAc,CAAC,EAAE,gBAAgB;IAsEnC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI9B,WAAW,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO;IAI9C,UAAU,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO;IAI7C,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAI1C,iBAAiB,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO;IAI1D,gBAAgB,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO;IAIzD,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIhC,YAAY,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO;IAIhD,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO;IAM/C;;;OAGG;IACH,OAAO,CAAC,cAAc;CASvB"}
|
|
@@ -48,6 +48,8 @@ export interface AppAuthInfo {
|
|
|
48
48
|
id: string;
|
|
49
49
|
name: string;
|
|
50
50
|
auth?: AuthOptions;
|
|
51
|
+
/** A remote app's `remoteAuth.mode`. */
|
|
52
|
+
remoteAuthMode?: string;
|
|
51
53
|
}
|
|
52
54
|
export declare function deriveProviderId(options: AuthOptions): string;
|
|
53
55
|
export declare function detectAuthProviders(parentAuth: AuthOptions | undefined, apps: AppAuthInfo[]): AuthProviderDetectionResult;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-provider-detection.d.ts","sourceRoot":"","sources":["../../src/detection/auth-provider-detection.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,oBAAoB,CAAC;AAEvC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"auth-provider-detection.d.ts","sourceRoot":"","sources":["../../src/detection/auth-provider-detection.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,oBAAoB,CAAC;AAEvC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAcrD,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;gCAOrC,CAAC;AAEH,eAAO,MAAM,iCAAiC;;;;;;;;;;;;;;;;;;;;;gCAQ5C,CAAC;AAMH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAC9E,MAAM,MAAM,2BAA2B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iCAAiC,CAAC,CAAC;AAE5F,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,wCAAwC;IACxC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAMD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAiB7D;AAyBD,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,WAAW,GAAG,SAAS,EACnC,IAAI,EAAE,WAAW,EAAE,GAClB,2BAA2B,CA+F7B;AA6BD,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,WAAW,GAAG,SAAS,EAChC,UAAU,EAAE,WAAW,GAAG,SAAS,GAClC,OAAO,CAaT;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,2BAA2B,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAGtG;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,2BAA2B,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAGpG"}
|
package/esm/index.mjs
CHANGED
|
@@ -867,7 +867,8 @@ var JwksService = class {
|
|
|
867
867
|
* 1) inline jwks (if provided) → cache & return
|
|
868
868
|
* 2) cached & fresh (TTL) → return
|
|
869
869
|
* 3) explicit jwksUri → fetch, cache, return
|
|
870
|
-
* 4)
|
|
870
|
+
* 4) `<issuer>/.well-known/jwks.json` → fetch, cache, return
|
|
871
|
+
* 5) discover jwks_uri → the issuer's OAuth authorization server
|
|
871
872
|
* metadata (RFC 8414), else its OpenID configuration (OpenID Connect
|
|
872
873
|
* Discovery 1.0 §4, where Google, Okta, Auth0 and Entra publish it),
|
|
873
874
|
* then fetch jwks_uri, cache, return
|
|
@@ -886,6 +887,8 @@ var JwksService = class {
|
|
|
886
887
|
if (fromUri?.keys?.length) return fromUri;
|
|
887
888
|
}
|
|
888
889
|
const issuer = trimSlash(ref.issuerUrl);
|
|
890
|
+
const fromWellKnown = await this.tryFetchJwks(ref.id, `${issuer}/.well-known/jwks.json`);
|
|
891
|
+
if (fromWellKnown?.keys?.length) return fromWellKnown;
|
|
889
892
|
for (const document of ["oauth-authorization-server", "openid-configuration"]) {
|
|
890
893
|
const meta = await this.tryFetchAsMeta(`${issuer}/.well-known/${document}`);
|
|
891
894
|
const uri = meta && typeof meta === "object" && meta["jwks_uri"] ? String(meta["jwks_uri"]) : void 0;
|
|
@@ -3935,7 +3938,8 @@ function deriveTypedUser(claims) {
|
|
|
3935
3938
|
...claims,
|
|
3936
3939
|
iss: extractClaimValue(claims, "iss", isString) ?? "",
|
|
3937
3940
|
sid: extractClaimValue(claims, "sid", isString),
|
|
3938
|
-
|
|
3941
|
+
// RFC 9068 §2.2: a client-credentials token names the client as its subject; some IdPs only put it in client_id / azp
|
|
3942
|
+
sub: extractClaimValue(claims, "sub", isString) ?? extractClaimValue(claims, "client_id", isString) ?? extractClaimValue(claims, "azp", isString) ?? "",
|
|
3939
3943
|
exp: extractClaimValue(claims, "exp", isNumber),
|
|
3940
3944
|
iat: extractClaimValue(claims, "iat", isNumber),
|
|
3941
3945
|
aud: extractClaimValue(claims, "aud", isStringOrStringArray),
|
|
@@ -8760,9 +8764,17 @@ function detectAuthProviders(parentAuth, apps) {
|
|
|
8760
8764
|
`Invalid auth configuration: Parent uses transparent mode but apps have their own auth providers. Transparent mode passes tokens through without modification, which is incompatible with multi-provider setups. Change parent auth to local or remote mode to properly manage tokens for each provider. Detected providers: ${[...providers.keys()].join(", ")}`
|
|
8761
8765
|
);
|
|
8762
8766
|
}
|
|
8763
|
-
|
|
8764
|
-
|
|
8765
|
-
|
|
8767
|
+
const sharedEndpointUnenforced = !parentAuth || isPublicMode(parentAuth) || isStaticMode(parentAuth);
|
|
8768
|
+
const unenforcedAppIds = apps.filter((app) => app.auth && !isPublicMode(app.auth) && !staticParentEnforces(parentAuth, app.auth)).map((app) => app.id);
|
|
8769
|
+
if (sharedEndpointUnenforced && unenforcedAppIds.length > 0) {
|
|
8770
|
+
validationErrors.push(
|
|
8771
|
+
`App-level auth is not enforced on the shared endpoint of a server in ${parentAuth?.mode ?? "public"} mode, so the tools of ${unenforcedAppIds.join(", ")} would be served without it. Serve the app on its own endpoint with standalone: true or splitByApp: true, or run the server in local or remote mode with incrementalAuth enabled, which checks each tool call against the apps the caller has authorized (without incrementalAuth, local and remote mode do not check app grants per tool call).`
|
|
8772
|
+
);
|
|
8773
|
+
}
|
|
8774
|
+
const tokenMintingAppIds = apps.filter((app) => app.remoteAuthMode === "forward" && !(parentAuth && isTransparentMode(parentAuth))).map((app) => app.id);
|
|
8775
|
+
if (tokenMintingAppIds.length > 0) {
|
|
8776
|
+
validationErrors.push(
|
|
8777
|
+
`remoteAuth: { mode: 'forward' } on ${tokenMintingAppIds.join(", ")} would send the remote a token this server minted or holds itself: only a server in transparent mode receives its callers' tokens from the identity provider. Use remoteAuth: { mode: 'static', credentials } (or transportOptions.headers) for the remote, or run the server in transparent mode.`
|
|
8766
8778
|
);
|
|
8767
8779
|
}
|
|
8768
8780
|
return {
|
|
@@ -8775,6 +8787,14 @@ function detectAuthProviders(parentAuth, apps) {
|
|
|
8775
8787
|
warnings
|
|
8776
8788
|
};
|
|
8777
8789
|
}
|
|
8790
|
+
function staticParentEnforces(parentAuth, appAuth) {
|
|
8791
|
+
if (!parentAuth || !isStaticMode(parentAuth) || !isStaticMode(appAuth)) return false;
|
|
8792
|
+
const parent = staticAuthOptionsSchema.safeParse(parentAuth);
|
|
8793
|
+
const app = staticAuthOptionsSchema.safeParse(appAuth);
|
|
8794
|
+
if (!parent.success || !app.success) return false;
|
|
8795
|
+
const sameChallenge = parent.data.header.toLowerCase() === app.data.header.toLowerCase() && parent.data.scheme === app.data.scheme;
|
|
8796
|
+
return sameChallenge && parent.data.tokens.every((token) => app.data.tokens.includes(token));
|
|
8797
|
+
}
|
|
8778
8798
|
function getProviderUrl(options) {
|
|
8779
8799
|
if (isTransparentMode(options)) {
|
|
8780
8800
|
return options.provider;
|
|
@@ -9115,6 +9135,16 @@ function isLoopbackRedirectUri(uri) {
|
|
|
9115
9135
|
return false;
|
|
9116
9136
|
}
|
|
9117
9137
|
|
|
9138
|
+
// libs/auth/src/utils/token-scopes.utils.ts
|
|
9139
|
+
function scopesFromClaims(claims) {
|
|
9140
|
+
const scopes = [claims?.scope, claims?.scp].flatMap((claim) => {
|
|
9141
|
+
if (typeof claim === "string") return claim.split(/\s+/).filter(Boolean);
|
|
9142
|
+
if (Array.isArray(claim)) return claim.filter((scope) => typeof scope === "string");
|
|
9143
|
+
return [];
|
|
9144
|
+
});
|
|
9145
|
+
return [...new Set(scopes)];
|
|
9146
|
+
}
|
|
9147
|
+
|
|
9118
9148
|
// libs/auth/src/vault/auth-providers.types.ts
|
|
9119
9149
|
import { z as z19 } from "@frontmcp/lazy-zod";
|
|
9120
9150
|
var credentialScopeSchema = z19.enum(["global", "user", "session"]);
|
|
@@ -10132,6 +10162,7 @@ var LazyCredentialLoader = class {
|
|
|
10132
10162
|
};
|
|
10133
10163
|
|
|
10134
10164
|
// libs/auth/src/authorities/authorities.context.ts
|
|
10165
|
+
import { getEnv as getEnv4 } from "@frontmcp/utils";
|
|
10135
10166
|
function resolveDotPath(obj, path) {
|
|
10136
10167
|
if (path in obj) {
|
|
10137
10168
|
return obj[path];
|
|
@@ -10172,6 +10203,10 @@ function signedInSubject(rawSub, mappedSub) {
|
|
|
10172
10203
|
if (rawSub !== void 0 && isAnonymousSubject(rawSub)) return void 0;
|
|
10173
10204
|
return [mappedSub, rawSub].find((candidate) => !isAnonymousSubject(candidate));
|
|
10174
10205
|
}
|
|
10206
|
+
var runtimeEnv = new Proxy(
|
|
10207
|
+
{},
|
|
10208
|
+
{ get: (_target, name) => typeof name === "string" ? getEnv4(name) : void 0 }
|
|
10209
|
+
);
|
|
10175
10210
|
var AuthoritiesContextBuilder = class {
|
|
10176
10211
|
claimsMapping;
|
|
10177
10212
|
claimsResolver;
|
|
@@ -10184,7 +10219,7 @@ var AuthoritiesContextBuilder = class {
|
|
|
10184
10219
|
/**
|
|
10185
10220
|
* Build an evaluation context from AuthInfo and tool input.
|
|
10186
10221
|
*/
|
|
10187
|
-
build(authInfo, input = {}, env =
|
|
10222
|
+
build(authInfo, input = {}, env = runtimeEnv) {
|
|
10188
10223
|
if (this.claimsResolver) {
|
|
10189
10224
|
const resolved = this.claimsResolver(authInfo);
|
|
10190
10225
|
return {
|
|
@@ -10254,9 +10289,9 @@ var FrontMcpAuthContextImpl = class {
|
|
|
10254
10289
|
claims;
|
|
10255
10290
|
roles;
|
|
10256
10291
|
permissions;
|
|
10257
|
-
constructor(source, claimsMapping) {
|
|
10292
|
+
constructor(source, claimsMapping, claimsResolver) {
|
|
10258
10293
|
const rawUser = resolveAuthUser(source);
|
|
10259
|
-
const mappedSub = claimsMapping?.userId ? resolveDotPath(this.buildRawClaims(source), claimsMapping.userId) : void 0;
|
|
10294
|
+
const mappedSub = !claimsResolver && claimsMapping?.userId ? resolveDotPath(this.buildRawClaims(source), claimsMapping.userId) : void 0;
|
|
10260
10295
|
const signedInSub = signedInSubject(rawUser.sub, mappedSub);
|
|
10261
10296
|
const sub = signedInSub ?? (typeof rawUser.sub === "string" ? rawUser.sub : "");
|
|
10262
10297
|
this.user = Object.freeze({
|
|
@@ -10274,6 +10309,13 @@ var FrontMcpAuthContextImpl = class {
|
|
|
10274
10309
|
this.scopes = Object.freeze(
|
|
10275
10310
|
Array.isArray(source.scopes) ? source.scopes.filter((s) => typeof s === "string") : []
|
|
10276
10311
|
);
|
|
10312
|
+
if (claimsResolver) {
|
|
10313
|
+
const resolved = claimsResolver(source);
|
|
10314
|
+
this.claims = Object.freeze({ ...resolved.claims });
|
|
10315
|
+
this.roles = Object.freeze([...toStringArray2(resolved.roles)]);
|
|
10316
|
+
this.permissions = Object.freeze([...toStringArray2(resolved.permissions)]);
|
|
10317
|
+
return;
|
|
10318
|
+
}
|
|
10277
10319
|
const rawClaims = this.buildRawClaims(source);
|
|
10278
10320
|
this.claims = Object.freeze({ ...rawClaims });
|
|
10279
10321
|
if (claimsMapping?.roles) {
|
|
@@ -10334,8 +10376,8 @@ var FrontMcpAuthContextImpl = class {
|
|
|
10334
10376
|
};
|
|
10335
10377
|
|
|
10336
10378
|
// libs/auth/src/context/frontmcp-auth-context.factory.ts
|
|
10337
|
-
function buildAuthContext(authInfo, claimsMapping, pipes) {
|
|
10338
|
-
const base = new FrontMcpAuthContextImpl(authInfo, claimsMapping);
|
|
10379
|
+
function buildAuthContext(authInfo, claimsMapping, pipes, claimsResolver) {
|
|
10380
|
+
const base = new FrontMcpAuthContextImpl(authInfo, claimsMapping, claimsResolver);
|
|
10339
10381
|
if (!pipes || pipes.length === 0) {
|
|
10340
10382
|
return base;
|
|
10341
10383
|
}
|
|
@@ -10587,6 +10629,10 @@ function evaluateCondition(condition, envelope, ctx) {
|
|
|
10587
10629
|
const expected = resolveValue(condition.value, ctx);
|
|
10588
10630
|
return applyOperator(actual, condition.op, expected);
|
|
10589
10631
|
}
|
|
10632
|
+
var REDACTED_ENV_VALUE = "[redacted]";
|
|
10633
|
+
function reportableActual(path, actual) {
|
|
10634
|
+
return path === "env" || path.startsWith("env.") ? REDACTED_ENV_VALUE : actual;
|
|
10635
|
+
}
|
|
10590
10636
|
function evaluateAbac(policy, ctx) {
|
|
10591
10637
|
const envelope = buildContextEnvelope(ctx);
|
|
10592
10638
|
if (policy.match) {
|
|
@@ -10594,10 +10640,11 @@ function evaluateAbac(policy, ctx) {
|
|
|
10594
10640
|
const actual = resolveDotPath(envelope, path);
|
|
10595
10641
|
const expected = resolveValue(expectedRaw, ctx);
|
|
10596
10642
|
if (expected === void 0 || actual !== expected) {
|
|
10643
|
+
const reported = reportableActual(path, actual);
|
|
10597
10644
|
return {
|
|
10598
10645
|
granted: false,
|
|
10599
|
-
deniedBy: `attributes.match: '${path}' expected '${String(expected)}' but got '${String(
|
|
10600
|
-
denial: { kind: "attributes", path: "attributes.match", expected, actual },
|
|
10646
|
+
deniedBy: `attributes.match: '${path}' expected '${String(expected)}' but got '${String(reported)}'`,
|
|
10647
|
+
denial: { kind: "attributes", path: "attributes.match", expected, actual: reported },
|
|
10601
10648
|
evaluatedPolicies: ["attributes.match"]
|
|
10602
10649
|
};
|
|
10603
10650
|
}
|
|
@@ -10608,7 +10655,7 @@ function evaluateAbac(policy, ctx) {
|
|
|
10608
10655
|
const condition = policy.conditions[i];
|
|
10609
10656
|
if (!evaluateCondition(condition, envelope, ctx)) {
|
|
10610
10657
|
const expected = resolveValue(condition.value, ctx);
|
|
10611
|
-
const actual = resolveDotPath(envelope, condition.path);
|
|
10658
|
+
const actual = reportableActual(condition.path, resolveDotPath(envelope, condition.path));
|
|
10612
10659
|
return {
|
|
10613
10660
|
granted: false,
|
|
10614
10661
|
deniedBy: `attributes.conditions: '${condition.path}' failed '${condition.op}' check against '${String(expected)}'`,
|
|
@@ -11347,6 +11394,21 @@ var basicApplier = {
|
|
|
11347
11394
|
function isFrontMcpCredentials(creds) {
|
|
11348
11395
|
return typeof creds === "object" && creds !== null && "provider" in creds && typeof creds.provider === "string" && creds.provider.length > 0;
|
|
11349
11396
|
}
|
|
11397
|
+
function providerHeadersCredentials(resolveHeaders) {
|
|
11398
|
+
return {
|
|
11399
|
+
async applyCredentials(_url, init) {
|
|
11400
|
+
const { credentials, ...cleanInit } = init;
|
|
11401
|
+
if (!isFrontMcpCredentials(credentials)) {
|
|
11402
|
+
return { init: typeof credentials === "string" ? init : cleanInit };
|
|
11403
|
+
}
|
|
11404
|
+
const headers = new Headers(cleanInit.headers);
|
|
11405
|
+
for (const [name, value] of Object.entries(await resolveHeaders(credentials.provider))) {
|
|
11406
|
+
headers.set(name, value);
|
|
11407
|
+
}
|
|
11408
|
+
return { init: { ...cleanInit, headers } };
|
|
11409
|
+
}
|
|
11410
|
+
};
|
|
11411
|
+
}
|
|
11350
11412
|
var FetchCredentialMiddleware = class {
|
|
11351
11413
|
constructor(tokenAccessor, appliers) {
|
|
11352
11414
|
this.tokenAccessor = tokenAccessor;
|
|
@@ -11647,6 +11709,7 @@ export {
|
|
|
11647
11709
|
privateKeyCredentialSchema,
|
|
11648
11710
|
progressiveAuthStateSchema,
|
|
11649
11711
|
providerConfigSchema,
|
|
11712
|
+
providerHeadersCredentials,
|
|
11650
11713
|
publicAccessConfigSchema,
|
|
11651
11714
|
publicAuthOptionsSchema,
|
|
11652
11715
|
queryApplier,
|
|
@@ -11664,6 +11727,7 @@ export {
|
|
|
11664
11727
|
resourceIdRefSchema,
|
|
11665
11728
|
resourceScopesFor,
|
|
11666
11729
|
safeDecrypt,
|
|
11730
|
+
scopesFromClaims,
|
|
11667
11731
|
sealPendingLogin,
|
|
11668
11732
|
secureStoreConfigSchema,
|
|
11669
11733
|
secureStoreCustomBackendSchema,
|
package/esm/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@frontmcp/auth",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.2",
|
|
4
4
|
"description": "FrontMCP Auth - Authentication, session management, and credential vault",
|
|
5
5
|
"author": "AgentFront <info@agentfront.dev>",
|
|
6
6
|
"homepage": "https://docs.agentfront.dev",
|
|
@@ -47,8 +47,8 @@
|
|
|
47
47
|
"node": ">=24.0.0"
|
|
48
48
|
},
|
|
49
49
|
"peerDependencies": {
|
|
50
|
-
"@frontmcp/lazy-zod": "1.9.
|
|
51
|
-
"@frontmcp/storage-sqlite": "1.9.
|
|
50
|
+
"@frontmcp/lazy-zod": "1.9.2",
|
|
51
|
+
"@frontmcp/storage-sqlite": "1.9.2",
|
|
52
52
|
"@vercel/kv": "^3.0.0",
|
|
53
53
|
"ioredis": "^5.0.0"
|
|
54
54
|
},
|
|
@@ -64,8 +64,8 @@
|
|
|
64
64
|
}
|
|
65
65
|
},
|
|
66
66
|
"dependencies": {
|
|
67
|
-
"@frontmcp/di": "1.9.
|
|
68
|
-
"@frontmcp/utils": "1.9.
|
|
67
|
+
"@frontmcp/di": "1.9.2",
|
|
68
|
+
"@frontmcp/utils": "1.9.2",
|
|
69
69
|
"jose": "^6.0.0"
|
|
70
70
|
},
|
|
71
71
|
"devDependencies": {
|
|
@@ -70,6 +70,16 @@ export type FrontMcpFetchInit = Omit<RequestInit, 'credentials'> & {
|
|
|
70
70
|
credentials?: FrontMcpCredentials | RequestCredentials;
|
|
71
71
|
};
|
|
72
72
|
export declare function isFrontMcpCredentials(creds: unknown): creds is FrontMcpCredentials;
|
|
73
|
+
/** What applies `credentials: { provider }` to an outgoing request. */
|
|
74
|
+
export interface FetchCredentialApplier {
|
|
75
|
+
applyCredentials(url: string, init: FrontMcpFetchInit): Promise<CredentialApplyResult>;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Applies the headers a provider's credential resolves to (what `this.authProviders.headers(provider)`
|
|
79
|
+
* returns), so each provider decides how its credential is sent. A provider without a credential adds
|
|
80
|
+
* none. The `credentials` object itself is never passed on to `fetch`.
|
|
81
|
+
*/
|
|
82
|
+
export declare function providerHeadersCredentials(resolveHeaders: (providerName: string) => Promise<Record<string, string>>): FetchCredentialApplier;
|
|
73
83
|
/**
|
|
74
84
|
* Middleware that resolves upstream provider tokens and delegates to
|
|
75
85
|
* the provider's CredentialApplier to inject them into outgoing requests.
|
|
@@ -86,7 +96,7 @@ export declare function isFrontMcpCredentials(creds: unknown): creds is FrontMcp
|
|
|
86
96
|
* });
|
|
87
97
|
* ```
|
|
88
98
|
*/
|
|
89
|
-
export declare class FetchCredentialMiddleware {
|
|
99
|
+
export declare class FetchCredentialMiddleware implements FetchCredentialApplier {
|
|
90
100
|
private readonly tokenAccessor;
|
|
91
101
|
private readonly appliers;
|
|
92
102
|
constructor(tokenAccessor: TokenAccessor, appliers?: Record<string, CredentialApplier>);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-credential-middleware.d.ts","sourceRoot":"","sources":["../../src/fetch/fetch-credential-middleware.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CACtD;AAED;;;GAGG;AACH;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,2CAA2C;IAC3C,IAAI,EAAE,WAAW,CAAC;IAClB,mEAAmE;IACnE,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC;;;;;;;OAOG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,qBAAqB,CAAC;CAC7E;AAED;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,iBAM3B,CAAC;AAEF;;;GAGG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,iBAAiB,CAQpF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,iBAAiB,CAQjE;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,iBAQ1B,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,gDAAgD;IAChD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,GAAG;IACjE,WAAW,CAAC,EAAE,mBAAmB,GAAG,kBAAkB,CAAC;CACxD,CAAC;AAMF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,mBAAmB,CAQlF;AAMD;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,
|
|
1
|
+
{"version":3,"file":"fetch-credential-middleware.d.ts","sourceRoot":"","sources":["../../src/fetch/fetch-credential-middleware.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CACtD;AAED;;;GAGG;AACH;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,2CAA2C;IAC3C,IAAI,EAAE,WAAW,CAAC;IAClB,mEAAmE;IACnE,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC;;;;;;;OAOG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,qBAAqB,CAAC;CAC7E;AAED;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,iBAM3B,CAAC;AAEF;;;GAGG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,iBAAiB,CAQpF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,iBAAiB,CAQjE;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,iBAQ1B,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,gDAAgD;IAChD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,GAAG;IACjE,WAAW,CAAC,EAAE,mBAAmB,GAAG,kBAAkB,CAAC;CACxD,CAAC;AAMF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,mBAAmB,CAQlF;AAMD,uEAAuE;AACvE,MAAM,WAAW,sBAAsB;IACrC,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;CACxF;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,cAAc,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GACxE,sBAAsB,CAcxB;AAED;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,yBAA0B,YAAW,sBAAsB;IAIpE,OAAO,CAAC,QAAQ,CAAC,aAAa;IAHhC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiC;gBAGvC,aAAa,EAAE,aAAa,EAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC;IAK9C;;;OAGG;IACG,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,qBAAqB,CAAC;CA8B7F"}
|
package/fetch/index.d.ts
CHANGED
|
@@ -5,6 +5,6 @@
|
|
|
5
5
|
* fetch requests via the `credentials: { provider: '...' }` pattern.
|
|
6
6
|
* Auth providers decide HOW to apply credentials (Bearer, API key, query param, basic).
|
|
7
7
|
*/
|
|
8
|
-
export { FetchCredentialMiddleware, isFrontMcpCredentials, bearerApplier, basicApplier, headerApplier, queryApplier, } from './fetch-credential-middleware';
|
|
9
|
-
export type { TokenAccessor, CredentialApplier, CredentialApplyResult, FrontMcpCredentials, FrontMcpFetchInit, } from './fetch-credential-middleware';
|
|
8
|
+
export { FetchCredentialMiddleware, providerHeadersCredentials, isFrontMcpCredentials, bearerApplier, basicApplier, headerApplier, queryApplier, } from './fetch-credential-middleware';
|
|
9
|
+
export type { FetchCredentialApplier, TokenAccessor, CredentialApplier, CredentialApplyResult, FrontMcpCredentials, FrontMcpFetchInit, } from './fetch-credential-middleware';
|
|
10
10
|
//# sourceMappingURL=index.d.ts.map
|
package/fetch/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/fetch/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACrB,aAAa,EACb,YAAY,EACZ,aAAa,EACb,YAAY,GACb,MAAM,+BAA+B,CAAC;AAEvC,YAAY,EACV,aAAa,EACb,iBAAiB,EACjB,qBAAqB,EACrB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,+BAA+B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/fetch/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,yBAAyB,EACzB,0BAA0B,EAC1B,qBAAqB,EACrB,aAAa,EACb,YAAY,EACZ,aAAa,EACb,YAAY,GACb,MAAM,+BAA+B,CAAC;AAEvC,YAAY,EACV,sBAAsB,EACtB,aAAa,EACb,iBAAiB,EACjB,qBAAqB,EACrB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,+BAA+B,CAAC"}
|
package/index.d.ts
CHANGED
|
@@ -49,13 +49,13 @@ export * from './options';
|
|
|
49
49
|
export { consentToolItemSchema, consentSelectionSchema, consentStateSchema, federatedProviderItemSchema, federatedLoginStateSchema, federatedSelectionSchema, } from './consent';
|
|
50
50
|
export type { ConsentToolItem, ConsentSelection, ConsentState, FederatedProviderItem, FederatedLoginState, FederatedSelection, } from './consent';
|
|
51
51
|
export * from './detection';
|
|
52
|
-
export { buildWwwAuthenticate, buildPrmUrl, buildUnauthorizedHeader, buildInvalidTokenHeader, buildInsufficientScopeHeader, buildInvalidRequestHeader, parseWwwAuthenticate, validateAudience, createAudienceValidator, deriveExpectedAudience, AudienceValidator, deriveAuthorizationId, advertisedScopes, DEFAULT_ALLOWED_SCOPES, grantScopes, resourceScopesFor, isLoopbackRedirectUri, } from './utils';
|
|
52
|
+
export { buildWwwAuthenticate, buildPrmUrl, buildUnauthorizedHeader, buildInvalidTokenHeader, buildInsufficientScopeHeader, buildInvalidRequestHeader, parseWwwAuthenticate, validateAudience, createAudienceValidator, deriveExpectedAudience, AudienceValidator, deriveAuthorizationId, advertisedScopes, DEFAULT_ALLOWED_SCOPES, grantScopes, resourceScopesFor, scopesFromClaims, isLoopbackRedirectUri, } from './utils';
|
|
53
53
|
export type { BearerErrorCode, ResourceScopeOptions, WwwAuthenticateOptions, AudienceValidationResult, AudienceValidatorOptions, } from './utils';
|
|
54
54
|
export { type CredentialScope, type LoadingStrategy, type GetCredentialOptions, type ResolvedCredential, type CredentialFactoryContext, type CredentialFactory, type CredentialRefreshFn, type CredentialHeadersFn, type CredentialProviderConfig, type AuthProviderMapping, type CredentialCacheEntry, type VaultStorageKey, type AuthProvidersVaultOptions, type CredentialEventType, type CredentialEvent, type CacheStats, credentialScopeSchema, loadingStrategySchema, getCredentialOptionsSchema, credentialProviderConfigSchema, authProviderMappingSchema, authProvidersVaultOptionsSchema, extractCredentialExpiry, CredentialCache, type AuthProvidersAccessor, AUTH_PROVIDERS_ACCESSOR, AuthProvidersAccessorImpl, AuthProvidersRegistry, AUTH_PROVIDERS_REGISTRY, type NormalizedProviderConfig, AuthProvidersVault, AUTH_PROVIDERS_VAULT, EagerCredentialLoader, type EagerLoadResult, LazyCredentialLoader, } from './vault';
|
|
55
55
|
export { type CimdLogger, noopLogger, clientMetadataDocumentSchema, cimdCacheConfigSchema, cimdSecurityConfigSchema, cimdNetworkConfigSchema, cimdConfigSchema, type ClientMetadataDocument, type ClientMetadataDocumentInput, type CimdCacheConfig, type CimdSecurityConfig, type CimdNetworkConfig, type CimdConfig, type CimdConfigInput, type CimdResolutionResult, CimdError, InvalidClientIdUrlError, CimdFetchError, CimdValidationError, CimdClientIdMismatchError, CimdSecurityError, RedirectUriMismatchError, CimdResponseTooLargeError, CimdDisabledError, isCimdClientId, validateClientIdUrl, checkSsrfProtection, hasOnlyLocalhostRedirectUris, InMemoryCimdCache, extractCacheHeaders, parseCacheHeaders, type CimdCacheEntry, type CacheableHeaders, CimdService, } from './cimd';
|
|
56
56
|
export { FrontMcpAuthContextImpl, buildAuthContext } from './context';
|
|
57
57
|
export type { FrontMcpAuthContext, FrontMcpAuthUser, AuthContextSourceInfo } from './context';
|
|
58
58
|
export * from './authorities';
|
|
59
|
-
export { FetchCredentialMiddleware, isFrontMcpCredentials, bearerApplier, basicApplier, headerApplier, queryApplier, } from './fetch';
|
|
60
|
-
export type { TokenAccessor, CredentialApplier, FrontMcpCredentials, FrontMcpFetchInit } from './fetch';
|
|
59
|
+
export { FetchCredentialMiddleware, providerHeadersCredentials, isFrontMcpCredentials, bearerApplier, basicApplier, headerApplier, queryApplier, } from './fetch';
|
|
60
|
+
export type { FetchCredentialApplier, TokenAccessor, CredentialApplier, FrontMcpCredentials, FrontMcpFetchInit, } from './fetch';
|
|
61
61
|
//# sourceMappingURL=index.d.ts.map
|
package/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/index.js
CHANGED
|
@@ -500,6 +500,7 @@ __export(index_exports, {
|
|
|
500
500
|
privateKeyCredentialSchema: () => privateKeyCredentialSchema,
|
|
501
501
|
progressiveAuthStateSchema: () => progressiveAuthStateSchema,
|
|
502
502
|
providerConfigSchema: () => providerConfigSchema,
|
|
503
|
+
providerHeadersCredentials: () => providerHeadersCredentials,
|
|
503
504
|
publicAccessConfigSchema: () => publicAccessConfigSchema,
|
|
504
505
|
publicAuthOptionsSchema: () => publicAuthOptionsSchema,
|
|
505
506
|
queryApplier: () => queryApplier,
|
|
@@ -517,6 +518,7 @@ __export(index_exports, {
|
|
|
517
518
|
resourceIdRefSchema: () => resourceIdRefSchema,
|
|
518
519
|
resourceScopesFor: () => resourceScopesFor,
|
|
519
520
|
safeDecrypt: () => safeDecrypt,
|
|
521
|
+
scopesFromClaims: () => scopesFromClaims,
|
|
520
522
|
sealPendingLogin: () => sealPendingLogin,
|
|
521
523
|
secureStoreConfigSchema: () => secureStoreConfigSchema,
|
|
522
524
|
secureStoreCustomBackendSchema: () => secureStoreCustomBackendSchema,
|
|
@@ -1207,7 +1209,8 @@ var JwksService = class {
|
|
|
1207
1209
|
* 1) inline jwks (if provided) → cache & return
|
|
1208
1210
|
* 2) cached & fresh (TTL) → return
|
|
1209
1211
|
* 3) explicit jwksUri → fetch, cache, return
|
|
1210
|
-
* 4)
|
|
1212
|
+
* 4) `<issuer>/.well-known/jwks.json` → fetch, cache, return
|
|
1213
|
+
* 5) discover jwks_uri → the issuer's OAuth authorization server
|
|
1211
1214
|
* metadata (RFC 8414), else its OpenID configuration (OpenID Connect
|
|
1212
1215
|
* Discovery 1.0 §4, where Google, Okta, Auth0 and Entra publish it),
|
|
1213
1216
|
* then fetch jwks_uri, cache, return
|
|
@@ -1226,6 +1229,8 @@ var JwksService = class {
|
|
|
1226
1229
|
if (fromUri?.keys?.length) return fromUri;
|
|
1227
1230
|
}
|
|
1228
1231
|
const issuer = trimSlash(ref.issuerUrl);
|
|
1232
|
+
const fromWellKnown = await this.tryFetchJwks(ref.id, `${issuer}/.well-known/jwks.json`);
|
|
1233
|
+
if (fromWellKnown?.keys?.length) return fromWellKnown;
|
|
1229
1234
|
for (const document of ["oauth-authorization-server", "openid-configuration"]) {
|
|
1230
1235
|
const meta = await this.tryFetchAsMeta(`${issuer}/.well-known/${document}`);
|
|
1231
1236
|
const uri = meta && typeof meta === "object" && meta["jwks_uri"] ? String(meta["jwks_uri"]) : void 0;
|
|
@@ -4248,7 +4253,8 @@ function deriveTypedUser(claims) {
|
|
|
4248
4253
|
...claims,
|
|
4249
4254
|
iss: extractClaimValue(claims, "iss", isString) ?? "",
|
|
4250
4255
|
sid: extractClaimValue(claims, "sid", isString),
|
|
4251
|
-
|
|
4256
|
+
// RFC 9068 §2.2: a client-credentials token names the client as its subject; some IdPs only put it in client_id / azp
|
|
4257
|
+
sub: extractClaimValue(claims, "sub", isString) ?? extractClaimValue(claims, "client_id", isString) ?? extractClaimValue(claims, "azp", isString) ?? "",
|
|
4252
4258
|
exp: extractClaimValue(claims, "exp", isNumber),
|
|
4253
4259
|
iat: extractClaimValue(claims, "iat", isNumber),
|
|
4254
4260
|
aud: extractClaimValue(claims, "aud", isStringOrStringArray),
|
|
@@ -9073,9 +9079,17 @@ function detectAuthProviders(parentAuth, apps) {
|
|
|
9073
9079
|
`Invalid auth configuration: Parent uses transparent mode but apps have their own auth providers. Transparent mode passes tokens through without modification, which is incompatible with multi-provider setups. Change parent auth to local or remote mode to properly manage tokens for each provider. Detected providers: ${[...providers.keys()].join(", ")}`
|
|
9074
9080
|
);
|
|
9075
9081
|
}
|
|
9076
|
-
|
|
9077
|
-
|
|
9078
|
-
|
|
9082
|
+
const sharedEndpointUnenforced = !parentAuth || isPublicMode(parentAuth) || isStaticMode(parentAuth);
|
|
9083
|
+
const unenforcedAppIds = apps.filter((app) => app.auth && !isPublicMode(app.auth) && !staticParentEnforces(parentAuth, app.auth)).map((app) => app.id);
|
|
9084
|
+
if (sharedEndpointUnenforced && unenforcedAppIds.length > 0) {
|
|
9085
|
+
validationErrors.push(
|
|
9086
|
+
`App-level auth is not enforced on the shared endpoint of a server in ${parentAuth?.mode ?? "public"} mode, so the tools of ${unenforcedAppIds.join(", ")} would be served without it. Serve the app on its own endpoint with standalone: true or splitByApp: true, or run the server in local or remote mode with incrementalAuth enabled, which checks each tool call against the apps the caller has authorized (without incrementalAuth, local and remote mode do not check app grants per tool call).`
|
|
9087
|
+
);
|
|
9088
|
+
}
|
|
9089
|
+
const tokenMintingAppIds = apps.filter((app) => app.remoteAuthMode === "forward" && !(parentAuth && isTransparentMode(parentAuth))).map((app) => app.id);
|
|
9090
|
+
if (tokenMintingAppIds.length > 0) {
|
|
9091
|
+
validationErrors.push(
|
|
9092
|
+
`remoteAuth: { mode: 'forward' } on ${tokenMintingAppIds.join(", ")} would send the remote a token this server minted or holds itself: only a server in transparent mode receives its callers' tokens from the identity provider. Use remoteAuth: { mode: 'static', credentials } (or transportOptions.headers) for the remote, or run the server in transparent mode.`
|
|
9079
9093
|
);
|
|
9080
9094
|
}
|
|
9081
9095
|
return {
|
|
@@ -9088,6 +9102,14 @@ function detectAuthProviders(parentAuth, apps) {
|
|
|
9088
9102
|
warnings
|
|
9089
9103
|
};
|
|
9090
9104
|
}
|
|
9105
|
+
function staticParentEnforces(parentAuth, appAuth) {
|
|
9106
|
+
if (!parentAuth || !isStaticMode(parentAuth) || !isStaticMode(appAuth)) return false;
|
|
9107
|
+
const parent = staticAuthOptionsSchema.safeParse(parentAuth);
|
|
9108
|
+
const app = staticAuthOptionsSchema.safeParse(appAuth);
|
|
9109
|
+
if (!parent.success || !app.success) return false;
|
|
9110
|
+
const sameChallenge = parent.data.header.toLowerCase() === app.data.header.toLowerCase() && parent.data.scheme === app.data.scheme;
|
|
9111
|
+
return sameChallenge && parent.data.tokens.every((token) => app.data.tokens.includes(token));
|
|
9112
|
+
}
|
|
9091
9113
|
function getProviderUrl(options) {
|
|
9092
9114
|
if (isTransparentMode(options)) {
|
|
9093
9115
|
return options.provider;
|
|
@@ -9428,6 +9450,16 @@ function isLoopbackRedirectUri(uri) {
|
|
|
9428
9450
|
return false;
|
|
9429
9451
|
}
|
|
9430
9452
|
|
|
9453
|
+
// libs/auth/src/utils/token-scopes.utils.ts
|
|
9454
|
+
function scopesFromClaims(claims) {
|
|
9455
|
+
const scopes = [claims?.scope, claims?.scp].flatMap((claim) => {
|
|
9456
|
+
if (typeof claim === "string") return claim.split(/\s+/).filter(Boolean);
|
|
9457
|
+
if (Array.isArray(claim)) return claim.filter((scope) => typeof scope === "string");
|
|
9458
|
+
return [];
|
|
9459
|
+
});
|
|
9460
|
+
return [...new Set(scopes)];
|
|
9461
|
+
}
|
|
9462
|
+
|
|
9431
9463
|
// libs/auth/src/vault/auth-providers.types.ts
|
|
9432
9464
|
var import_lazy_zod19 = require("@frontmcp/lazy-zod");
|
|
9433
9465
|
var credentialScopeSchema = import_lazy_zod19.z.enum(["global", "user", "session"]);
|
|
@@ -10445,6 +10477,7 @@ var LazyCredentialLoader = class {
|
|
|
10445
10477
|
};
|
|
10446
10478
|
|
|
10447
10479
|
// libs/auth/src/authorities/authorities.context.ts
|
|
10480
|
+
var import_utils47 = require("@frontmcp/utils");
|
|
10448
10481
|
function resolveDotPath(obj, path) {
|
|
10449
10482
|
if (path in obj) {
|
|
10450
10483
|
return obj[path];
|
|
@@ -10485,6 +10518,10 @@ function signedInSubject(rawSub, mappedSub) {
|
|
|
10485
10518
|
if (rawSub !== void 0 && isAnonymousSubject(rawSub)) return void 0;
|
|
10486
10519
|
return [mappedSub, rawSub].find((candidate) => !isAnonymousSubject(candidate));
|
|
10487
10520
|
}
|
|
10521
|
+
var runtimeEnv = new Proxy(
|
|
10522
|
+
{},
|
|
10523
|
+
{ get: (_target, name) => typeof name === "string" ? (0, import_utils47.getEnv)(name) : void 0 }
|
|
10524
|
+
);
|
|
10488
10525
|
var AuthoritiesContextBuilder = class {
|
|
10489
10526
|
claimsMapping;
|
|
10490
10527
|
claimsResolver;
|
|
@@ -10497,7 +10534,7 @@ var AuthoritiesContextBuilder = class {
|
|
|
10497
10534
|
/**
|
|
10498
10535
|
* Build an evaluation context from AuthInfo and tool input.
|
|
10499
10536
|
*/
|
|
10500
|
-
build(authInfo, input = {}, env =
|
|
10537
|
+
build(authInfo, input = {}, env = runtimeEnv) {
|
|
10501
10538
|
if (this.claimsResolver) {
|
|
10502
10539
|
const resolved = this.claimsResolver(authInfo);
|
|
10503
10540
|
return {
|
|
@@ -10567,9 +10604,9 @@ var FrontMcpAuthContextImpl = class {
|
|
|
10567
10604
|
claims;
|
|
10568
10605
|
roles;
|
|
10569
10606
|
permissions;
|
|
10570
|
-
constructor(source, claimsMapping) {
|
|
10607
|
+
constructor(source, claimsMapping, claimsResolver) {
|
|
10571
10608
|
const rawUser = resolveAuthUser(source);
|
|
10572
|
-
const mappedSub = claimsMapping?.userId ? resolveDotPath(this.buildRawClaims(source), claimsMapping.userId) : void 0;
|
|
10609
|
+
const mappedSub = !claimsResolver && claimsMapping?.userId ? resolveDotPath(this.buildRawClaims(source), claimsMapping.userId) : void 0;
|
|
10573
10610
|
const signedInSub = signedInSubject(rawUser.sub, mappedSub);
|
|
10574
10611
|
const sub = signedInSub ?? (typeof rawUser.sub === "string" ? rawUser.sub : "");
|
|
10575
10612
|
this.user = Object.freeze({
|
|
@@ -10587,6 +10624,13 @@ var FrontMcpAuthContextImpl = class {
|
|
|
10587
10624
|
this.scopes = Object.freeze(
|
|
10588
10625
|
Array.isArray(source.scopes) ? source.scopes.filter((s) => typeof s === "string") : []
|
|
10589
10626
|
);
|
|
10627
|
+
if (claimsResolver) {
|
|
10628
|
+
const resolved = claimsResolver(source);
|
|
10629
|
+
this.claims = Object.freeze({ ...resolved.claims });
|
|
10630
|
+
this.roles = Object.freeze([...toStringArray2(resolved.roles)]);
|
|
10631
|
+
this.permissions = Object.freeze([...toStringArray2(resolved.permissions)]);
|
|
10632
|
+
return;
|
|
10633
|
+
}
|
|
10590
10634
|
const rawClaims = this.buildRawClaims(source);
|
|
10591
10635
|
this.claims = Object.freeze({ ...rawClaims });
|
|
10592
10636
|
if (claimsMapping?.roles) {
|
|
@@ -10647,8 +10691,8 @@ var FrontMcpAuthContextImpl = class {
|
|
|
10647
10691
|
};
|
|
10648
10692
|
|
|
10649
10693
|
// libs/auth/src/context/frontmcp-auth-context.factory.ts
|
|
10650
|
-
function buildAuthContext(authInfo, claimsMapping, pipes) {
|
|
10651
|
-
const base = new FrontMcpAuthContextImpl(authInfo, claimsMapping);
|
|
10694
|
+
function buildAuthContext(authInfo, claimsMapping, pipes, claimsResolver) {
|
|
10695
|
+
const base = new FrontMcpAuthContextImpl(authInfo, claimsMapping, claimsResolver);
|
|
10652
10696
|
if (!pipes || pipes.length === 0) {
|
|
10653
10697
|
return base;
|
|
10654
10698
|
}
|
|
@@ -10900,6 +10944,10 @@ function evaluateCondition(condition, envelope, ctx) {
|
|
|
10900
10944
|
const expected = resolveValue(condition.value, ctx);
|
|
10901
10945
|
return applyOperator(actual, condition.op, expected);
|
|
10902
10946
|
}
|
|
10947
|
+
var REDACTED_ENV_VALUE = "[redacted]";
|
|
10948
|
+
function reportableActual(path, actual) {
|
|
10949
|
+
return path === "env" || path.startsWith("env.") ? REDACTED_ENV_VALUE : actual;
|
|
10950
|
+
}
|
|
10903
10951
|
function evaluateAbac(policy, ctx) {
|
|
10904
10952
|
const envelope = buildContextEnvelope(ctx);
|
|
10905
10953
|
if (policy.match) {
|
|
@@ -10907,10 +10955,11 @@ function evaluateAbac(policy, ctx) {
|
|
|
10907
10955
|
const actual = resolveDotPath(envelope, path);
|
|
10908
10956
|
const expected = resolveValue(expectedRaw, ctx);
|
|
10909
10957
|
if (expected === void 0 || actual !== expected) {
|
|
10958
|
+
const reported = reportableActual(path, actual);
|
|
10910
10959
|
return {
|
|
10911
10960
|
granted: false,
|
|
10912
|
-
deniedBy: `attributes.match: '${path}' expected '${String(expected)}' but got '${String(
|
|
10913
|
-
denial: { kind: "attributes", path: "attributes.match", expected, actual },
|
|
10961
|
+
deniedBy: `attributes.match: '${path}' expected '${String(expected)}' but got '${String(reported)}'`,
|
|
10962
|
+
denial: { kind: "attributes", path: "attributes.match", expected, actual: reported },
|
|
10914
10963
|
evaluatedPolicies: ["attributes.match"]
|
|
10915
10964
|
};
|
|
10916
10965
|
}
|
|
@@ -10921,7 +10970,7 @@ function evaluateAbac(policy, ctx) {
|
|
|
10921
10970
|
const condition = policy.conditions[i];
|
|
10922
10971
|
if (!evaluateCondition(condition, envelope, ctx)) {
|
|
10923
10972
|
const expected = resolveValue(condition.value, ctx);
|
|
10924
|
-
const actual = resolveDotPath(envelope, condition.path);
|
|
10973
|
+
const actual = reportableActual(condition.path, resolveDotPath(envelope, condition.path));
|
|
10925
10974
|
return {
|
|
10926
10975
|
granted: false,
|
|
10927
10976
|
deniedBy: `attributes.conditions: '${condition.path}' failed '${condition.op}' check against '${String(expected)}'`,
|
|
@@ -11660,6 +11709,21 @@ var basicApplier = {
|
|
|
11660
11709
|
function isFrontMcpCredentials(creds) {
|
|
11661
11710
|
return typeof creds === "object" && creds !== null && "provider" in creds && typeof creds.provider === "string" && creds.provider.length > 0;
|
|
11662
11711
|
}
|
|
11712
|
+
function providerHeadersCredentials(resolveHeaders) {
|
|
11713
|
+
return {
|
|
11714
|
+
async applyCredentials(_url, init) {
|
|
11715
|
+
const { credentials, ...cleanInit } = init;
|
|
11716
|
+
if (!isFrontMcpCredentials(credentials)) {
|
|
11717
|
+
return { init: typeof credentials === "string" ? init : cleanInit };
|
|
11718
|
+
}
|
|
11719
|
+
const headers = new Headers(cleanInit.headers);
|
|
11720
|
+
for (const [name, value] of Object.entries(await resolveHeaders(credentials.provider))) {
|
|
11721
|
+
headers.set(name, value);
|
|
11722
|
+
}
|
|
11723
|
+
return { init: { ...cleanInit, headers } };
|
|
11724
|
+
}
|
|
11725
|
+
};
|
|
11726
|
+
}
|
|
11663
11727
|
var FetchCredentialMiddleware = class {
|
|
11664
11728
|
constructor(tokenAccessor, appliers) {
|
|
11665
11729
|
this.tokenAccessor = tokenAccessor;
|
|
@@ -11961,6 +12025,7 @@ var FetchCredentialMiddleware = class {
|
|
|
11961
12025
|
privateKeyCredentialSchema,
|
|
11962
12026
|
progressiveAuthStateSchema,
|
|
11963
12027
|
providerConfigSchema,
|
|
12028
|
+
providerHeadersCredentials,
|
|
11964
12029
|
publicAccessConfigSchema,
|
|
11965
12030
|
publicAuthOptionsSchema,
|
|
11966
12031
|
queryApplier,
|
|
@@ -11978,6 +12043,7 @@ var FetchCredentialMiddleware = class {
|
|
|
11978
12043
|
resourceIdRefSchema,
|
|
11979
12044
|
resourceScopesFor,
|
|
11980
12045
|
safeDecrypt,
|
|
12046
|
+
scopesFromClaims,
|
|
11981
12047
|
sealPendingLogin,
|
|
11982
12048
|
secureStoreConfigSchema,
|
|
11983
12049
|
secureStoreCustomBackendSchema,
|
package/jwks/jwks.service.d.ts
CHANGED
|
@@ -57,7 +57,8 @@ export declare class JwksService {
|
|
|
57
57
|
* 1) inline jwks (if provided) → cache & return
|
|
58
58
|
* 2) cached & fresh (TTL) → return
|
|
59
59
|
* 3) explicit jwksUri → fetch, cache, return
|
|
60
|
-
* 4)
|
|
60
|
+
* 4) `<issuer>/.well-known/jwks.json` → fetch, cache, return
|
|
61
|
+
* 5) discover jwks_uri → the issuer's OAuth authorization server
|
|
61
62
|
* metadata (RFC 8414), else its OpenID configuration (OpenID Connect
|
|
62
63
|
* Discovery 1.0 §4, where Google, Okta, Auth0 and Entra publish it),
|
|
63
64
|
* then fetch jwks_uri, cache, return
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jwks.service.d.ts","sourceRoot":"","sources":["../../src/jwks/jwks.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAuD,KAAK,aAAa,EAAY,MAAM,MAAM,CAAC;AAczG,OAAO,EAAE,KAAK,kBAAkB,EAAE,KAAK,iBAAiB,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAgDlG,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA+C;IAEpE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IACpC,OAAO,CAAC,eAAe,CAAqB;IAG5C,OAAO,CAAC,eAAe,CAKrB;IAGF,OAAO,CAAC,YAAY,CAAiE;IAGrF,OAAO,CAAC,cAAc,CAAS;IAE/B,OAAO,CAAC,cAAc,CAA4B;IAElD,OAAO,CAAC,cAAc,CAAC,CAAiB;gBAE5B,IAAI,CAAC,EAAE,kBAAkB;IAcrC;;;OAGG;YACW,iBAAiB;IAc/B,mFAAmF;IAC7E,aAAa,IAAI,OAAO,CAAC,aAAa,CAAC;IAQ7C;;;OAGG;IACG,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,iBAAiB,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC;IAmEnG;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,mBAAmB;IAe3B;;OAEG;IACH,OAAO,CAAC,cAAc;IAatB;;;OAGG;YACW,iBAAiB;IAwG/B;;OAEG;IACH,OAAO,CAAC,eAAe;IAuBvB,kEAAkE;IAClE,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa;IAIvD
|
|
1
|
+
{"version":3,"file":"jwks.service.d.ts","sourceRoot":"","sources":["../../src/jwks/jwks.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAuD,KAAK,aAAa,EAAY,MAAM,MAAM,CAAC;AAczG,OAAO,EAAE,KAAK,kBAAkB,EAAE,KAAK,iBAAiB,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAgDlG,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA+C;IAEpE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IACpC,OAAO,CAAC,eAAe,CAAqB;IAG5C,OAAO,CAAC,eAAe,CAKrB;IAGF,OAAO,CAAC,YAAY,CAAiE;IAGrF,OAAO,CAAC,cAAc,CAAS;IAE/B,OAAO,CAAC,cAAc,CAA4B;IAElD,OAAO,CAAC,cAAc,CAAC,CAAiB;gBAE5B,IAAI,CAAC,EAAE,kBAAkB;IAcrC;;;OAGG;YACW,iBAAiB;IAc/B,mFAAmF;IAC7E,aAAa,IAAI,OAAO,CAAC,aAAa,CAAC;IAQ7C;;;OAGG;IACG,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,iBAAiB,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC;IAmEnG;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,mBAAmB;IAe3B;;OAEG;IACH,OAAO,CAAC,cAAc;IAatB;;;OAGG;YACW,iBAAiB;IAwG/B;;OAEG;IACH,OAAO,CAAC,eAAe;IAuBvB,kEAAkE;IAClE,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa;IAIvD;;;;;;;;;;OAUG;IACG,kBAAkB,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IAgDpF,yEAAyE;IACnE,mBAAmB,IAAI,OAAO,CAAC,aAAa,CAAC;IAKnD,wEAAwE;IAClE,yBAAyB,IAAI,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,OAAO,aAAa,EAAE,SAAS,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;YAShG,YAAY;YAaZ,cAAc;YAQd,SAAS;YAgET,qBAAqB;YAyBrB,yBAAyB;IA+DvC,OAAO,CAAC,WAAW;CAgBpB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@frontmcp/auth",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.2",
|
|
4
4
|
"description": "FrontMCP Auth - Authentication, session management, and credential vault",
|
|
5
5
|
"author": "AgentFront <info@agentfront.dev>",
|
|
6
6
|
"homepage": "https://docs.agentfront.dev",
|
|
@@ -47,8 +47,8 @@
|
|
|
47
47
|
"node": ">=24.0.0"
|
|
48
48
|
},
|
|
49
49
|
"peerDependencies": {
|
|
50
|
-
"@frontmcp/lazy-zod": "1.9.
|
|
51
|
-
"@frontmcp/storage-sqlite": "1.9.
|
|
50
|
+
"@frontmcp/lazy-zod": "1.9.2",
|
|
51
|
+
"@frontmcp/storage-sqlite": "1.9.2",
|
|
52
52
|
"@vercel/kv": "^3.0.0",
|
|
53
53
|
"ioredis": "^5.0.0"
|
|
54
54
|
},
|
|
@@ -64,8 +64,8 @@
|
|
|
64
64
|
}
|
|
65
65
|
},
|
|
66
66
|
"dependencies": {
|
|
67
|
-
"@frontmcp/di": "1.9.
|
|
68
|
-
"@frontmcp/utils": "1.9.
|
|
67
|
+
"@frontmcp/di": "1.9.2",
|
|
68
|
+
"@frontmcp/utils": "1.9.2",
|
|
69
69
|
"jose": "^6.0.0"
|
|
70
70
|
},
|
|
71
71
|
"devDependencies": {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-token.utils.d.ts","sourceRoot":"","sources":["../../../src/session/utils/auth-token.utils.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAE5D,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAGxD;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMlE;AAkBD,oDAAoD;AACpD,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,
|
|
1
|
+
{"version":3,"file":"auth-token.utils.d.ts","sourceRoot":"","sources":["../../../src/session/utils/auth-token.utils.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAE5D,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAGxD;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMlE;AAkBD,oDAAoD;AACpD,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAoB1E;AAED,uEAAuE;AACvE,MAAM,WAAW,4BAA4B;IAC3C,oEAAoE;IACpE,MAAM,EAAE,MAAM,CAAC;IACf,8DAA8D;IAC9D,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,4BAA4B,EACrC,WAAW,EAAE,MAAM,GAClB;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAQ3D;AAED,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAItE"}
|
package/utils/index.d.ts
CHANGED
|
@@ -8,4 +8,5 @@ export type { AudienceValidationResult, AudienceValidatorOptions } from './audie
|
|
|
8
8
|
export { deriveAuthorizationId } from './authorization-id.utils';
|
|
9
9
|
export { advertisedScopes, DEFAULT_ALLOWED_SCOPES, grantScopes, resourceScopesFor, type ResourceScopeOptions, } from './scope-grant.utils';
|
|
10
10
|
export { isLoopbackRedirectUri } from './redirect-uri.utils';
|
|
11
|
+
export { scopesFromClaims } from './token-scopes.utils';
|
|
11
12
|
//# sourceMappingURL=index.d.ts.map
|
package/utils/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,oBAAoB,EACpB,WAAW,EACX,uBAAuB,EACvB,uBAAuB,EACvB,4BAA4B,EAC5B,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,0BAA0B,CAAC;AAClC,YAAY,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAExF,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAE/F,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,WAAW,EACX,iBAAiB,EACjB,KAAK,oBAAoB,GAC1B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,oBAAoB,EACpB,WAAW,EACX,uBAAuB,EACvB,uBAAuB,EACvB,4BAA4B,EAC5B,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,0BAA0B,CAAC;AAClC,YAAY,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAExF,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAE/F,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,WAAW,EACX,iBAAiB,EACjB,KAAK,oBAAoB,GAC1B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The scopes a token's claims grant: `scope` (RFC 9068 §2.2.3) and `scp` (Entra ID, Okta), each as
|
|
3
|
+
* a space-delimited string or an array, merged without duplicates.
|
|
4
|
+
*
|
|
5
|
+
* @param claims The token's claims (a JWT payload, or the verified user claim built from it).
|
|
6
|
+
*/
|
|
7
|
+
export declare function scopesFromClaims(claims: {
|
|
8
|
+
scope?: unknown;
|
|
9
|
+
scp?: unknown;
|
|
10
|
+
} | undefined): string[];
|
|
11
|
+
//# sourceMappingURL=token-scopes.utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-scopes.utils.d.ts","sourceRoot":"","sources":["../../src/utils/token-scopes.utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,GAAG,MAAM,EAAE,CAOjG"}
|