@xemahq/platform-common 0.13.0 → 0.14.1
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/lib/advisory-lock.d.ts +10 -0
- package/dist/lib/advisory-lock.d.ts.map +1 -0
- package/dist/lib/advisory-lock.js +32 -0
- package/dist/lib/advisory-lock.js.map +1 -0
- package/dist/lib/biome-database.d.ts +14 -0
- package/dist/lib/biome-database.d.ts.map +1 -0
- package/dist/lib/biome-database.js +88 -0
- package/dist/lib/biome-database.js.map +1 -0
- package/dist/lib/llm-stream/anthropic-adapter.d.ts +25 -0
- package/dist/lib/llm-stream/anthropic-adapter.d.ts.map +1 -0
- package/dist/lib/llm-stream/anthropic-adapter.js +278 -0
- package/dist/lib/llm-stream/anthropic-adapter.js.map +1 -0
- package/dist/lib/redaction/redaction.interceptor.d.ts +11 -0
- package/dist/lib/redaction/redaction.interceptor.d.ts.map +1 -0
- package/dist/lib/redaction/redaction.interceptor.js +41 -0
- package/dist/lib/redaction/redaction.interceptor.js.map +1 -0
- package/dist/lib/redaction/redaction.service.d.ts +9 -0
- package/dist/lib/redaction/redaction.service.d.ts.map +1 -0
- package/dist/lib/redaction/redaction.service.js +110 -0
- package/dist/lib/redaction/redaction.service.js.map +1 -0
- package/dist/lib/to-prisma-json.d.ts +6 -0
- package/dist/lib/to-prisma-json.d.ts.map +1 -0
- package/dist/lib/to-prisma-json.js +12 -0
- package/dist/lib/to-prisma-json.js.map +1 -0
- package/dist/lib/write-policy.d.ts +30 -0
- package/dist/lib/write-policy.d.ts.map +1 -0
- package/dist/lib/write-policy.js +54 -0
- package/dist/lib/write-policy.js.map +1 -0
- package/dist/nestjs/auth/org-authority-observations.d.ts +15 -0
- package/dist/nestjs/auth/org-authority-observations.d.ts.map +1 -0
- package/dist/nestjs/auth/org-authority-observations.js +47 -0
- package/dist/nestjs/auth/org-authority-observations.js.map +1 -0
- package/dist/nestjs/auth/org-authority.d.ts +32 -0
- package/dist/nestjs/auth/org-authority.d.ts.map +1 -0
- package/dist/nestjs/auth/org-authority.js +102 -0
- package/dist/nestjs/auth/org-authority.js.map +1 -0
- package/dist/nestjs/auth/org-claim.d.ts +12 -0
- package/dist/nestjs/auth/org-claim.d.ts.map +1 -0
- package/dist/nestjs/auth/org-claim.js +25 -0
- package/dist/nestjs/auth/org-claim.js.map +1 -0
- package/dist/nestjs/auth/org-role.d.ts +13 -0
- package/dist/nestjs/auth/org-role.d.ts.map +1 -0
- package/dist/nestjs/auth/org-role.js +75 -0
- package/dist/nestjs/auth/org-role.js.map +1 -0
- package/dist/nestjs/auth/realm-token-verifier.d.ts +30 -0
- package/dist/nestjs/auth/realm-token-verifier.d.ts.map +1 -0
- package/dist/nestjs/auth/realm-token-verifier.js +161 -0
- package/dist/nestjs/auth/realm-token-verifier.js.map +1 -0
- package/dist/nestjs/auth/service-token.guard.d.ts +6 -8
- package/dist/nestjs/auth/service-token.guard.d.ts.map +1 -1
- package/dist/nestjs/auth/service-token.guard.js +21 -101
- package/dist/nestjs/auth/service-token.guard.js.map +1 -1
- package/dist/nestjs/connector-webhooks/connector-webhook-envelope.dto.d.ts +1 -0
- package/dist/nestjs/connector-webhooks/connector-webhook-envelope.dto.d.ts.map +1 -1
- package/dist/nestjs/connector-webhooks/connector-webhook-envelope.dto.js +17 -0
- package/dist/nestjs/connector-webhooks/connector-webhook-envelope.dto.js.map +1 -1
- package/dist/nestjs/idempotency/prisma-idempotency.service.d.ts +20 -0
- package/dist/nestjs/idempotency/prisma-idempotency.service.d.ts.map +1 -0
- package/dist/nestjs/idempotency/prisma-idempotency.service.js +58 -0
- package/dist/nestjs/idempotency/prisma-idempotency.service.js.map +1 -0
- package/dist/nestjs/jwt-verification.guard.d.ts +2 -16
- package/dist/nestjs/jwt-verification.guard.d.ts.map +1 -1
- package/dist/nestjs/jwt-verification.guard.js +6 -149
- package/dist/nestjs/jwt-verification.guard.js.map +1 -1
- package/package.json +2 -2
|
@@ -18,30 +18,16 @@ const common_1 = require("@nestjs/common");
|
|
|
18
18
|
const decorator_metadata_1 = require("./decorator-metadata");
|
|
19
19
|
const public_decorator_1 = require("./public.decorator");
|
|
20
20
|
const auth_module_options_1 = require("./auth/auth-module-options");
|
|
21
|
-
const idp_tenant_resolver_1 = require("./auth/idp-tenant-resolver");
|
|
22
21
|
const request_context_1 = require("../lib/request-context");
|
|
23
22
|
const oidc_guard_1 = require("@xemahq/oidc-guard");
|
|
23
|
+
const realm_token_verifier_1 = require("./auth/realm-token-verifier");
|
|
24
24
|
const PUBLIC_PATH_PREFIXES = ['/health', '/api/docs', '/api/openapi.json'];
|
|
25
25
|
const PUBLIC_WEBHOOK_PREFIX = '/webhooks';
|
|
26
|
-
let JwtVerificationGuard = class JwtVerificationGuard {
|
|
27
|
-
static { JwtVerificationGuard_1 = this; }
|
|
28
|
-
authOptions;
|
|
26
|
+
let JwtVerificationGuard = JwtVerificationGuard_1 = class JwtVerificationGuard {
|
|
29
27
|
logger = new common_1.Logger(JwtVerificationGuard_1.name);
|
|
30
|
-
|
|
31
|
-
issuerMetadata = new oidc_guard_1.IssuerMetadataResolver();
|
|
32
|
-
tenantResolver;
|
|
33
|
-
oidcVerifier;
|
|
34
|
-
static SINGLE_REALM_CACHE_KEY = '__single__';
|
|
35
|
-
multiRealmConfig = null;
|
|
36
|
-
resolvingConfig = null;
|
|
28
|
+
verifier;
|
|
37
29
|
constructor(authOptions) {
|
|
38
|
-
this.
|
|
39
|
-
this.tenantResolver = (0, idp_tenant_resolver_1.selectTenantResolver)(process.env.IDP_KIND);
|
|
40
|
-
this.oidcVerifier = new oidc_guard_1.OidcTokenVerifier({
|
|
41
|
-
jwks: this.jwks,
|
|
42
|
-
issuerMetadata: this.issuerMetadata,
|
|
43
|
-
tenantResolver: this.tenantResolver,
|
|
44
|
-
});
|
|
30
|
+
this.verifier = new realm_token_verifier_1.RealmTokenVerifier(authOptions);
|
|
45
31
|
}
|
|
46
32
|
async canActivate(context) {
|
|
47
33
|
const isPublic = (0, decorator_metadata_1.readDecoratorOverride)(public_decorator_1.IS_PUBLIC_KEY, [
|
|
@@ -73,69 +59,8 @@ let JwtVerificationGuard = class JwtVerificationGuard {
|
|
|
73
59
|
}
|
|
74
60
|
}
|
|
75
61
|
async verifyToken(token) {
|
|
76
|
-
const { payload } = this.decodeOrThrow(token);
|
|
77
|
-
const multiRealm = await this.resolveMultiRealmConfig();
|
|
78
|
-
if (multiRealm) {
|
|
79
|
-
await this.verifyMultiRealm(token, multiRealm);
|
|
80
|
-
}
|
|
81
|
-
else {
|
|
82
|
-
await this.verifySingleRealm(token, payload);
|
|
83
|
-
}
|
|
84
|
-
return payload;
|
|
85
|
-
}
|
|
86
|
-
decodeOrThrow(token) {
|
|
87
|
-
try {
|
|
88
|
-
return this.jwks.decode(token);
|
|
89
|
-
}
|
|
90
|
-
catch (error) {
|
|
91
|
-
if (error instanceof oidc_guard_1.JwksVerificationError) {
|
|
92
|
-
throw new common_1.UnauthorizedException(error.message);
|
|
93
|
-
}
|
|
94
|
-
throw error;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
async verifyMultiRealm(token, config) {
|
|
98
|
-
try {
|
|
99
|
-
await this.oidcVerifier.verify(token, {
|
|
100
|
-
discoveryBaseUrls: config.discoveryBaseUrls,
|
|
101
|
-
allowedRealms: config.allowedRealms,
|
|
102
|
-
expectedIssuers: this.configuredIssuers(),
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
catch (error) {
|
|
106
|
-
if (error instanceof oidc_guard_1.JwksVerificationError) {
|
|
107
|
-
throw new common_1.UnauthorizedException(error.message);
|
|
108
|
-
}
|
|
109
|
-
throw error;
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
async verifySingleRealm(token, payload) {
|
|
113
|
-
const expectedIssuer = this.authOptions?.issuer;
|
|
114
|
-
if (expectedIssuer) {
|
|
115
|
-
if (!payload.iss) {
|
|
116
|
-
throw new common_1.UnauthorizedException('Token missing required issuer claim');
|
|
117
|
-
}
|
|
118
|
-
const allowedIssuers = this.configuredIssuers();
|
|
119
|
-
const tenants = [
|
|
120
|
-
...new Set(allowedIssuers
|
|
121
|
-
.map((iss) => this.tenantResolver.tenantFromIssuer(iss))
|
|
122
|
-
.filter((tenant) => tenant !== null)),
|
|
123
|
-
];
|
|
124
|
-
const issuerMatched = allowedIssuers.includes(payload.iss) ||
|
|
125
|
-
tenants.some((tenant) => this.tenantResolver.issuerBelongsToTenant(payload.iss, tenant));
|
|
126
|
-
if (!issuerMatched) {
|
|
127
|
-
throw new common_1.UnauthorizedException('Invalid token issuer');
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
const jwksUrl = this.authOptions?.jwksUrl;
|
|
131
|
-
if (!jwksUrl) {
|
|
132
|
-
throw new Error('AuthModule jwksUrl is not configured');
|
|
133
|
-
}
|
|
134
62
|
try {
|
|
135
|
-
await this.
|
|
136
|
-
cacheKey: JwtVerificationGuard_1.SINGLE_REALM_CACHE_KEY,
|
|
137
|
-
jwksUrl,
|
|
138
|
-
});
|
|
63
|
+
return await this.verifier.verify(token);
|
|
139
64
|
}
|
|
140
65
|
catch (error) {
|
|
141
66
|
if (error instanceof oidc_guard_1.JwksVerificationError) {
|
|
@@ -144,78 +69,10 @@ let JwtVerificationGuard = class JwtVerificationGuard {
|
|
|
144
69
|
throw error;
|
|
145
70
|
}
|
|
146
71
|
}
|
|
147
|
-
configuredIssuers() {
|
|
148
|
-
const raw = this.authOptions?.issuer;
|
|
149
|
-
if (!raw)
|
|
150
|
-
return [];
|
|
151
|
-
return raw
|
|
152
|
-
.split(',')
|
|
153
|
-
.map((s) => s.trim())
|
|
154
|
-
.filter((s) => s.length > 0);
|
|
155
|
-
}
|
|
156
|
-
async resolveMultiRealmConfig() {
|
|
157
|
-
if (this.multiRealmConfig)
|
|
158
|
-
return this.multiRealmConfig;
|
|
159
|
-
if (this.resolvingConfig)
|
|
160
|
-
return this.resolvingConfig;
|
|
161
|
-
this.resolvingConfig = (async () => {
|
|
162
|
-
try {
|
|
163
|
-
const keycloakBaseUrl = await this.resolveKeycloakBaseUrl();
|
|
164
|
-
const allowedRealms = await this.resolveAllowedRealms();
|
|
165
|
-
if (keycloakBaseUrl && allowedRealms.length > 0) {
|
|
166
|
-
const localBaseUrls = keycloakBaseUrl
|
|
167
|
-
.split(',')
|
|
168
|
-
.map((s) => s.trim().replace(/\/$/, ''));
|
|
169
|
-
const federated = this.authOptions?.federatedRealmTrust;
|
|
170
|
-
const discoveryBaseUrls = [
|
|
171
|
-
...new Set([
|
|
172
|
-
...localBaseUrls,
|
|
173
|
-
...(federated?.discoveryBaseUrls ?? []).map((s) => s.trim().replace(/\/$/, '')),
|
|
174
|
-
]),
|
|
175
|
-
];
|
|
176
|
-
const mergedRealms = [
|
|
177
|
-
...new Set([...allowedRealms, ...(federated?.allowedRealms ?? [])]),
|
|
178
|
-
];
|
|
179
|
-
this.multiRealmConfig = {
|
|
180
|
-
discoveryBaseUrls,
|
|
181
|
-
allowedRealms: mergedRealms,
|
|
182
|
-
};
|
|
183
|
-
this.logger.log(`Multi-realm mode enabled: realms=[${mergedRealms.join(', ')}], base URLs=[${discoveryBaseUrls.join(', ')}]` +
|
|
184
|
-
(federated
|
|
185
|
-
? ` (incl. ${federated.discoveryBaseUrls.length} federated base URL(s))`
|
|
186
|
-
: ''));
|
|
187
|
-
return this.multiRealmConfig;
|
|
188
|
-
}
|
|
189
|
-
return null;
|
|
190
|
-
}
|
|
191
|
-
finally {
|
|
192
|
-
this.resolvingConfig = null;
|
|
193
|
-
}
|
|
194
|
-
})();
|
|
195
|
-
return this.resolvingConfig;
|
|
196
|
-
}
|
|
197
|
-
async resolveKeycloakBaseUrl() {
|
|
198
|
-
if (this.authOptions?.keycloakBaseUrl)
|
|
199
|
-
return this.authOptions.keycloakBaseUrl;
|
|
200
|
-
if (this.authOptions?.keycloakBaseUrlProvider) {
|
|
201
|
-
return (await this.authOptions.keycloakBaseUrlProvider()) ?? undefined;
|
|
202
|
-
}
|
|
203
|
-
return undefined;
|
|
204
|
-
}
|
|
205
|
-
async resolveAllowedRealms() {
|
|
206
|
-
if (this.authOptions?.allowedRealms &&
|
|
207
|
-
this.authOptions.allowedRealms.length > 0) {
|
|
208
|
-
return this.authOptions.allowedRealms;
|
|
209
|
-
}
|
|
210
|
-
if (this.authOptions?.allowedRealmsProvider) {
|
|
211
|
-
return await this.authOptions.allowedRealmsProvider();
|
|
212
|
-
}
|
|
213
|
-
return [];
|
|
214
|
-
}
|
|
215
72
|
attachRealmToContext(request, payload) {
|
|
216
73
|
if (!payload.iss)
|
|
217
74
|
return;
|
|
218
|
-
const realmName = this.tenantResolver.tenantFromIssuer(payload.iss);
|
|
75
|
+
const realmName = this.verifier.tenantResolver.tenantFromIssuer(payload.iss);
|
|
219
76
|
if (!realmName)
|
|
220
77
|
return;
|
|
221
78
|
const ctx = request[request_context_1.REQUEST_CONTEXT];
|
|
@@ -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,
|
|
1
|
+
{"version":3,"file":"jwt-verification.guard.js","sourceRoot":"","sources":["../../src/nestjs/jwt-verification.guard.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xemahq/platform-common",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.14.1",
|
|
4
4
|
"description": "Shared NestJS building blocks for Xema services — auth guards, response redaction, CORS configuration, and crypto helpers.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "Neuralchowder Inc. <developer@xema.dev> (https://xema.dev)",
|
|
@@ -62,7 +62,7 @@
|
|
|
62
62
|
"rxjs": "7.8.2",
|
|
63
63
|
"ts-jest": "^29.4.9",
|
|
64
64
|
"typescript": "5.9.3",
|
|
65
|
-
"@xemahq/kernel-contracts": "^
|
|
65
|
+
"@xemahq/kernel-contracts": "^18.1.0"
|
|
66
66
|
},
|
|
67
67
|
"exports": {
|
|
68
68
|
".": {
|