@xemahq/platform-common 0.2.11 → 0.2.13
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/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/resolve-acting-user.d.ts +8 -0
- package/dist/lib/resolve-acting-user.d.ts.map +1 -0
- package/dist/lib/resolve-acting-user.js +44 -0
- package/dist/lib/resolve-acting-user.js.map +1 -0
- package/dist/nestjs/jwks/issuer-metadata-resolver.d.ts +7 -0
- package/dist/nestjs/jwks/issuer-metadata-resolver.d.ts.map +1 -0
- package/dist/nestjs/jwks/issuer-metadata-resolver.js +36 -0
- package/dist/nestjs/jwks/issuer-metadata-resolver.js.map +1 -0
- package/dist/nestjs/jwt-verification.guard.d.ts +1 -0
- package/dist/nestjs/jwt-verification.guard.d.ts.map +1 -1
- package/dist/nestjs/jwt-verification.guard.js +13 -1
- package/dist/nestjs/jwt-verification.guard.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -24,6 +24,7 @@ export * from './lib/omit-undefined';
|
|
|
24
24
|
export * from './lib/redaction/index';
|
|
25
25
|
export * from './lib/orval-client-config';
|
|
26
26
|
export * from './lib/request-context';
|
|
27
|
+
export * from './lib/resolve-acting-user';
|
|
27
28
|
export * from './lib/vote-feedback';
|
|
28
29
|
export * from './lib/write-policy';
|
|
29
30
|
export * from './lib/interactive-workspace-layout';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AAIrC,OAAO,KAAK,SAAS,MAAM,uBAAuB,CAAC;AACnD,cAAc,mCAAmC,CAAC;AAClD,cAAc,uCAAuC,CAAC;AACtD,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,kCAAkC,CAAC;AACjD,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oCAAoC,CAAC;AACnD,cAAc,yBAAyB,CAAC;AAGxC,cAAc,iCAAiC,CAAC;AAChD,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAG1C,cAAc,wBAAwB,CAAC;AAGvC,cAAc,sBAAsB,CAAC;AAGrC,cAAc,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AAIrC,OAAO,KAAK,SAAS,MAAM,uBAAuB,CAAC;AACnD,cAAc,mCAAmC,CAAC;AAClD,cAAc,uCAAuC,CAAC;AACtD,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,kCAAkC,CAAC;AACjD,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oCAAoC,CAAC;AACnD,cAAc,yBAAyB,CAAC;AAGxC,cAAc,iCAAiC,CAAC;AAChD,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAG1C,cAAc,wBAAwB,CAAC;AAGvC,cAAc,sBAAsB,CAAC;AAGrC,cAAc,gBAAgB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -63,6 +63,7 @@ __exportStar(require("./lib/omit-undefined"), exports);
|
|
|
63
63
|
__exportStar(require("./lib/redaction/index"), exports);
|
|
64
64
|
__exportStar(require("./lib/orval-client-config"), exports);
|
|
65
65
|
__exportStar(require("./lib/request-context"), exports);
|
|
66
|
+
__exportStar(require("./lib/resolve-acting-user"), exports);
|
|
66
67
|
__exportStar(require("./lib/vote-feedback"), exports);
|
|
67
68
|
__exportStar(require("./lib/write-policy"), exports);
|
|
68
69
|
__exportStar(require("./lib/interactive-workspace-layout"), exports);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,sDAAoC;AACpC,sDAAoC;AACpC,uDAAqC;AAIrC,mEAAmD;AACnD,oEAAkD;AAClD,wEAAsD;AACtD,mDAAiC;AACjC,4DAA0C;AAC1C,oDAAkC;AAClC,+DAA6C;AAC7C,0DAAwC;AACxC,uDAAqC;AACrC,oDAAkC;AAClC,yDAAuC;AACvC,mEAAiD;AACjD,wDAAsC;AACtC,4DAA0C;AAC1C,yDAAuC;AACvC,yDAAuC;AACvC,gEAA8C;AAC9C,sDAAoC;AACpC,2DAAyC;AACzC,uDAAqC;AACrC,wDAAsC;AACtC,4DAA0C;AAC1C,wDAAsC;AACtC,sDAAoC;AACpC,qDAAmC;AACnC,qEAAmD;AACnD,0DAAwC;AAGxC,kEAAgD;AAChD,uDAAqC;AACrC,2DAAyC;AACzC,4DAA0C;AAG1C,yDAAuC;AAGvC,uDAAqC;AAGrC,iDAA+B"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,sDAAoC;AACpC,sDAAoC;AACpC,uDAAqC;AAIrC,mEAAmD;AACnD,oEAAkD;AAClD,wEAAsD;AACtD,mDAAiC;AACjC,4DAA0C;AAC1C,oDAAkC;AAClC,+DAA6C;AAC7C,0DAAwC;AACxC,uDAAqC;AACrC,oDAAkC;AAClC,yDAAuC;AACvC,mEAAiD;AACjD,wDAAsC;AACtC,4DAA0C;AAC1C,yDAAuC;AACvC,yDAAuC;AACvC,gEAA8C;AAC9C,sDAAoC;AACpC,2DAAyC;AACzC,uDAAqC;AACrC,wDAAsC;AACtC,4DAA0C;AAC1C,wDAAsC;AACtC,4DAA0C;AAC1C,sDAAoC;AACpC,qDAAmC;AACnC,qEAAmD;AACnD,0DAAwC;AAGxC,kEAAgD;AAChD,uDAAqC;AACrC,2DAAyC;AACzC,4DAA0C;AAG1C,yDAAuC;AAGvC,uDAAqC;AAGrC,iDAA+B"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { SubjectRef } from '@xemahq/kernel-contracts/subject';
|
|
2
|
+
import type { RequestContext } from './request-context';
|
|
3
|
+
export declare class ActingUserUnresolvableError extends Error {
|
|
4
|
+
constructor(ctx: Pick<RequestContext, 'subject' | 'actorChain'>);
|
|
5
|
+
}
|
|
6
|
+
export declare function tryResolveActingUserSubject(ctx: Pick<RequestContext, 'subject' | 'actorChain'>): SubjectRef | undefined;
|
|
7
|
+
export declare function resolveActingUserSubject(ctx: Pick<RequestContext, 'subject' | 'actorChain'>): SubjectRef;
|
|
8
|
+
//# sourceMappingURL=resolve-acting-user.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-acting-user.d.ts","sourceRoot":"","sources":["../../src/lib/resolve-acting-user.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAEnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAUxD,qBAAa,2BAA4B,SAAQ,KAAK;gBACxC,GAAG,EAAE,IAAI,CAAC,cAAc,EAAE,SAAS,GAAG,YAAY,CAAC;CAgBhE;AAyBD,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,IAAI,CAAC,cAAc,EAAE,SAAS,GAAG,YAAY,CAAC,GAClD,UAAU,GAAG,SAAS,CAcxB;AAWD,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,IAAI,CAAC,cAAc,EAAE,SAAS,GAAG,YAAY,CAAC,GAClD,UAAU,CAMZ"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ActingUserUnresolvableError = void 0;
|
|
4
|
+
exports.tryResolveActingUserSubject = tryResolveActingUserSubject;
|
|
5
|
+
exports.resolveActingUserSubject = resolveActingUserSubject;
|
|
6
|
+
const subject_1 = require("@xemahq/kernel-contracts/subject");
|
|
7
|
+
class ActingUserUnresolvableError extends Error {
|
|
8
|
+
constructor(ctx) {
|
|
9
|
+
const chain = (ctx.actorChain ?? [])
|
|
10
|
+
.map((a) => `${a.kind}:${a.id}`)
|
|
11
|
+
.join(',');
|
|
12
|
+
super('No acting USER could be resolved from the request context. ' +
|
|
13
|
+
`subject=${ctx.subject.kind}:${ctx.subject.id} ` +
|
|
14
|
+
`actingFor=${ctx.subject.actingFor
|
|
15
|
+
? `${ctx.subject.actingFor.kind}:${ctx.subject.actingFor.id}`
|
|
16
|
+
: 'none'} actorChain=[${chain}]. ` +
|
|
17
|
+
'Ownership cannot be attributed to a non-human actor (fail-closed).');
|
|
18
|
+
this.name = 'ActingUserUnresolvableError';
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
exports.ActingUserUnresolvableError = ActingUserUnresolvableError;
|
|
22
|
+
function tryResolveActingUserSubject(ctx) {
|
|
23
|
+
if (ctx.subject.kind === subject_1.SubjectKind.User) {
|
|
24
|
+
return { kind: subject_1.SubjectKind.User, id: ctx.subject.id };
|
|
25
|
+
}
|
|
26
|
+
const actingFor = ctx.subject.actingFor;
|
|
27
|
+
if (actingFor && actingFor.kind === subject_1.SubjectKind.User) {
|
|
28
|
+
return { kind: subject_1.SubjectKind.User, id: actingFor.id };
|
|
29
|
+
}
|
|
30
|
+
for (const actor of ctx.actorChain ?? []) {
|
|
31
|
+
if (actor.kind === subject_1.SubjectKind.User) {
|
|
32
|
+
return { kind: subject_1.SubjectKind.User, id: actor.id };
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
function resolveActingUserSubject(ctx) {
|
|
38
|
+
const user = tryResolveActingUserSubject(ctx);
|
|
39
|
+
if (user === undefined) {
|
|
40
|
+
throw new ActingUserUnresolvableError(ctx);
|
|
41
|
+
}
|
|
42
|
+
return user;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=resolve-acting-user.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-acting-user.js","sourceRoot":"","sources":["../../src/lib/resolve-acting-user.ts"],"names":[],"mappings":";;;AAuDA,kEAgBC;AAWD,4DAQC;AA1FD,8DAA+D;AAa/D,MAAa,2BAA4B,SAAQ,KAAK;IACpD,YAAY,GAAmD;QAC7D,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC;aACjC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;aAC/B,IAAI,CAAC,GAAG,CAAC,CAAC;QACb,KAAK,CACH,6DAA6D;YAC3D,WAAW,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,GAAG,CAAC,OAAO,CAAC,EAAE,GAAG;YAChD,aACE,GAAG,CAAC,OAAO,CAAC,SAAS;gBACnB,CAAC,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,IAAI,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE;gBAC7D,CAAC,CAAC,MACN,gBAAgB,KAAK,KAAK;YAC1B,oEAAoE,CACvE,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,6BAA6B,CAAC;IAC5C,CAAC;CACF;AAjBD,kEAiBC;AAyBD,SAAgB,2BAA2B,CACzC,GAAmD;IAEnD,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,qBAAW,CAAC,IAAI,EAAE,CAAC;QAC1C,OAAO,EAAE,IAAI,EAAE,qBAAW,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;IACxD,CAAC;IACD,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC;IACxC,IAAI,SAAS,IAAI,SAAS,CAAC,IAAI,KAAK,qBAAW,CAAC,IAAI,EAAE,CAAC;QACrD,OAAO,EAAE,IAAI,EAAE,qBAAW,CAAC,IAAI,EAAE,EAAE,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC;IACtD,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC;QACzC,IAAI,KAAK,CAAC,IAAI,KAAK,qBAAW,CAAC,IAAI,EAAE,CAAC;YACpC,OAAO,EAAE,IAAI,EAAE,qBAAW,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;QAClD,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAWD,SAAgB,wBAAwB,CACtC,GAAmD;IAEnD,MAAM,IAAI,GAAG,2BAA2B,CAAC,GAAG,CAAC,CAAC;IAC9C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,IAAI,2BAA2B,CAAC,GAAG,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issuer-metadata-resolver.d.ts","sourceRoot":"","sources":["../../../src/nestjs/jwks/issuer-metadata-resolver.ts"],"names":[],"mappings":"AAuBA,qBAAa,sBAAsB;IAOrB,OAAO,CAAC,QAAQ,CAAC,UAAU;IANvC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA6D;gBAMtD,UAAU,GAAE,MAAkB;IAOrD,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAgC5D"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IssuerMetadataResolver = void 0;
|
|
4
|
+
const jwks_verifier_1 = require("./jwks-verifier");
|
|
5
|
+
class IssuerMetadataResolver {
|
|
6
|
+
cacheTtlMs;
|
|
7
|
+
cache = new Map();
|
|
8
|
+
constructor(cacheTtlMs = 3_600_000) {
|
|
9
|
+
this.cacheTtlMs = cacheTtlMs;
|
|
10
|
+
}
|
|
11
|
+
async resolveJwksUri(discoveryUrl) {
|
|
12
|
+
const cached = this.cache.get(discoveryUrl);
|
|
13
|
+
if (cached && Date.now() - cached.fetchedAt < this.cacheTtlMs) {
|
|
14
|
+
return cached.jwksUri;
|
|
15
|
+
}
|
|
16
|
+
let response;
|
|
17
|
+
try {
|
|
18
|
+
response = await fetch(discoveryUrl);
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
22
|
+
throw new jwks_verifier_1.JwksVerificationError(`Failed to reach OIDC discovery endpoint ${discoveryUrl}: ${msg}`);
|
|
23
|
+
}
|
|
24
|
+
if (!response.ok) {
|
|
25
|
+
throw new jwks_verifier_1.JwksVerificationError(`Failed to fetch OIDC discovery from ${discoveryUrl}: ${response.status}`);
|
|
26
|
+
}
|
|
27
|
+
const doc = (await response.json());
|
|
28
|
+
if (typeof doc.jwks_uri !== 'string' || doc.jwks_uri.length === 0) {
|
|
29
|
+
throw new jwks_verifier_1.JwksVerificationError(`OIDC discovery at ${discoveryUrl} did not provide a jwks_uri`);
|
|
30
|
+
}
|
|
31
|
+
this.cache.set(discoveryUrl, { jwksUri: doc.jwks_uri, fetchedAt: Date.now() });
|
|
32
|
+
return doc.jwks_uri;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
exports.IssuerMetadataResolver = IssuerMetadataResolver;
|
|
36
|
+
//# sourceMappingURL=issuer-metadata-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issuer-metadata-resolver.js","sourceRoot":"","sources":["../../../src/nestjs/jwks/issuer-metadata-resolver.ts"],"names":[],"mappings":";;;AAAA,mDAAwD;AAuBxD,MAAa,sBAAsB;IAOJ;IANZ,KAAK,GAAG,IAAI,GAAG,EAAkD,CAAC;IAMnF,YAA6B,aAAqB,SAAS;QAA9B,eAAU,GAAV,UAAU,CAAoB;IAAG,CAAC;IAO/D,KAAK,CAAC,cAAc,CAAC,YAAoB;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC5C,IAAI,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YAC9D,OAAO,MAAM,CAAC,OAAO,CAAC;QACxB,CAAC;QAED,IAAI,QAAkB,CAAC;QACvB,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAEnE,MAAM,IAAI,qCAAqB,CAC7B,2CAA2C,YAAY,KAAK,GAAG,EAAE,CAClE,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,qCAAqB,CAC7B,uCAAuC,YAAY,KAAK,QAAQ,CAAC,MAAM,EAAE,CAC1E,CAAC;QACJ,CAAC;QAED,MAAM,GAAG,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA2B,CAAC;QAC9D,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClE,MAAM,IAAI,qCAAqB,CAC7B,qBAAqB,YAAY,6BAA6B,CAC/D,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC/E,OAAO,GAAG,CAAC,QAAQ,CAAC;IACtB,CAAC;CACF;AA9CD,wDA8CC"}
|
|
@@ -4,6 +4,7 @@ export declare class JwtVerificationGuard implements CanActivate {
|
|
|
4
4
|
private readonly authOptions?;
|
|
5
5
|
private readonly logger;
|
|
6
6
|
private readonly jwks;
|
|
7
|
+
private readonly issuerMetadata;
|
|
7
8
|
private static readonly SINGLE_REALM_CACHE_KEY;
|
|
8
9
|
private multiRealmConfig;
|
|
9
10
|
private resolvingConfig;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jwt-verification.guard.d.ts","sourceRoot":"","sources":["../../src/nestjs/jwt-verification.guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,WAAW,EACX,gBAAgB,EAKjB,MAAM,gBAAgB,CAAC;AAKxB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"jwt-verification.guard.d.ts","sourceRoot":"","sources":["../../src/nestjs/jwt-verification.guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,WAAW,EACX,gBAAgB,EAKjB,MAAM,gBAAgB,CAAC;AAKxB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AA0CpE,qBACa,oBAAqB,YAAW,WAAW;IAmCpD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;IAlC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyC;IAShE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA6B;IAMlD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgC;IAG/D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CAAgB;IAG9D,OAAO,CAAC,gBAAgB,CAGR;IAEhB,OAAO,CAAC,eAAe,CAGC;gBAKL,WAAW,CAAC,EAAE,iBAAiB,YAAA;IAG5C,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;YAwChD,WAAW;IAsBzB,OAAO,CAAC,aAAa;YAmBP,cAAc;YAed,gBAAgB;YAkDhB,iBAAiB;YA0CjB,uBAAuB;YA4CvB,sBAAsB;YAQtB,oBAAoB;IAclC,OAAO,CAAC,oBAAoB;IAa5B,OAAO,CAAC,sBAAsB;IAM9B,OAAO,CAAC,oBAAoB;IAa5B,OAAO,CAAC,YAAY;CAYrB"}
|
|
@@ -20,6 +20,7 @@ const public_decorator_1 = require("./public.decorator");
|
|
|
20
20
|
const auth_module_options_1 = require("./auth/auth-module-options");
|
|
21
21
|
const request_context_1 = require("../lib/request-context");
|
|
22
22
|
const jwks_verifier_1 = require("./jwks/jwks-verifier");
|
|
23
|
+
const issuer_metadata_resolver_1 = require("./jwks/issuer-metadata-resolver");
|
|
23
24
|
const PUBLIC_PATH_PREFIXES = ['/health', '/api/docs', '/api/openapi.json'];
|
|
24
25
|
const PUBLIC_WEBHOOK_PREFIX = '/webhooks';
|
|
25
26
|
let JwtVerificationGuard = class JwtVerificationGuard {
|
|
@@ -27,6 +28,7 @@ let JwtVerificationGuard = class JwtVerificationGuard {
|
|
|
27
28
|
authOptions;
|
|
28
29
|
logger = new common_1.Logger(JwtVerificationGuard_1.name);
|
|
29
30
|
jwks = new jwks_verifier_1.JwksVerifier(600_000);
|
|
31
|
+
issuerMetadata = new issuer_metadata_resolver_1.IssuerMetadataResolver();
|
|
30
32
|
static SINGLE_REALM_CACHE_KEY = '__single__';
|
|
31
33
|
multiRealmConfig = null;
|
|
32
34
|
resolvingConfig = null;
|
|
@@ -110,7 +112,17 @@ let JwtVerificationGuard = class JwtVerificationGuard {
|
|
|
110
112
|
if (!validIssuers.includes(payload.iss) && !payload.iss.endsWith(`/realms/${realmName}`)) {
|
|
111
113
|
throw new common_1.UnauthorizedException('Invalid token issuer');
|
|
112
114
|
}
|
|
113
|
-
const
|
|
115
|
+
const discoveryUrl = `${config.keycloakBaseUrls[0]}/realms/${realmName}/.well-known/openid-configuration`;
|
|
116
|
+
let jwksUrl;
|
|
117
|
+
try {
|
|
118
|
+
jwksUrl = await this.issuerMetadata.resolveJwksUri(discoveryUrl);
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
if (error instanceof jwks_verifier_1.JwksVerificationError) {
|
|
122
|
+
throw new common_1.UnauthorizedException(error.message);
|
|
123
|
+
}
|
|
124
|
+
throw error;
|
|
125
|
+
}
|
|
114
126
|
await this.verifyWithJwks(token, realmName, jwksUrl);
|
|
115
127
|
}
|
|
116
128
|
async verifySingleRealm(token, payload) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jwt-verification.guard.js","sourceRoot":"","sources":["../../src/nestjs/jwt-verification.guard.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAQwB;AACxB,6DAA6D;AAE7D,yDAAmD;AACnD,oEAAiE;AAEjE,4DAAyD;AAEzD,wDAA2E;
|
|
1
|
+
{"version":3,"file":"jwt-verification.guard.js","sourceRoot":"","sources":["../../src/nestjs/jwt-verification.guard.ts"],"names":[],"mappings":"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"}
|