@frontmcp/auth 1.11.1 → 1.11.3
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/README.md +2 -2
- package/authorities/authorities.context.d.ts.map +1 -1
- package/authorities/authorities.engine.d.ts +1 -1
- package/authorities/authorities.engine.d.ts.map +1 -1
- package/authorities/authorities.evaluator.d.ts.map +1 -1
- package/authorities/authorities.profiles.d.ts +1 -1
- package/authorities/authorities.profiles.d.ts.map +1 -1
- package/authorities/authorities.registry.d.ts +1 -1
- package/authorities/authorities.registry.d.ts.map +1 -1
- package/authorities/authorities.scope-mapping.d.ts +1 -1
- package/authorities/authorities.scope-mapping.d.ts.map +1 -1
- package/authorities/authorities.types.d.ts +4 -0
- package/authorities/authorities.types.d.ts.map +1 -1
- package/authorization/orchestrated.accessor.d.ts.map +1 -1
- package/authorization/public.authorization.d.ts.map +1 -1
- package/authorization/transparent.authorization.d.ts +1 -1
- package/authorization/transparent.authorization.d.ts.map +1 -1
- package/browser/authorities/authorities.context.mjs +3 -1
- package/browser/authorities/authorities.engine.mjs +32 -33
- package/browser/authorities/authorities.evaluator.mjs +42 -16
- package/browser/authorization/dcr-client.registry.mjs +1 -1
- package/browser/authorization/public.authorization.mjs +1 -1
- package/browser/authorization/transparent.authorization.mjs +1 -1
- package/browser/cimd/cimd-client-assertion.mjs +108 -0
- package/browser/cimd/cimd-redis.cache.mjs +5 -3
- package/browser/cimd/cimd.errors.mjs +11 -0
- package/browser/cimd/cimd.service.mjs +127 -31
- package/browser/cimd/cimd.types.mjs +15 -10
- package/browser/cimd/index.mjs +13 -1
- package/browser/errors/auth-internal.error.mjs +3 -2
- package/browser/errors/auth-internal.errors.mjs +8 -1
- package/browser/errors/index.mjs +2 -0
- package/browser/index.mjs +21 -1
- package/browser/jwks/index.mjs +2 -0
- package/browser/jwks/jwks.service.mjs +22 -103
- package/browser/jwks/local-token-keys.mjs +155 -0
- package/browser/options/public.schema.mjs +7 -4
- package/browser/options/shared.schemas.mjs +38 -13
- package/browser/session/federated-auth.session.mjs +2 -0
- package/browser/session/incremental-auth-ticket.mjs +24 -1
- package/browser/session/index.mjs +4 -0
- package/browser/session/redis-session.store.mjs +3 -3
- package/browser/session/session-crypto.mjs +4 -4
- package/browser/session/storage/storage-authorization-vault.mjs +3 -1
- package/browser/session/token.vault.mjs +1 -1
- package/browser/session/utils/index.mjs +9 -1
- package/browser/session/utils/session-crypto.utils.mjs +4 -0
- package/browser/ui/index.mjs +2 -0
- package/browser/ui/templates.mjs +65 -11
- package/browser/upstream/index.mjs +6 -0
- package/browser/upstream/upstream-client-registration.mjs +273 -0
- package/cimd/cimd-client-assertion.d.ts +43 -0
- package/cimd/cimd-client-assertion.d.ts.map +1 -0
- package/cimd/cimd-redis.cache.d.ts +2 -2
- package/cimd/cimd-redis.cache.d.ts.map +1 -1
- package/cimd/cimd.cache.d.ts +1 -1
- package/cimd/cimd.cache.d.ts.map +1 -1
- package/cimd/cimd.errors.d.ts +14 -0
- package/cimd/cimd.errors.d.ts.map +1 -1
- package/cimd/cimd.service.d.ts +37 -2
- package/cimd/cimd.service.d.ts.map +1 -1
- package/cimd/cimd.types.d.ts +6 -0
- package/cimd/cimd.types.d.ts.map +1 -1
- package/cimd/index.d.ts +3 -2
- package/cimd/index.d.ts.map +1 -1
- package/errors/auth-internal.error.d.ts +4 -5
- package/errors/auth-internal.error.d.ts.map +1 -1
- package/errors/auth-internal.errors.d.ts +8 -0
- package/errors/auth-internal.errors.d.ts.map +1 -1
- package/errors/index.d.ts +1 -1
- package/errors/index.d.ts.map +1 -1
- package/esm/index.mjs +54 -14
- package/esm/package.json +5 -5
- package/index.d.ts +12 -10
- package/index.d.ts.map +1 -1
- package/index.js +58 -18
- package/jwks/index.d.ts +2 -0
- package/jwks/index.d.ts.map +1 -1
- package/jwks/jwks.service.d.ts +12 -12
- package/jwks/jwks.service.d.ts.map +1 -1
- package/jwks/jwks.types.d.ts +2 -0
- package/jwks/jwks.types.d.ts.map +1 -1
- package/jwks/local-token-keys.d.ts +41 -0
- package/jwks/local-token-keys.d.ts.map +1 -0
- package/options/interfaces.d.ts +64 -15
- package/options/interfaces.d.ts.map +1 -1
- package/options/public.schema.d.ts.map +1 -1
- package/options/shared.schemas.d.ts.map +1 -1
- package/package.json +5 -5
- package/session/authorization.store.d.ts +9 -2
- package/session/authorization.store.d.ts.map +1 -1
- package/session/federated-auth.session.d.ts +8 -0
- package/session/federated-auth.session.d.ts.map +1 -1
- package/session/incremental-auth-ticket.d.ts +10 -0
- package/session/incremental-auth-ticket.d.ts.map +1 -1
- package/session/index.d.ts +2 -2
- package/session/index.d.ts.map +1 -1
- package/session/redis-session.store.d.ts +1 -1
- package/session/redis-session.store.d.ts.map +1 -1
- package/session/session-crypto.d.ts.map +1 -1
- package/session/storage/in-memory-authorization-vault.d.ts.map +1 -1
- package/session/storage/storage-authorization-vault.d.ts +2 -2
- package/session/storage/storage-authorization-vault.d.ts.map +1 -1
- package/session/storage/storage-token-store.d.ts +2 -2
- package/session/storage/storage-token-store.d.ts.map +1 -1
- package/session/token.refresh.d.ts.map +1 -1
- package/session/utils/index.d.ts +1 -1
- package/session/utils/index.d.ts.map +1 -1
- package/session/utils/session-crypto.utils.d.ts +5 -0
- package/session/utils/session-crypto.utils.d.ts.map +1 -1
- package/ui/index.d.ts +2 -2
- package/ui/index.d.ts.map +1 -1
- package/ui/templates.d.ts +33 -0
- package/ui/templates.d.ts.map +1 -1
- package/upstream/index.d.ts +3 -0
- package/upstream/index.d.ts.map +1 -0
- package/upstream/upstream-client-registration.d.ts +50 -0
- package/upstream/upstream-client-registration.d.ts.map +1 -0
- package/vault/auth-providers.accessor.d.ts +1 -1
- package/vault/auth-providers.accessor.d.ts.map +1 -1
- package/vault/auth-providers.registry.d.ts +1 -1
- package/vault/auth-providers.registry.d.ts.map +1 -1
- package/vault/credential-cache.d.ts +1 -1
- package/vault/credential-cache.d.ts.map +1 -1
- package/vault/credential-loaders/eager-loader.d.ts +2 -2
- package/vault/credential-loaders/eager-loader.d.ts.map +1 -1
package/README.md
CHANGED
|
@@ -98,9 +98,9 @@ export default class Server {}
|
|
|
98
98
|
- **Auth modes**: `authOptionsSchema` and the option types of each mode. See [Auth modes](https://frontmcp.dev/reference/auth/modes).
|
|
99
99
|
- **Local mode**: FrontMCP as an OAuth 2.1 authorization server, with PKCE (Proof Key for Code Exchange), dynamic client registration and refresh tokens. See [Local auth](https://frontmcp.dev/reference/auth/local).
|
|
100
100
|
- **Remote mode**: users sign in at your identity provider, and FrontMCP issues the tokens. See [Remote and proxied auth](https://frontmcp.dev/reference/auth/remote).
|
|
101
|
-
- **Upstream providers**: several OAuth providers linked in one sign-in. See [Upstream providers](https://frontmcp.dev/reference/auth/upstream-providers).
|
|
101
|
+
- **Upstream providers**: several OAuth providers linked in one sign-in, on one picker page or one provider per page (`incrementalAuth.showAllAppsAtOnce: false`, `buildFederatedStepPage`). See [Upstream providers](https://frontmcp.dev/reference/auth/upstream-providers).
|
|
102
102
|
- **Token checks**: JWT verification against a JSON Web Key Set (JWKS), and audience and scope checks (`JwksService`, `validateAudience`). See [Tokens and sessions](https://frontmcp.dev/reference/auth/tokens).
|
|
103
|
-
- **CIMD (Client ID Metadata Documents)**: clients whose `client_id` is the URL of a metadata document (`CimdService`). See [Client ID metadata](https://frontmcp.dev/reference/auth/cimd).
|
|
103
|
+
- **CIMD (Client ID Metadata Documents)**: clients whose `client_id` is the URL of a metadata document (`CimdService`). A public client declares `token_endpoint_auth_method: 'none'`; a confidential one declares `private_key_jwt` and authenticates at the token endpoint with a client assertion signed by a key from its `jwks` / `jwks_uri` (RFC 7523, `CimdService.verifyClientAssertion`). See [Client ID metadata](https://frontmcp.dev/reference/auth/cimd).
|
|
104
104
|
- **Authorities**: rules on tools, resources, prompts, skills and agents, from roles, permissions, token claims, the call's arguments or your own code (`AuthorityDeniedError`). See [Authorities](https://frontmcp.dev/reference/auth/authorities).
|
|
105
105
|
- **Credential vault**: per-user credentials that tools read with `this.credentials`, and that users can add to mid-session. See [Progressive auth](https://frontmcp.dev/reference/auth/progressive).
|
|
106
106
|
- **Sign-in pages**: the built-in sign-in, consent and error pages, and `escapeHtml`, `buildLoginPage` and `baseLayout` for your own. See [Custom login UI](https://frontmcp.dev/reference/auth/login-ui).
|
|
@@ -1 +1 @@
|
|
|
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;
|
|
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;CAwEhC"}
|
|
@@ -76,7 +76,7 @@ export declare class AuthoritiesEngine {
|
|
|
76
76
|
*/
|
|
77
77
|
private evaluateAnyOf;
|
|
78
78
|
/**
|
|
79
|
-
* not combinator — inverts the nested policy result.
|
|
79
|
+
* not combinator — inverts the nested policy result; an unresolved denial stays a denial.
|
|
80
80
|
*/
|
|
81
81
|
private evaluateNot;
|
|
82
82
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authorities.engine.d.ts","sourceRoot":"","sources":["../../src/authorities/authorities.engine.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,4BAA4B,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AACvG,OAAO,KAAK,EACV,4BAA4B,EAC5B,mBAAmB,EACnB,yBAAyB,EACzB,iBAAiB,EAElB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"authorities.engine.d.ts","sourceRoot":"","sources":["../../src/authorities/authorities.engine.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,4BAA4B,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AACvG,OAAO,KAAK,EACV,4BAA4B,EAC5B,mBAAmB,EACnB,yBAAyB,EACzB,iBAAiB,EAElB,MAAM,qBAAqB,CAAC;AA2C7B;;;;;;;;;GASG;AACH,qBAAa,iBAAiB;IAK1B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAL7B,iGAAiG;IACjG,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAmC;gBAG7C,QAAQ,EAAE,0BAA0B,EACpC,UAAU,EAAE,4BAA4B;IAG3D;;;;OAIG;IACH,gBAAgB,CAAC,WAAW,EAAE,OAAO,GAAG,MAAM,EAAE;IAShD;;;OAGG;IACH,mBAAmB,IAAI,MAAM,EAAE;IAM/B;;;;OAIG;IACG,QAAQ,CAAC,WAAW,EAAE,mBAAmB,EAAE,GAAG,EAAE,4BAA4B,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAkB/G;;OAEG;YACW,eAAe;IAyB7B,yEAAyE;IACzE,OAAO,CAAC,UAAU;IAUlB;;OAEG;YACW,oBAAoB;IAIlC;;OAEG;YACW,cAAc;IA+C5B;;OAEG;IACH,OAAO,CAAC,cAAc;IA4BtB;;OAEG;YACW,cAAc;IAkB5B;;;;OAIG;YACW,cAAc;IAyB5B;;OAEG;YACW,aAAa;IAO3B;;OAEG;YACW,aAAa;IA4B3B;;OAEG;YACW,WAAW;IAiBzB;;;OAGG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,yBAAyB,GAAG,SAAS;CAGpE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authorities.evaluator.d.ts","sourceRoot":"","sources":["../../src/authorities/authorities.evaluator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"authorities.evaluator.d.ts","sourceRoot":"","sources":["../../src/authorities/authorities.evaluator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EACV,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;AAgHD;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,4BAA4B,GAAG,iBAAiB,CAmDrG;AAMD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,4BAA4B,GAAG,MAAM,GAAG,SAAS,CAc3G;AAiDD;;;GAGG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,WAAW,GAAG,WAAW,EAAE,EACnC,GAAG,EAAE,4BAA4B,GAChC,OAAO,CAAC,iBAAiB,CAAC,CAY5B"}
|
|
@@ -33,7 +33,7 @@ export interface AuthoritiesClaimsMapping {
|
|
|
33
33
|
roles?: string;
|
|
34
34
|
/** Dot-path to permissions array/string in JWT claims */
|
|
35
35
|
permissions?: string;
|
|
36
|
-
/** Dot-path to tenant/org ID in JWT claims */
|
|
36
|
+
/** Dot-path to tenant/org ID in JWT claims; a string value becomes `user.tenantId` for rules and guards */
|
|
37
37
|
tenantId?: string;
|
|
38
38
|
/** Dot-path to user ID in JWT claims (default: 'sub') */
|
|
39
39
|
userId?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authorities.profiles.d.ts","sourceRoot":"","sources":["../../src/authorities/authorities.profiles.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAMjH;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,WAAW,wBAAwB;IACvC,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,
|
|
1
|
+
{"version":3,"file":"authorities.profiles.d.ts","sourceRoot":"","sources":["../../src/authorities/authorities.profiles.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAMjH;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,WAAW,wBAAwB;IACvC,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2GAA2G;IAC3G,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mDAAmD;IACnD,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CACnC;AAMD;;;;;GAKG;AACH,MAAM,WAAW,uBAAuB;IACtC,0EAA0E;IAC1E,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACjC,kFAAkF;IAClF,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACvC,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACrC;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,sCAAsC;IACtC,aAAa,CAAC,EAAE,wBAAwB,CAAC;IACzC;;;OAGG;IACH,cAAc,CAAC,EAAE,gBAAgB,CAAC;IAClC,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC;IACrD;;;OAGG;IACH,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,qFAAqF;IACrF,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IAClD,sDAAsD;IACtD,YAAY,CAAC,EAAE,uBAAuB,CAAC;IACvC;;;;;OAKG;IACH,KAAK,CAAC,EAAE,OAAO,kCAAkC,EAAE,eAAe,EAAE,CAAC;CACtE"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* - AuthoritiesProfileRegistry: stores named authority profiles
|
|
5
5
|
* - AuthoritiesEvaluatorRegistry: stores custom evaluators
|
|
6
6
|
*/
|
|
7
|
-
import type {
|
|
7
|
+
import type { AuthoritiesEvaluator, AuthoritiesPolicyMetadata } from './authorities.types';
|
|
8
8
|
/**
|
|
9
9
|
* Registry for named authority profiles.
|
|
10
10
|
* Profiles map a string name to a policy, allowing
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authorities.registry.d.ts","sourceRoot":"","sources":["../../src/authorities/authorities.registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"authorities.registry.d.ts","sourceRoot":"","sources":["../../src/authorities/authorities.registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAM3F;;;;GAIG;AACH,qBAAa,0BAA0B;IACrC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgD;IAEzE;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,yBAAyB,GAAG,IAAI;IAI/D;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,yBAAyB,CAAC,GAAG,IAAI;IAMtE;;;OAGG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,yBAAyB,GAAG,SAAS;IAI5D;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B;;OAEG;IACH,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,yBAAyB,CAAC;IAQnD;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI7B;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd;AAMD;;;GAGG;AACH,qBAAa,4BAA4B;IACvC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA2C;IAEtE;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,oBAAoB,GAAG,IAAI;IAI7D;;OAEG;IACH,WAAW,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,GAAG,IAAI;IAMnE;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,oBAAoB,GAAG,SAAS;IAInD;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI7B;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
* Resolves required OAuth scopes from a structured authority denial
|
|
5
5
|
* using explicit scopeMapping configuration.
|
|
6
6
|
*/
|
|
7
|
-
import type { AuthoritiesDenial, AuthoritiesMetadata } from './authorities.types';
|
|
8
7
|
import type { AuthoritiesScopeMapping } from './authorities.profiles';
|
|
8
|
+
import type { AuthoritiesDenial, AuthoritiesMetadata } from './authorities.types';
|
|
9
9
|
/**
|
|
10
10
|
* Resolve required OAuth scopes from a structured denial and scopeMapping.
|
|
11
11
|
* Returns undefined if no mapping matches the denial.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authorities.scope-mapping.d.ts","sourceRoot":"","sources":["../../src/authorities/authorities.scope-mapping.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"authorities.scope-mapping.d.ts","sourceRoot":"","sources":["../../src/authorities/authorities.scope-mapping.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAElF;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,uBAAuB,EAChC,WAAW,EAAE,mBAAmB,GAC/B,MAAM,EAAE,GAAG,SAAS,CAkCtB"}
|
|
@@ -216,6 +216,8 @@ export interface AuthoritiesDenial {
|
|
|
216
216
|
export interface AuthoritiesResult {
|
|
217
217
|
/** Whether access was granted */
|
|
218
218
|
granted: boolean;
|
|
219
|
+
/** With `granted: false`: the check couldn't be decided (e.g. a missing `{ fromInput }` value), so `not` keeps the denial */
|
|
220
|
+
unresolved?: boolean;
|
|
219
221
|
/** Human-readable reason for denial (kept for backward compatibility) */
|
|
220
222
|
deniedBy?: string;
|
|
221
223
|
/** Structured denial data (machine-parsable) */
|
|
@@ -257,6 +259,8 @@ export interface AuthoritiesEvaluationContext {
|
|
|
257
259
|
permissions: string[];
|
|
258
260
|
/** Raw JWT claims */
|
|
259
261
|
claims: Record<string, unknown>;
|
|
262
|
+
/** Tenant or organization id, read from the claim `claimsMapping.tenantId` names; undefined without one */
|
|
263
|
+
tenantId?: string;
|
|
260
264
|
};
|
|
261
265
|
/** Tool/prompt input arguments */
|
|
262
266
|
input: Record<string, unknown>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authorities.types.d.ts","sourceRoot":"","sources":["../../src/authorities/authorities.types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"authorities.types.d.ts","sourceRoot":"","sources":["../../src/authorities/authorities.types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrated.accessor.d.ts","sourceRoot":"","sources":["../../src/authorization/orchestrated.accessor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"orchestrated.accessor.d.ts","sourceRoot":"","sources":["../../src/authorization/orchestrated.accessor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"public.authorization.d.ts","sourceRoot":"","sources":["../../src/authorization/public.authorization.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"public.authorization.d.ts","sourceRoot":"","sources":["../../src/authorization/public.authorization.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAoC,MAAM,uBAAuB,CAAC;AAExF;;GAEG;AACH,MAAM,WAAW,4BAA4B;IAC3C;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAElB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,YAAY,CAAC,EAAE,KAAK,GAAG,MAAM,EAAE,CAAC;IAEhC;;;OAGG;IACH,cAAc,CAAC,EAAE,KAAK,GAAG,MAAM,EAAE,CAAC;CACnC;AAED;;;;;;;;GAQG;AACH,qBAAa,mBAAoB,SAAQ,iBAAiB;IACxD,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAY;IAEnC;;OAEG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAEzB,OAAO;IAKP;;;;;;;;;;;;;;OAcG;IACH,MAAM,CAAC,MAAM,CAAC,GAAG,GAAE,4BAAiC,GAAG,mBAAmB;IA6D1E;;;;OAIG;IACG,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAOrD;;OAEG;IACH,IAAI,cAAc,IAAI,OAAO,CAE5B;IAED;;OAEG;IACH,IAAI,gBAAgB,IAAI,OAAO,CAE9B;IAED;;OAEG;IACM,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAQ/C;;OAEG;IACM,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;CAOpD"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AuthorizationBase } from './authorization.class';
|
|
2
|
-
import type {
|
|
2
|
+
import type { AuthMode, AuthorizationCreateCtx } from './authorization.types';
|
|
3
3
|
/**
|
|
4
4
|
* Verified JWT payload from transparent auth provider
|
|
5
5
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transparent.authorization.d.ts","sourceRoot":"","sources":["../../src/authorization/transparent.authorization.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"transparent.authorization.d.ts","sourceRoot":"","sources":["../../src/authorization/transparent.authorization.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,sBAAsB,EAAY,MAAM,uBAAuB,CAAC;AAExF;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,yBAAyB;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,eAAe;IACf,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACxB,uCAAuC;IACvC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC1B,mBAAmB;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kBAAkB;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wBAAwB;IACxB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,iCAAiC;IAChD;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,OAAO,EAAE,0BAA0B,CAAC;IAEpC;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,eAAe,CAAC,EAAE,sBAAsB,CAAC,iBAAiB,CAAC,CAAC;IAC5D,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,iBAAiB,CAAC,EAAE,sBAAsB,CAAC,mBAAmB,CAAC,CAAC;IAChE,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,cAAc,CAAC,EAAE,sBAAsB,CAAC,gBAAgB,CAAC,CAAC;IAC1D,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;CAChC;AAED;;;;;;;;GAQG;AACH,qBAAa,wBAAyB,SAAQ,iBAAiB;IAC7D,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAiB;IAExC;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B;;OAEG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAE/B,OAAO;IAWP;;;;;;;;;;;;;;;;;OAiBG;IACH,MAAM,CAAC,iBAAiB,CAAC,GAAG,EAAE,iCAAiC,GAAG,wBAAwB;IA8C1F;;;;;;;;OAQG;IACG,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAOrD;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,WAAW;IAM1B;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAMtC;;OAEG;IACH,IAAI,MAAM,IAAI,MAAM,GAAG,SAAS,CAE/B;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAE5C;IAED;;OAEG;IACH,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;CAMlC"}
|
|
@@ -93,12 +93,14 @@ var AuthoritiesContextBuilder = class {
|
|
|
93
93
|
permissions = toStringArray(user["permissions"] ?? []);
|
|
94
94
|
}
|
|
95
95
|
const mappedSub = this.claimsMapping?.userId ? resolveDotPath(rawClaims, this.claimsMapping.userId) : void 0;
|
|
96
|
+
const mappedTenantId = this.claimsMapping?.tenantId ? resolveDotPath(rawClaims, this.claimsMapping.tenantId) : void 0;
|
|
96
97
|
return {
|
|
97
98
|
user: {
|
|
98
99
|
sub: signedInSubject(user.sub, mappedSub),
|
|
99
100
|
roles,
|
|
100
101
|
permissions,
|
|
101
|
-
claims: rawClaims
|
|
102
|
+
claims: rawClaims,
|
|
103
|
+
tenantId: typeof mappedTenantId === "string" && mappedTenantId !== "" ? mappedTenantId : void 0
|
|
102
104
|
},
|
|
103
105
|
input,
|
|
104
106
|
env,
|
|
@@ -15,6 +15,17 @@ function invalidRule(problems, policies = []) {
|
|
|
15
15
|
evaluatedPolicies: policies
|
|
16
16
|
};
|
|
17
17
|
}
|
|
18
|
+
async function evaluateEvery(items, evaluateItem, evaluatedPolicies = []) {
|
|
19
|
+
let unresolved;
|
|
20
|
+
for (const item of items) {
|
|
21
|
+
const result = await evaluateItem(item);
|
|
22
|
+
evaluatedPolicies.push(...result.evaluatedPolicies);
|
|
23
|
+
if (result.granted) continue;
|
|
24
|
+
if (!result.unresolved) return { ...result, evaluatedPolicies };
|
|
25
|
+
unresolved ??= result;
|
|
26
|
+
}
|
|
27
|
+
return unresolved ? { ...unresolved, evaluatedPolicies } : { granted: true, evaluatedPolicies };
|
|
28
|
+
}
|
|
18
29
|
var AuthoritiesEngine = class {
|
|
19
30
|
constructor(profiles, evaluators) {
|
|
20
31
|
this.profiles = profiles;
|
|
@@ -98,15 +109,7 @@ var AuthoritiesEngine = class {
|
|
|
98
109
|
* Evaluate an array of profile names (AND semantics).
|
|
99
110
|
*/
|
|
100
111
|
async evaluateProfileArray(names, ctx) {
|
|
101
|
-
|
|
102
|
-
for (const name of names) {
|
|
103
|
-
const result = await this.evaluateProfile(name, ctx);
|
|
104
|
-
allPolicies.push(...result.evaluatedPolicies);
|
|
105
|
-
if (!result.granted) {
|
|
106
|
-
return { ...result, evaluatedPolicies: allPolicies };
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
return { granted: true, evaluatedPolicies: allPolicies };
|
|
112
|
+
return evaluateEvery(names, (name) => this.evaluateProfile(name, ctx));
|
|
110
113
|
}
|
|
111
114
|
/**
|
|
112
115
|
* Evaluate an inline policy object.
|
|
@@ -152,7 +155,7 @@ var AuthoritiesEngine = class {
|
|
|
152
155
|
combineResults(results, operator) {
|
|
153
156
|
const allPolicies = results.flatMap((r) => r.evaluatedPolicies);
|
|
154
157
|
if (operator === "AND") {
|
|
155
|
-
const denied = results.find((r) => !r.granted);
|
|
158
|
+
const denied = results.find((r) => !r.granted && !r.unresolved) ?? results.find((r) => !r.granted);
|
|
156
159
|
if (denied) {
|
|
157
160
|
return { ...denied, evaluatedPolicies: allPolicies };
|
|
158
161
|
}
|
|
@@ -162,10 +165,12 @@ var AuthoritiesEngine = class {
|
|
|
162
165
|
if (anyGranted) {
|
|
163
166
|
return { granted: true, evaluatedPolicies: allPolicies };
|
|
164
167
|
}
|
|
165
|
-
const
|
|
168
|
+
const unresolved = results.find((r) => r.unresolved);
|
|
169
|
+
const reported = unresolved ?? results.find((r) => !r.granted);
|
|
166
170
|
return {
|
|
167
171
|
granted: false,
|
|
168
|
-
|
|
172
|
+
...unresolved && { unresolved: true },
|
|
173
|
+
deniedBy: reported?.deniedBy ?? "all policies denied (OR)",
|
|
169
174
|
evaluatedPolicies: allPolicies
|
|
170
175
|
};
|
|
171
176
|
}
|
|
@@ -173,23 +178,18 @@ var AuthoritiesEngine = class {
|
|
|
173
178
|
* Evaluate custom evaluators.
|
|
174
179
|
*/
|
|
175
180
|
async evaluateCustom(custom, ctx) {
|
|
176
|
-
|
|
177
|
-
for (const [name, config] of Object.entries(custom)) {
|
|
181
|
+
return evaluateEvery(Object.entries(custom), async ([name, config]) => {
|
|
178
182
|
const evaluator = this.evaluators.get(name);
|
|
179
183
|
if (!evaluator) {
|
|
180
184
|
return {
|
|
181
185
|
granted: false,
|
|
182
186
|
deniedBy: `custom evaluator '${name}' is not registered`,
|
|
183
|
-
evaluatedPolicies: [
|
|
187
|
+
evaluatedPolicies: [`custom.${name}`]
|
|
184
188
|
};
|
|
185
189
|
}
|
|
186
190
|
const result = await evaluator.evaluate(config, ctx);
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
return { ...result, evaluatedPolicies: allPolicies };
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
return { granted: true, evaluatedPolicies: allPolicies };
|
|
191
|
+
return { ...result, evaluatedPolicies: [`custom.${name}`, ...result.evaluatedPolicies] };
|
|
192
|
+
});
|
|
193
193
|
}
|
|
194
194
|
/**
|
|
195
195
|
* Evaluate async guard functions in sequence.
|
|
@@ -216,15 +216,7 @@ var AuthoritiesEngine = class {
|
|
|
216
216
|
* allOf combinator \u2014 all nested policies must pass.
|
|
217
217
|
*/
|
|
218
218
|
async evaluateAllOf(policies, ctx) {
|
|
219
|
-
|
|
220
|
-
for (const policy of policies) {
|
|
221
|
-
const result = await this.evaluatePolicy(policy, ctx);
|
|
222
|
-
allPolicies.push(...result.evaluatedPolicies);
|
|
223
|
-
if (!result.granted) {
|
|
224
|
-
return { ...result, evaluatedPolicies: allPolicies };
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
return { granted: true, evaluatedPolicies: allPolicies };
|
|
219
|
+
return evaluateEvery(policies, (policy) => this.evaluatePolicy(policy, ctx), ["allOf"]);
|
|
228
220
|
}
|
|
229
221
|
/**
|
|
230
222
|
* anyOf combinator \u2014 at least one nested policy must pass.
|
|
@@ -232,6 +224,7 @@ var AuthoritiesEngine = class {
|
|
|
232
224
|
async evaluateAnyOf(policies, ctx) {
|
|
233
225
|
const allPolicies = ["anyOf"];
|
|
234
226
|
let lastDenied;
|
|
227
|
+
let unresolved;
|
|
235
228
|
for (const policy of policies) {
|
|
236
229
|
const result = await this.evaluatePolicy(policy, ctx);
|
|
237
230
|
allPolicies.push(...result.evaluatedPolicies);
|
|
@@ -239,19 +232,25 @@ var AuthoritiesEngine = class {
|
|
|
239
232
|
return { granted: true, evaluatedPolicies: allPolicies };
|
|
240
233
|
}
|
|
241
234
|
lastDenied = result;
|
|
235
|
+
if (result.unresolved) unresolved ??= result;
|
|
242
236
|
}
|
|
237
|
+
const reported = unresolved ?? lastDenied;
|
|
243
238
|
return {
|
|
244
239
|
granted: false,
|
|
245
|
-
|
|
246
|
-
|
|
240
|
+
...unresolved && { unresolved: true },
|
|
241
|
+
deniedBy: reported?.deniedBy ?? "no policies in anyOf",
|
|
242
|
+
denial: reported?.denial ?? { kind: "anyOf", path: "anyOf" },
|
|
247
243
|
evaluatedPolicies: allPolicies
|
|
248
244
|
};
|
|
249
245
|
}
|
|
250
246
|
/**
|
|
251
|
-
* not combinator \u2014 inverts the nested policy result.
|
|
247
|
+
* not combinator \u2014 inverts the nested policy result; an unresolved denial stays a denial.
|
|
252
248
|
*/
|
|
253
249
|
async evaluateNot(policy, ctx) {
|
|
254
250
|
const result = await this.evaluatePolicy(policy, ctx);
|
|
251
|
+
if (!result.granted && result.unresolved) {
|
|
252
|
+
return { ...result, evaluatedPolicies: ["not", ...result.evaluatedPolicies] };
|
|
253
|
+
}
|
|
255
254
|
return {
|
|
256
255
|
granted: !result.granted,
|
|
257
256
|
deniedBy: result.granted ? "not: inner policy was granted (negated to denied)" : void 0,
|
|
@@ -72,11 +72,25 @@ function resolveValue(value, ctx) {
|
|
|
72
72
|
}
|
|
73
73
|
return value;
|
|
74
74
|
}
|
|
75
|
+
function describeMissingValue(value) {
|
|
76
|
+
const reference = value ?? {};
|
|
77
|
+
if (typeof reference["fromInput"] === "string") return `input '${reference["fromInput"]}'`;
|
|
78
|
+
if (typeof reference["fromClaims"] === "string") return `claim '${reference["fromClaims"]}'`;
|
|
79
|
+
return "the value";
|
|
80
|
+
}
|
|
81
|
+
function unresolvedAttribute(policyPath, denialPath, path, value, actual) {
|
|
82
|
+
return {
|
|
83
|
+
granted: false,
|
|
84
|
+
unresolved: true,
|
|
85
|
+
deniedBy: `${policyPath}: '${path}' could not be checked: ${describeMissingValue(value)} is missing`,
|
|
86
|
+
denial: { kind: "attributes", path: denialPath, actual },
|
|
87
|
+
evaluatedPolicies: [policyPath]
|
|
88
|
+
};
|
|
89
|
+
}
|
|
75
90
|
function applyOperator(actual, op, expected) {
|
|
76
91
|
switch (op) {
|
|
77
|
-
// A missing expected value (e.g. an absent fromInput) never matches, even an absent actual value
|
|
78
92
|
case "eq":
|
|
79
|
-
return
|
|
93
|
+
return actual === expected;
|
|
80
94
|
case "neq":
|
|
81
95
|
return actual !== expected;
|
|
82
96
|
case "in":
|
|
@@ -114,23 +128,21 @@ function applyOperator(actual, op, expected) {
|
|
|
114
128
|
return false;
|
|
115
129
|
}
|
|
116
130
|
}
|
|
117
|
-
function evaluateCondition(condition, envelope, ctx) {
|
|
118
|
-
const actual = resolveDotPath(envelope, condition.path);
|
|
119
|
-
const expected = resolveValue(condition.value, ctx);
|
|
120
|
-
return applyOperator(actual, condition.op, expected);
|
|
121
|
-
}
|
|
122
131
|
var REDACTED_ENV_VALUE = "[redacted]";
|
|
123
132
|
function reportableActual(path, actual) {
|
|
124
133
|
return path === "env" || path.startsWith("env.") ? REDACTED_ENV_VALUE : actual;
|
|
125
134
|
}
|
|
126
135
|
function evaluateAbac(policy, ctx) {
|
|
127
136
|
const envelope = buildContextEnvelope(ctx);
|
|
137
|
+
let unresolved;
|
|
128
138
|
if (policy.match) {
|
|
129
139
|
for (const [path, expectedRaw] of Object.entries(policy.match)) {
|
|
130
140
|
const actual = resolveDotPath(envelope, path);
|
|
131
141
|
const expected = resolveValue(expectedRaw, ctx);
|
|
132
|
-
|
|
133
|
-
|
|
142
|
+
const reported = reportableActual(path, actual);
|
|
143
|
+
if (expected === void 0) {
|
|
144
|
+
unresolved ??= unresolvedAttribute("attributes.match", "attributes.match", path, expectedRaw, reported);
|
|
145
|
+
} else if (actual !== expected) {
|
|
134
146
|
return {
|
|
135
147
|
granted: false,
|
|
136
148
|
deniedBy: `attributes.match: '${path}' expected '${String(expected)}' but got '${String(reported)}'`,
|
|
@@ -143,19 +155,29 @@ function evaluateAbac(policy, ctx) {
|
|
|
143
155
|
if (policy.conditions) {
|
|
144
156
|
for (let i = 0; i < policy.conditions.length; i++) {
|
|
145
157
|
const condition = policy.conditions[i];
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
158
|
+
const denialPath = `attributes.conditions[${i}]`;
|
|
159
|
+
const actual = resolveDotPath(envelope, condition.path);
|
|
160
|
+
const expected = resolveValue(condition.value, ctx);
|
|
161
|
+
const reported = reportableActual(condition.path, actual);
|
|
162
|
+
if (expected === void 0) {
|
|
163
|
+
unresolved ??= unresolvedAttribute(
|
|
164
|
+
"attributes.conditions",
|
|
165
|
+
denialPath,
|
|
166
|
+
condition.path,
|
|
167
|
+
condition.value,
|
|
168
|
+
reported
|
|
169
|
+
);
|
|
170
|
+
} else if (!applyOperator(actual, condition.op, expected)) {
|
|
149
171
|
return {
|
|
150
172
|
granted: false,
|
|
151
173
|
deniedBy: `attributes.conditions: '${condition.path}' failed '${condition.op}' check against '${String(expected)}'`,
|
|
152
|
-
denial: { kind: "attributes", path:
|
|
174
|
+
denial: { kind: "attributes", path: denialPath, expected, actual: reported },
|
|
153
175
|
evaluatedPolicies: ["attributes.conditions"]
|
|
154
176
|
};
|
|
155
177
|
}
|
|
156
178
|
}
|
|
157
179
|
}
|
|
158
|
-
return { granted: true, evaluatedPolicies: ["attributes"] };
|
|
180
|
+
return unresolved ?? { granted: true, evaluatedPolicies: ["attributes"] };
|
|
159
181
|
}
|
|
160
182
|
function resolveResourceId(ref, ctx) {
|
|
161
183
|
if (typeof ref === "string") return ref;
|
|
@@ -183,6 +205,7 @@ async function evaluateSingleRebac(policy, ctx) {
|
|
|
183
205
|
if (resourceId === void 0) {
|
|
184
206
|
return {
|
|
185
207
|
granted: false,
|
|
208
|
+
unresolved: true,
|
|
186
209
|
deniedBy: `relationships: could not resolve resourceId for ${policy.resource}`,
|
|
187
210
|
denial: {
|
|
188
211
|
kind: "relationships",
|
|
@@ -210,11 +233,14 @@ async function evaluateSingleRebac(policy, ctx) {
|
|
|
210
233
|
}
|
|
211
234
|
async function evaluateRebac(policy, ctx) {
|
|
212
235
|
const policies = Array.isArray(policy) ? policy : [policy];
|
|
236
|
+
let unresolved;
|
|
213
237
|
for (const p of policies) {
|
|
214
238
|
const result = await evaluateSingleRebac(p, ctx);
|
|
215
|
-
if (
|
|
239
|
+
if (result.granted) continue;
|
|
240
|
+
if (!result.unresolved) return result;
|
|
241
|
+
unresolved ??= result;
|
|
216
242
|
}
|
|
217
|
-
return { granted: true, evaluatedPolicies: ["relationships"] };
|
|
243
|
+
return unresolved ?? { granted: true, evaluatedPolicies: ["relationships"] };
|
|
218
244
|
}
|
|
219
245
|
export {
|
|
220
246
|
evaluateAbac,
|
|
@@ -86,7 +86,7 @@ var DcrClientRegistry = class {
|
|
|
86
86
|
client_id: c.clientId,
|
|
87
87
|
client_secret: c.clientSecret,
|
|
88
88
|
token_endpoint_auth_method: c.tokenEndpointAuthMethod ?? "none",
|
|
89
|
-
grant_types: c.grantTypes ?? ["authorization_code"],
|
|
89
|
+
grant_types: c.grantTypes ?? ["authorization_code", "refresh_token"],
|
|
90
90
|
response_types: c.responseTypes ?? ["code"],
|
|
91
91
|
redirect_uris: c.redirectUris,
|
|
92
92
|
client_name: c.clientName,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// libs/auth/src/authorization/public.authorization.ts
|
|
2
2
|
import { randomUUID } from "@frontmcp/utils";
|
|
3
|
-
import { AuthorizationBase } from "./authorization.class.mjs";
|
|
4
3
|
import { TokenNotAvailableError } from "../errors/auth-internal.errors.mjs";
|
|
4
|
+
import { AuthorizationBase } from "./authorization.class.mjs";
|
|
5
5
|
var PublicAuthorization = class _PublicAuthorization extends AuthorizationBase {
|
|
6
6
|
mode = "public";
|
|
7
7
|
/**
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// libs/auth/src/authorization/transparent.authorization.ts
|
|
2
2
|
import { sha256Hex } from "@frontmcp/utils";
|
|
3
|
-
import { AuthorizationBase } from "./authorization.class.mjs";
|
|
4
3
|
import { TokenNotAvailableError } from "../errors/auth-internal.errors.mjs";
|
|
4
|
+
import { AuthorizationBase } from "./authorization.class.mjs";
|
|
5
5
|
var TransparentAuthorization = class _TransparentAuthorization extends AuthorizationBase {
|
|
6
6
|
mode = "transparent";
|
|
7
7
|
/**
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
// libs/auth/src/cimd/cimd-client-assertion.ts
|
|
2
|
+
import { sha256Hex } from "@frontmcp/utils";
|
|
3
|
+
import { loadJose } from "../jwks/jose.loader.mjs";
|
|
4
|
+
import { CimdClientAssertionError, CimdError } from "./cimd.errors.mjs";
|
|
5
|
+
var CLIENT_ASSERTION_TYPE_JWT_BEARER = "urn:ietf:params:oauth:client-assertion-type:jwt-bearer";
|
|
6
|
+
var CLIENT_ASSERTION_SIGNING_ALGORITHMS = [
|
|
7
|
+
"RS256",
|
|
8
|
+
"RS384",
|
|
9
|
+
"RS512",
|
|
10
|
+
"PS256",
|
|
11
|
+
"PS384",
|
|
12
|
+
"PS512",
|
|
13
|
+
"ES256",
|
|
14
|
+
"ES384",
|
|
15
|
+
"ES512",
|
|
16
|
+
"EdDSA",
|
|
17
|
+
"Ed25519"
|
|
18
|
+
];
|
|
19
|
+
var MAX_CLIENT_ASSERTION_LIFETIME_SECONDS = 600;
|
|
20
|
+
var CLOCK_TOLERANCE_SECONDS = 30;
|
|
21
|
+
var MAX_CLIENT_ASSERTION_LENGTH = 16384;
|
|
22
|
+
async function verifyClientAssertion(context) {
|
|
23
|
+
const { clientId, assertion } = context;
|
|
24
|
+
const refuse = (reason) => new CimdClientAssertionError(clientId, reason);
|
|
25
|
+
if (!assertion) throw refuse("missing_assertion");
|
|
26
|
+
if (context.type !== CLIENT_ASSERTION_TYPE_JWT_BEARER) throw refuse("unsupported_assertion_type");
|
|
27
|
+
if (assertion.length > MAX_CLIENT_ASSERTION_LENGTH) throw refuse("malformed");
|
|
28
|
+
const jose = await loadJose();
|
|
29
|
+
let algorithm;
|
|
30
|
+
try {
|
|
31
|
+
algorithm = jose.decodeProtectedHeader(assertion).alg;
|
|
32
|
+
} catch {
|
|
33
|
+
throw refuse("malformed");
|
|
34
|
+
}
|
|
35
|
+
if (typeof algorithm !== "string" || !CLIENT_ASSERTION_SIGNING_ALGORITHMS.includes(algorithm)) {
|
|
36
|
+
throw refuse("unsupported_algorithm");
|
|
37
|
+
}
|
|
38
|
+
let payload;
|
|
39
|
+
try {
|
|
40
|
+
payload = await verifySignedClaims(jose, context);
|
|
41
|
+
} catch (error) {
|
|
42
|
+
if (error instanceof CimdError) throw error;
|
|
43
|
+
throw refuse(refusalFor(error));
|
|
44
|
+
}
|
|
45
|
+
const now = Math.floor(Date.now() / 1e3);
|
|
46
|
+
const expiresAt = payload.exp ?? now;
|
|
47
|
+
if (expiresAt - now > MAX_CLIENT_ASSERTION_LIFETIME_SECONDS) throw refuse("lifetime_too_long");
|
|
48
|
+
if (typeof payload.iat === "number" && payload.iat > now + CLOCK_TOLERANCE_SECONDS) throw refuse("not_yet_valid");
|
|
49
|
+
if (typeof payload.jti !== "string" || payload.jti.length === 0) throw refuse("missing_claim");
|
|
50
|
+
const ttlMs = (expiresAt - now + CLOCK_TOLERANCE_SECONDS) * 1e3;
|
|
51
|
+
const claimed = await context.claimOnce(`client-assertion:${sha256Hex(`${clientId}
|
|
52
|
+
${payload.jti}`)}`, ttlMs);
|
|
53
|
+
if (!claimed) throw refuse("replayed");
|
|
54
|
+
}
|
|
55
|
+
async function verifySignedClaims(jose, context) {
|
|
56
|
+
const options = {
|
|
57
|
+
algorithms: CLIENT_ASSERTION_SIGNING_ALGORITHMS,
|
|
58
|
+
issuer: context.clientId,
|
|
59
|
+
subject: context.clientId,
|
|
60
|
+
audience: [...context.audiences],
|
|
61
|
+
requiredClaims: ["exp", "jti"],
|
|
62
|
+
clockTolerance: CLOCK_TOLERANCE_SECONDS
|
|
63
|
+
};
|
|
64
|
+
const verifyWith = async (refresh) => {
|
|
65
|
+
const keys = jose.createLocalJWKSet(await context.keys(refresh));
|
|
66
|
+
return (await jose.jwtVerify(context.assertion ?? "", keys, options)).payload;
|
|
67
|
+
};
|
|
68
|
+
try {
|
|
69
|
+
return await verifyWith(false);
|
|
70
|
+
} catch (error) {
|
|
71
|
+
if (errorCode(error) !== "ERR_JWKS_NO_MATCHING_KEY") throw error;
|
|
72
|
+
return verifyWith(true);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function refusalFor(error) {
|
|
76
|
+
const { claim, reason } = error;
|
|
77
|
+
switch (errorCode(error)) {
|
|
78
|
+
case "ERR_JOSE_ALG_NOT_ALLOWED":
|
|
79
|
+
return "unsupported_algorithm";
|
|
80
|
+
case "ERR_JWKS_NO_MATCHING_KEY":
|
|
81
|
+
case "ERR_JWKS_MULTIPLE_MATCHING_KEYS":
|
|
82
|
+
case "ERR_JWKS_INVALID":
|
|
83
|
+
case "ERR_JWK_INVALID":
|
|
84
|
+
return "unknown_key";
|
|
85
|
+
case "ERR_JWS_SIGNATURE_VERIFICATION_FAILED":
|
|
86
|
+
return "bad_signature";
|
|
87
|
+
case "ERR_JWT_EXPIRED":
|
|
88
|
+
return "expired";
|
|
89
|
+
case "ERR_JWT_CLAIM_VALIDATION_FAILED":
|
|
90
|
+
if (reason === "missing") return "missing_claim";
|
|
91
|
+
if (claim === "iss") return "wrong_issuer";
|
|
92
|
+
if (claim === "sub") return "wrong_subject";
|
|
93
|
+
if (claim === "aud") return "wrong_audience";
|
|
94
|
+
if (claim === "nbf") return "not_yet_valid";
|
|
95
|
+
return "malformed";
|
|
96
|
+
default:
|
|
97
|
+
return "malformed";
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
function errorCode(error) {
|
|
101
|
+
return typeof error === "object" && error !== null ? error.code : void 0;
|
|
102
|
+
}
|
|
103
|
+
export {
|
|
104
|
+
CLIENT_ASSERTION_SIGNING_ALGORITHMS,
|
|
105
|
+
CLIENT_ASSERTION_TYPE_JWT_BEARER,
|
|
106
|
+
MAX_CLIENT_ASSERTION_LIFETIME_SECONDS,
|
|
107
|
+
verifyClientAssertion
|
|
108
|
+
};
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
// libs/auth/src/cimd/cimd-redis.cache.ts
|
|
2
|
-
import { RedisStorageAdapter } from "@frontmcp/utils";
|
|
3
|
-
import {
|
|
4
|
-
|
|
2
|
+
import { RedisStorageAdapter, sha256Hex } from "@frontmcp/utils";
|
|
3
|
+
import {
|
|
4
|
+
extractCacheHeaders,
|
|
5
|
+
parseCacheHeaders
|
|
6
|
+
} from "./cimd.cache.mjs";
|
|
5
7
|
var RedisCimdCache = class {
|
|
6
8
|
redis;
|
|
7
9
|
keyPrefix;
|