@babelpeak/babel-suite-server-sdk 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/client.d.ts CHANGED
@@ -1,19 +1,42 @@
1
1
  import { type JWTPayload } from 'jose';
2
+ /** Percorso del token ServiceAccount proiettato con audience = issuer di Suite. */
3
+ export declare const DEFAULT_SA_TOKEN_FILE = "/var/run/secrets/babel-suite/token";
4
+ /** URL interno di Suite quando il servizio gira nel cluster e SUITE_INTERNAL_URL manca. */
5
+ export declare const DEFAULT_IN_CLUSTER_SUITE_URL = "http://babel-suite.babel-suite.svc.cluster.local:3001";
6
+ /** Audience delle chiamate verso Suite /internal/*. */
7
+ export declare const SUITE_INTERNAL_AUDIENCE = "suite-internal";
8
+ export declare const SERVICE_TOKEN_TYP = "svc+jwt";
9
+ export declare const EVENT_TOKEN_TYP = "suite-event+jwt";
2
10
  export interface PermissionDefinition {
3
11
  key: string;
4
12
  description?: string;
5
13
  /** Ruoli di sistema che ricevono il permesso di default; admin lo riceve sempre. */
6
14
  defaultRoles?: ('admin' | 'user')[];
7
15
  }
16
+ /** `{ [audience]: { [servizio chiamante]: scope[] } }` */
17
+ export type AcceptsFrom = Record<string, Record<string, string[]>>;
8
18
  export interface SuiteClientOptions {
9
19
  /** URL dell'issuer di Suite (es. https://suite.babelpeak.com). */
10
20
  issuer: string;
11
21
  /** Chiave del servizio: è l'`aud` atteso nei JWT. */
12
22
  service: string;
13
- /** Service key per le route /internal/* (llm-config, permessi, introspect). */
23
+ /**
24
+ * Service key per le route /internal/* (llm-config, permessi, introspect): solo fuori
25
+ * produzione, quando manca il token ServiceAccount. Con NODE_ENV=production viene ignorata.
26
+ */
14
27
  serviceKey?: string;
15
- /** Base URL delle route interne, se Suite le serve su un listener separato. Default: issuer. */
28
+ /**
29
+ * Base URL delle route interne (/internal/*). Default: env SUITE_INTERNAL_URL; dentro
30
+ * Kubernetes (KUBERNETES_SERVICE_HOST) l'URL del Service di Suite; altrimenti l'issuer.
31
+ */
16
32
  internalUrl?: string;
33
+ /**
34
+ * Token ServiceAccount proiettato. Default: env SUITE_SA_TOKEN_FILE o /var/run/secrets/babel-suite/token.
35
+ * Con NODE_ENV=production è obbligatorio: senza il file il costruttore lancia un errore.
36
+ */
37
+ tokenFile?: string;
38
+ /** Tentativi verso /internal/workload/token se Suite non risponde. Default: 4. */
39
+ serviceTokenAttempts?: number;
17
40
  /** Credenziali del client OIDC del servizio, per il token exchange fra servizi. */
18
41
  clientId?: string;
19
42
  clientSecret?: string;
@@ -62,6 +85,33 @@ export declare class SuiteError extends Error {
62
85
  }
63
86
  export declare class TokenError extends Error {
64
87
  }
88
+ /** Token di servizio valido ma senza gli scope richiesti (→ 403). */
89
+ export declare class ScopeError extends Error {
90
+ }
91
+ /** Chi chiama, secondo un `svc+jwt` verificato. */
92
+ export interface ServiceAuth {
93
+ caller: string;
94
+ orgId?: string;
95
+ scopes: string[];
96
+ /**
97
+ * Token delegato (fase 8 di docs/SERVICE-AUTH.md): l'utente di Suite per cui agisce il
98
+ * chiamante. Quando c'è, `orgId` c'è sempre e il principal della richiesta è questo utente.
99
+ */
100
+ onBehalfOf?: string;
101
+ /** Permessi dell'utente in questo servizio nell'org, calcolati da Suite all'emissione. */
102
+ userPermissions?: string[];
103
+ token: string;
104
+ claims: JWTPayload;
105
+ }
106
+ export interface SuiteWebhookEvent {
107
+ event: string;
108
+ org_id: string;
109
+ service: string;
110
+ reason: string;
111
+ }
112
+ type HeaderBag = Record<string, string | string[] | undefined>;
113
+ /** URL interno di default, senza configurazione (docs/SERVICE-AUTH.md, "Default automatici"). */
114
+ export declare function defaultInternalUrl(issuer: string, env?: NodeJS.ProcessEnv): string;
65
115
  interface Discovery {
66
116
  issuer: string;
67
117
  jwks_uri: string;
@@ -82,29 +132,96 @@ export declare class SuiteClient {
82
132
  private readonly cache;
83
133
  private readonly inflight;
84
134
  private webhookSecret?;
135
+ readonly tokenFile: string;
136
+ private readonly serviceTokens;
137
+ private readonly serviceTokenInflight;
138
+ private readonly seenWebhookJti;
139
+ /** NODE_ENV=production alla creazione: niente fallback a service key e HMAC. */
140
+ readonly production: boolean;
85
141
  constructor(opts: SuiteClientOptions);
142
+ /** Vero se c'è il token ServiceAccount proiettato (identità workload). */
143
+ hasWorkloadIdentity(): boolean;
144
+ /** Vero se il client può chiamare /internal/* (token SA o, fuori produzione, service key). */
145
+ hasInternalCredentials(): boolean;
146
+ /**
147
+ * Token di servizio `svc+jwt` per `audience` (es. "docs", "code.orchestrator", "suite-internal").
148
+ * Il token SA si rilegge dal file a ogni emissione (kubelet lo ruota); il risultato resta in
149
+ * cache per (audience, org, utente, scope) fino a exp - 60 s; richieste concorrenti condividono
150
+ * la stessa chiamata; se Suite non risponde si riprova con backoff.
151
+ *
152
+ * `onBehalfOf` (id utente di Suite, richiede `orgId`) chiede un token delegato: Suite verifica
153
+ * che chiamante e destinatario siano abilitati nell'org, che l'utente sia membro con almeno un
154
+ * permesso del servizio chiamante e che gli scope siano delegabili; altrimenti 403 con `reason`.
155
+ */
156
+ getServiceToken(audience: string, opts?: {
157
+ orgId?: string;
158
+ onBehalfOf?: string;
159
+ scope?: string;
160
+ }): Promise<string>;
161
+ private requestServiceToken;
162
+ /**
163
+ * Verifica un token di servizio in ingresso: `typ` svc+jwt, `iss`, `aud` (default: questo
164
+ * servizio), `exp` con 30 s di tolleranza, e gli scope richiesti. Accetta la richiesta
165
+ * (headers.authorization) o direttamente il token.
166
+ *
167
+ * Token delegati (`on_behalf_of`): senza `org_id` sono sempre rifiutati. Con `delegableCallers`
168
+ * un token delegato di un chiamante non in elenco è rifiutato con ScopeError (403); senza
169
+ * l'opzione non si controlla il chiamante (lo fa il plugin con `acceptsDelegationFrom`).
170
+ */
171
+ verifyServiceToken(reqOrToken: string | {
172
+ headers: HeaderBag;
173
+ }, opts?: {
174
+ scopes?: string[];
175
+ audience?: string;
176
+ delegableCallers?: string[];
177
+ }): Promise<ServiceAuth>;
86
178
  /** Discovery da /.well-known, una volta sola (ritentata se fallisce). */
87
179
  getDiscovery(): Promise<Discovery>;
88
180
  private getJwks;
89
181
  /** Valida firma, issuer, `aud` = servizio e `typ` at+jwt. Nessuna chiamata a Suite per richiesta. */
90
182
  verifyToken(token: string): Promise<SuiteAuth>;
183
+ /**
184
+ * Credenziali per /internal/*: token workload aud=suite-internal se c'è il token SA (sempre, in
185
+ * produzione), altrimenti fuori produzione la service key.
186
+ */
91
187
  private internalHeaders;
92
188
  private internal;
93
- /** Upsert idempotente dei permessi del servizio: si chiama a ogni avvio. */
94
- registerPermissions(permissions: PermissionDefinition[]): Promise<{
189
+ /**
190
+ * Upsert idempotente dei permessi del servizio: si chiama a ogni avvio. `acceptsFrom`
191
+ * dichiara chi può chiamare le audience del servizio e con quali scope
192
+ * (`{ [audience]: { [caller]: scopes[] } }`); sostituisce le regole delle audience indicate.
193
+ * `acceptsDelegationFrom` (stessa forma) è il sottoinsieme delegabile con `on_behalf_of`; deve
194
+ * stare dentro `acceptsFrom` della stessa chiamata. Un'audience registrata senza delega la perde.
195
+ */
196
+ registerPermissions(permissions: PermissionDefinition[], opts?: {
197
+ acceptsFrom?: AcceptsFrom;
198
+ acceptsDelegationFrom?: AcceptsFrom;
199
+ }): Promise<{
95
200
  registered: number;
96
201
  }>;
97
- /** Registra l'URL di invalidazione; il segreto HMAC resta in memoria. */
202
+ /**
203
+ * Registra l'URL di invalidazione. Fuori produzione Suite restituisce anche un segreto HMAC,
204
+ * che resta in memoria; in produzione le notifiche sono firmate solo con JWT.
205
+ */
98
206
  registerWebhook(url: string): Promise<{
99
- secret: string;
207
+ url: string;
208
+ secret?: string;
209
+ signature?: string;
100
210
  }>;
101
- /** Verifica firma e freschezza di una notifica di Suite. Ritorna l'org da invalidare. */
102
- verifyWebhook(headers: Record<string, string | string[] | undefined>, rawBody: string): {
103
- event: string;
104
- org_id: string;
105
- service: string;
106
- reason: string;
107
- };
211
+ /**
212
+ * Verifica una notifica di Suite con il JWT `suite-event+jwt` (Authorization: Bearer, legato al
213
+ * corpo grezzo con body_sha256, con protezione dal replay sul jti). Un JWT presente ma non
214
+ * valido è sempre un rifiuto: l'HMAC non lo salva mai. Solo fuori produzione, e solo se la
215
+ * notifica non ha un bearer, resta il fallback all'HMAC `x-suite-signature`.
216
+ */
217
+ verifyWebhookRequest(headers: HeaderBag, rawBody: string): Promise<SuiteWebhookEvent>;
218
+ private verifyWebhookJwt;
219
+ /**
220
+ * Verifica firma HMAC e freschezza di una notifica di Suite. Ritorna l'org da invalidare.
221
+ * Sempre rifiutata in produzione.
222
+ * @deprecated usare `verifyWebhookRequest` (JWT).
223
+ */
224
+ verifyWebhook(headers: Record<string, string | string[] | undefined>, rawBody: string): SuiteWebhookEvent;
108
225
  /** Config LLM dell'organizzazione, con cache e deduplica delle richieste concorrenti. */
109
226
  llmConfig(orgId: string): Promise<LlmConfig>;
110
227
  /** Invalida la cache (di un'org o tutta). */
package/dist/client.js CHANGED
@@ -1,5 +1,19 @@
1
- import { createHmac, timingSafeEqual } from 'node:crypto';
1
+ import { createHash, createHmac, timingSafeEqual } from 'node:crypto';
2
+ import { existsSync } from 'node:fs';
3
+ import { readFile } from 'node:fs/promises';
2
4
  import { createRemoteJWKSet, customFetch, jwtVerify } from 'jose';
5
+ /** Percorso del token ServiceAccount proiettato con audience = issuer di Suite. */
6
+ export const DEFAULT_SA_TOKEN_FILE = '/var/run/secrets/babel-suite/token';
7
+ /** URL interno di Suite quando il servizio gira nel cluster e SUITE_INTERNAL_URL manca. */
8
+ export const DEFAULT_IN_CLUSTER_SUITE_URL = 'http://babel-suite.babel-suite.svc.cluster.local:3001';
9
+ /** Audience delle chiamate verso Suite /internal/*. */
10
+ export const SUITE_INTERNAL_AUDIENCE = 'suite-internal';
11
+ export const SERVICE_TOKEN_TYP = 'svc+jwt';
12
+ export const EVENT_TOKEN_TYP = 'suite-event+jwt';
13
+ /** Tolleranza sull'orologio per i token tra servizi. */
14
+ const SERVICE_CLOCK_TOLERANCE = 30;
15
+ /** Il token di servizio si rinnova 60 s prima della scadenza. */
16
+ const SERVICE_TOKEN_SKEW_MS = 60_000;
3
17
  export class SuiteError extends Error {
4
18
  status;
5
19
  body;
@@ -11,7 +25,28 @@ export class SuiteError extends Error {
11
25
  }
12
26
  export class TokenError extends Error {
13
27
  }
28
+ /** Token di servizio valido ma senza gli scope richiesti (→ 403). */
29
+ export class ScopeError extends Error {
30
+ }
31
+ const header = (headers, name) => {
32
+ const v = headers[name];
33
+ return Array.isArray(v) ? v[0] : v;
34
+ };
35
+ const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
36
+ /** URL interno di default, senza configurazione (docs/SERVICE-AUTH.md, "Default automatici"). */
37
+ export function defaultInternalUrl(issuer, env = process.env) {
38
+ if (env.SUITE_INTERNAL_URL)
39
+ return env.SUITE_INTERNAL_URL;
40
+ if (env.KUBERNETES_SERVICE_HOST)
41
+ return DEFAULT_IN_CLUSTER_SUITE_URL;
42
+ return issuer;
43
+ }
14
44
  const WEBHOOK_TOLERANCE_SEC = 300;
45
+ /**
46
+ * Produzione secondo NODE_ENV, letto alla creazione del client. In produzione (fase 7 di
47
+ * docs/SERVICE-AUTH.md) niente service key né HMAC: solo identità workload e webhook JWT.
48
+ */
49
+ const isProduction = (env = process.env) => env.NODE_ENV === 'production';
15
50
  /**
16
51
  * Client di Suite indipendente dal framework: validazione JWT con JWKS in cache,
17
52
  * config LLM con cache e invalidazione, registrazione permessi e webhook, token exchange.
@@ -27,12 +62,177 @@ export class SuiteClient {
27
62
  cache = new Map();
28
63
  inflight = new Map();
29
64
  webhookSecret;
65
+ tokenFile;
66
+ serviceTokens = new Map();
67
+ serviceTokenInflight = new Map();
68
+ seenWebhookJti = new Map();
69
+ /** NODE_ENV=production alla creazione: niente fallback a service key e HMAC. */
70
+ production;
30
71
  constructor(opts) {
31
72
  this.opts = opts;
32
73
  this.issuer = opts.issuer.replace(/\/$/, '');
33
74
  this.service = opts.service;
34
- this.internalUrl = (opts.internalUrl ?? this.issuer).replace(/\/$/, '');
75
+ this.internalUrl = (opts.internalUrl ?? defaultInternalUrl(this.issuer)).replace(/\/$/, '');
76
+ this.tokenFile = opts.tokenFile ?? process.env.SUITE_SA_TOKEN_FILE ?? DEFAULT_SA_TOKEN_FILE;
35
77
  this.doFetch = opts.fetch ?? fetch;
78
+ this.production = isProduction();
79
+ if (this.production && !this.hasWorkloadIdentity()) {
80
+ // Meglio non partire che ripiegare in silenzio su una service key che Suite rifiuta.
81
+ throw new SuiteError(`NODE_ENV=production ma il token ServiceAccount ${this.tokenFile} non esiste: in ` +
82
+ 'produzione il servizio si autentica solo con l’identità workload. Montare il volume ' +
83
+ 'proiettato "suite-identity" (audience = issuer di Suite) o impostare SUITE_SA_TOKEN_FILE. ' +
84
+ 'Vedi docs/SERVICE-AUTH.md.');
85
+ }
86
+ }
87
+ /** Vero se c'è il token ServiceAccount proiettato (identità workload). */
88
+ hasWorkloadIdentity() {
89
+ return existsSync(this.tokenFile);
90
+ }
91
+ /** Vero se il client può chiamare /internal/* (token SA o, fuori produzione, service key). */
92
+ hasInternalCredentials() {
93
+ return this.hasWorkloadIdentity() || (!this.production && !!this.opts.serviceKey);
94
+ }
95
+ /**
96
+ * Token di servizio `svc+jwt` per `audience` (es. "docs", "code.orchestrator", "suite-internal").
97
+ * Il token SA si rilegge dal file a ogni emissione (kubelet lo ruota); il risultato resta in
98
+ * cache per (audience, org, utente, scope) fino a exp - 60 s; richieste concorrenti condividono
99
+ * la stessa chiamata; se Suite non risponde si riprova con backoff.
100
+ *
101
+ * `onBehalfOf` (id utente di Suite, richiede `orgId`) chiede un token delegato: Suite verifica
102
+ * che chiamante e destinatario siano abilitati nell'org, che l'utente sia membro con almeno un
103
+ * permesso del servizio chiamante e che gli scope siano delegabili; altrimenti 403 con `reason`.
104
+ */
105
+ async getServiceToken(audience, opts = {}) {
106
+ if (opts.onBehalfOf && !opts.orgId) {
107
+ throw new SuiteError('onBehalfOf richiede orgId');
108
+ }
109
+ const key = [audience, opts.orgId ?? '', opts.onBehalfOf ?? '', opts.scope ?? ''].join('\u0000');
110
+ const hit = this.serviceTokens.get(key);
111
+ if (hit && hit.refreshAt > Date.now())
112
+ return hit.token;
113
+ const pending = this.serviceTokenInflight.get(key);
114
+ if (pending)
115
+ return pending;
116
+ const p = this.requestServiceToken(audience, opts)
117
+ .then(({ token, expiresIn }) => {
118
+ this.serviceTokens.set(key, {
119
+ token,
120
+ refreshAt: Date.now() + Math.max(0, expiresIn * 1000 - SERVICE_TOKEN_SKEW_MS),
121
+ });
122
+ return token;
123
+ })
124
+ .finally(() => this.serviceTokenInflight.delete(key));
125
+ this.serviceTokenInflight.set(key, p);
126
+ return p;
127
+ }
128
+ async requestServiceToken(audience, opts) {
129
+ const attempts = Math.max(1, this.opts.serviceTokenAttempts ?? 4);
130
+ let lastError;
131
+ for (let i = 0; i < attempts; i++) {
132
+ if (i > 0)
133
+ await sleep(Math.min(5_000, 250 * 2 ** (i - 1)) * (0.5 + Math.random() / 2));
134
+ let saToken;
135
+ try {
136
+ saToken = (await readFile(this.tokenFile, 'utf8')).trim();
137
+ }
138
+ catch (err) {
139
+ throw new SuiteError(`token ServiceAccount non leggibile (${this.tokenFile}): ${err.message}`);
140
+ }
141
+ let res;
142
+ try {
143
+ res = await this.doFetch(`${this.internalUrl}/internal/workload/token`, {
144
+ method: 'POST',
145
+ headers: { authorization: `Bearer ${saToken}`, 'content-type': 'application/json' },
146
+ body: JSON.stringify({
147
+ audience,
148
+ ...(opts.orgId ? { org_id: opts.orgId } : {}),
149
+ ...(opts.onBehalfOf ? { on_behalf_of: opts.onBehalfOf } : {}),
150
+ ...(opts.scope ? { scope: opts.scope } : {}),
151
+ }),
152
+ });
153
+ }
154
+ catch (err) {
155
+ lastError = err;
156
+ continue;
157
+ }
158
+ const text = await res.text();
159
+ const body = text ? JSON.parse(text) : undefined;
160
+ if (res.ok && typeof body?.access_token === 'string') {
161
+ return {
162
+ token: body.access_token,
163
+ expiresIn: typeof body.expires_in === 'number' ? body.expires_in : 300,
164
+ };
165
+ }
166
+ const err = new SuiteError(`token di servizio per ${audience}: HTTP ${res.status}`, res.status, body);
167
+ // 4xx (tranne 429) è una risposta definitiva: inutile riprovare.
168
+ if (res.status < 500 && res.status !== 429)
169
+ throw err;
170
+ lastError = err;
171
+ }
172
+ throw lastError instanceof SuiteError
173
+ ? lastError
174
+ : new SuiteError(`Suite non raggiungibile: ${lastError?.message ?? 'errore'}`);
175
+ }
176
+ /**
177
+ * Verifica un token di servizio in ingresso: `typ` svc+jwt, `iss`, `aud` (default: questo
178
+ * servizio), `exp` con 30 s di tolleranza, e gli scope richiesti. Accetta la richiesta
179
+ * (headers.authorization) o direttamente il token.
180
+ *
181
+ * Token delegati (`on_behalf_of`): senza `org_id` sono sempre rifiutati. Con `delegableCallers`
182
+ * un token delegato di un chiamante non in elenco è rifiutato con ScopeError (403); senza
183
+ * l'opzione non si controlla il chiamante (lo fa il plugin con `acceptsDelegationFrom`).
184
+ */
185
+ async verifyServiceToken(reqOrToken, opts = {}) {
186
+ let token;
187
+ if (typeof reqOrToken === 'string')
188
+ token = reqOrToken;
189
+ else {
190
+ const h = header(reqOrToken.headers, 'authorization');
191
+ if (!h?.startsWith('Bearer '))
192
+ throw new TokenError('bearer token mancante');
193
+ token = h.slice(7).trim();
194
+ }
195
+ let payload;
196
+ try {
197
+ ({ payload } = await jwtVerify(token, await this.getJwks(), {
198
+ issuer: this.issuer,
199
+ audience: opts.audience ?? this.service,
200
+ typ: SERVICE_TOKEN_TYP,
201
+ algorithms: ['RS256'],
202
+ clockTolerance: SERVICE_CLOCK_TOLERANCE,
203
+ requiredClaims: ['exp', 'iat', 'sub'],
204
+ }));
205
+ }
206
+ catch (err) {
207
+ throw new TokenError(`token di servizio non valido: ${err.message}`);
208
+ }
209
+ const caller = payload.azp;
210
+ if (payload.token_use !== 'service' ||
211
+ typeof caller !== 'string' ||
212
+ payload.sub !== `svc:${caller}`) {
213
+ throw new TokenError('non è un token di servizio');
214
+ }
215
+ const scopes = typeof payload.scope === 'string' ? payload.scope.split(' ').filter(Boolean) : [];
216
+ const orgId = typeof payload.org_id === 'string' ? payload.org_id : undefined;
217
+ let delegation = {};
218
+ if (payload.on_behalf_of !== undefined) {
219
+ const perms = payload.user_permissions;
220
+ if (typeof payload.on_behalf_of !== 'string' ||
221
+ !payload.on_behalf_of ||
222
+ !orgId ||
223
+ !Array.isArray(perms) ||
224
+ !perms.every((p) => typeof p === 'string')) {
225
+ throw new TokenError('token delegato non valido (on_behalf_of senza org_id o permessi)');
226
+ }
227
+ if (opts.delegableCallers && !opts.delegableCallers.includes(caller)) {
228
+ throw new ScopeError(`token delegati di ${caller} non accettati`);
229
+ }
230
+ delegation = { onBehalfOf: payload.on_behalf_of, userPermissions: perms };
231
+ }
232
+ const missing = (opts.scopes ?? []).filter((s) => !scopes.includes(s));
233
+ if (missing.length)
234
+ throw new ScopeError(`scope richiesto: ${missing.join(', ')}`);
235
+ return { caller, orgId, scopes, ...delegation, token, claims: payload };
36
236
  }
37
237
  /** Discovery da /.well-known, una volta sola (ritentata se fallisce). */
38
238
  getDiscovery() {
@@ -81,16 +281,24 @@ export class SuiteClient {
81
281
  : [];
82
282
  return { userId: payload.sub, orgId: payload.org_id, permissions, token, claims: payload };
83
283
  }
84
- internalHeaders() {
85
- if (!this.opts.serviceKey)
86
- throw new SuiteError('serviceKey non configurata');
284
+ /**
285
+ * Credenziali per /internal/*: token workload aud=suite-internal se c'è il token SA (sempre, in
286
+ * produzione), altrimenti fuori produzione la service key.
287
+ */
288
+ async internalHeaders() {
289
+ if (this.production || this.hasWorkloadIdentity()) {
290
+ return { authorization: `Bearer ${await this.getServiceToken(SUITE_INTERNAL_AUDIENCE)}` };
291
+ }
292
+ if (!this.opts.serviceKey) {
293
+ throw new SuiteError('né token ServiceAccount né serviceKey configurati');
294
+ }
87
295
  return {
88
296
  'x-suite-service': this.service,
89
297
  'x-suite-service-key': this.opts.serviceKey,
90
298
  };
91
299
  }
92
300
  async internal(method, path, body) {
93
- const headers = this.internalHeaders();
301
+ const headers = await this.internalHeaders();
94
302
  if (body !== undefined)
95
303
  headers['content-type'] = 'application/json';
96
304
  const res = await this.doFetch(`${this.internalUrl}/internal${path}`, {
@@ -104,21 +312,81 @@ export class SuiteClient {
104
312
  throw new SuiteError(`Suite ${method} ${path}: HTTP ${res.status}`, res.status, parsed);
105
313
  return parsed;
106
314
  }
107
- /** Upsert idempotente dei permessi del servizio: si chiama a ogni avvio. */
108
- registerPermissions(permissions) {
315
+ /**
316
+ * Upsert idempotente dei permessi del servizio: si chiama a ogni avvio. `acceptsFrom`
317
+ * dichiara chi può chiamare le audience del servizio e con quali scope
318
+ * (`{ [audience]: { [caller]: scopes[] } }`); sostituisce le regole delle audience indicate.
319
+ * `acceptsDelegationFrom` (stessa forma) è il sottoinsieme delegabile con `on_behalf_of`; deve
320
+ * stare dentro `acceptsFrom` della stessa chiamata. Un'audience registrata senza delega la perde.
321
+ */
322
+ registerPermissions(permissions, opts = {}) {
109
323
  return this.internal('POST', '/permissions/register', {
110
324
  service: this.service,
111
325
  permissions,
326
+ ...(opts.acceptsFrom ? { acceptsFrom: opts.acceptsFrom } : {}),
327
+ ...(opts.acceptsDelegationFrom ? { acceptsDelegationFrom: opts.acceptsDelegationFrom } : {}),
112
328
  });
113
329
  }
114
- /** Registra l'URL di invalidazione; il segreto HMAC resta in memoria. */
330
+ /**
331
+ * Registra l'URL di invalidazione. Fuori produzione Suite restituisce anche un segreto HMAC,
332
+ * che resta in memoria; in produzione le notifiche sono firmate solo con JWT.
333
+ */
115
334
  async registerWebhook(url) {
116
335
  const res = await this.internal('POST', '/llm-config/webhook', { url });
117
- this.webhookSecret = res.secret;
336
+ this.webhookSecret = this.production ? undefined : (res.secret ?? undefined);
118
337
  return res;
119
338
  }
120
- /** Verifica firma e freschezza di una notifica di Suite. Ritorna l'org da invalidare. */
339
+ /**
340
+ * Verifica una notifica di Suite con il JWT `suite-event+jwt` (Authorization: Bearer, legato al
341
+ * corpo grezzo con body_sha256, con protezione dal replay sul jti). Un JWT presente ma non
342
+ * valido è sempre un rifiuto: l'HMAC non lo salva mai. Solo fuori produzione, e solo se la
343
+ * notifica non ha un bearer, resta il fallback all'HMAC `x-suite-signature`.
344
+ */
345
+ async verifyWebhookRequest(headers, rawBody) {
346
+ const auth = header(headers, 'authorization');
347
+ if (auth?.startsWith('Bearer ')) {
348
+ await this.verifyWebhookJwt(auth.slice(7).trim(), rawBody);
349
+ return JSON.parse(rawBody);
350
+ }
351
+ if (this.production) {
352
+ throw new TokenError('webhook senza JWT suite-event+jwt (in produzione l’HMAC non vale)');
353
+ }
354
+ return this.verifyWebhook(headers, rawBody);
355
+ }
356
+ async verifyWebhookJwt(token, rawBody) {
357
+ let payload;
358
+ try {
359
+ ({ payload } = await jwtVerify(token, await this.getJwks(), {
360
+ issuer: this.issuer,
361
+ audience: this.service,
362
+ typ: EVENT_TOKEN_TYP,
363
+ algorithms: ['RS256'],
364
+ clockTolerance: SERVICE_CLOCK_TOLERANCE,
365
+ requiredClaims: ['exp', 'iat', 'jti'],
366
+ }));
367
+ }
368
+ catch (err) {
369
+ throw new TokenError(`JWT del webhook non valido: ${err.message}`);
370
+ }
371
+ const digest = createHash('sha256').update(rawBody).digest('hex');
372
+ if (payload.body_sha256 !== digest)
373
+ throw new TokenError('body_sha256 non corrisponde');
374
+ const now = Date.now();
375
+ for (const [jti, exp] of this.seenWebhookJti)
376
+ if (exp < now)
377
+ this.seenWebhookJti.delete(jti);
378
+ if (this.seenWebhookJti.has(payload.jti))
379
+ throw new TokenError('webhook già ricevuto (replay)');
380
+ this.seenWebhookJti.set(payload.jti, (payload.exp + SERVICE_CLOCK_TOLERANCE) * 1000);
381
+ }
382
+ /**
383
+ * Verifica firma HMAC e freschezza di una notifica di Suite. Ritorna l'org da invalidare.
384
+ * Sempre rifiutata in produzione.
385
+ * @deprecated usare `verifyWebhookRequest` (JWT).
386
+ */
121
387
  verifyWebhook(headers, rawBody) {
388
+ if (this.production)
389
+ throw new TokenError('in produzione i webhook HMAC non sono accettati');
122
390
  if (!this.webhookSecret)
123
391
  throw new TokenError('webhook non registrato');
124
392
  const ts = String(headers['x-suite-timestamp'] ?? '');
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  export { suiteAuth, type SuiteAuthOptions } from './plugin.js';
2
- export { SuiteClient, SuiteError, TokenError, type LlmConfig, type OrgMember, type PermissionDefinition, type SuiteAuth, type SuiteClientOptions, } from './client.js';
2
+ export { DEFAULT_IN_CLUSTER_SUITE_URL, DEFAULT_SA_TOKEN_FILE, EVENT_TOKEN_TYP, SERVICE_TOKEN_TYP, SUITE_INTERNAL_AUDIENCE, ScopeError, SuiteClient, SuiteError, TokenError, defaultInternalUrl, type AcceptsFrom, type LlmConfig, type ServiceAuth, type SuiteWebhookEvent, type OrgMember, type PermissionDefinition, type SuiteAuth, type SuiteClientOptions, } from './client.js';
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
1
  export { suiteAuth } from './plugin.js';
2
- export { SuiteClient, SuiteError, TokenError, } from './client.js';
2
+ export { DEFAULT_IN_CLUSTER_SUITE_URL, DEFAULT_SA_TOKEN_FILE, EVENT_TOKEN_TYP, SERVICE_TOKEN_TYP, SUITE_INTERNAL_AUDIENCE, ScopeError, SuiteClient, SuiteError, TokenError, defaultInternalUrl, } from './client.js';
3
3
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAyB,MAAM,aAAa,CAAC;AAC/D,OAAO,EACL,WAAW,EACX,UAAU,EACV,UAAU,GAMX,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAyB,MAAM,aAAa,CAAC;AAC/D,OAAO,EACL,4BAA4B,EAC5B,qBAAqB,EACrB,eAAe,EACf,iBAAiB,EACjB,uBAAuB,EACvB,UAAU,EACV,WAAW,EACX,UAAU,EACV,UAAU,EACV,kBAAkB,GASnB,MAAM,aAAa,CAAC"}
package/dist/plugin.d.ts CHANGED
@@ -1,8 +1,20 @@
1
1
  import type { FastifyPluginAsync, preHandlerAsyncHookHandler } from 'fastify';
2
- import { SuiteClient, type PermissionDefinition, type SuiteAuth, type SuiteClientOptions } from './client.js';
2
+ import { SuiteClient, type AcceptsFrom, type PermissionDefinition, type ServiceAuth, type SuiteAuth, type SuiteClientOptions } from './client.js';
3
3
  export interface SuiteAuthOptions extends SuiteClientOptions {
4
4
  /** Permessi del servizio, registrati all'avvio con upsert idempotente. */
5
5
  permissions?: PermissionDefinition[];
6
+ /**
7
+ * Chi può chiamare questo servizio con un token di servizio e con quali scope,
8
+ * registrato all'avvio insieme ai permessi: `{ [audience]: { [caller]: scope[] } }`.
9
+ */
10
+ acceptsFrom?: AcceptsFrom;
11
+ /**
12
+ * Sottoinsieme di `acceptsFrom` che i chiamanti possono usare con token delegati
13
+ * (`on_behalf_of`, fase 8): `{ [audience]: { [caller]: scope[] } }`. `requireServiceToken`
14
+ * rifiuta con 403 i token delegati di chiamanti non elencati per l'audience (senza questa
15
+ * opzione, tutti i token delegati).
16
+ */
17
+ acceptsDelegationFrom?: AcceptsFrom;
6
18
  /**
7
19
  * URL pubblico (raggiungibile da Suite) dell'endpoint di invalidazione. Se valorizzato,
8
20
  * all'avvio il plugin lo registra presso Suite (la route su `webhookPath` è sempre montata).
@@ -10,7 +22,7 @@ export interface SuiteAuthOptions extends SuiteClientOptions {
10
22
  webhookUrl?: string;
11
23
  /**
12
24
  * Path locale dell'endpoint di invalidazione, montato sempre dal plugin
13
- * (risponde 401 finché il webhook non è registrato). Default: /internal/config-changed.
25
+ * (senza un JWT valido, o fuori produzione una firma HMAC valida, risponde 401). Default: /internal/config-changed.
14
26
  * `false` per non montarlo.
15
27
  */
16
28
  webhookPath?: string | false;
@@ -24,9 +36,18 @@ declare module 'fastify' {
24
36
  authenticate: preHandlerAsyncHookHandler;
25
37
  /** preHandler: autentica e richiede il permesso indicato (nel token scoped del servizio). */
26
38
  requirePermission: (...permissions: string[]) => preHandlerAsyncHookHandler;
39
+ /**
40
+ * preHandler per le chiamate da altri servizi: richiede un `svc+jwt` con `aud` di questo
41
+ * servizio (o `audience`) e gli scope indicati; popola `req.serviceAuth`.
42
+ */
43
+ requireServiceToken: (opts?: {
44
+ scopes?: string[];
45
+ audience?: string;
46
+ }) => preHandlerAsyncHookHandler;
27
47
  }
28
48
  interface FastifyRequest {
29
49
  auth: SuiteAuth;
50
+ serviceAuth: ServiceAuth;
30
51
  }
31
52
  }
32
53
  export declare const suiteAuth: FastifyPluginAsync<SuiteAuthOptions>;
package/dist/plugin.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import fp from 'fastify-plugin';
2
- import { SuiteClient, TokenError, } from './client.js';
2
+ import { ScopeError, SuiteClient, TokenError, } from './client.js';
3
3
  function unauthorized(reply, message) {
4
4
  return reply
5
5
  .code(401)
@@ -10,6 +10,7 @@ const plugin = async (app, opts) => {
10
10
  const client = new SuiteClient(opts);
11
11
  app.decorate('suite', client);
12
12
  app.decorateRequest('auth', null);
13
+ app.decorateRequest('serviceAuth', null);
13
14
  async function authenticate(req, reply) {
14
15
  const header = req.headers.authorization;
15
16
  if (!header?.startsWith('Bearer '))
@@ -39,14 +40,33 @@ const plugin = async (app, opts) => {
39
40
  }
40
41
  };
41
42
  });
43
+ app.decorate('requireServiceToken', (o = {}) => {
44
+ return async function (req, reply) {
45
+ const audience = o.audience ?? client.service;
46
+ try {
47
+ req.serviceAuth = await client.verifyServiceToken(req, {
48
+ ...o,
49
+ delegableCallers: Object.keys(opts.acceptsDelegationFrom?.[audience] ?? {}),
50
+ });
51
+ }
52
+ catch (err) {
53
+ if (err instanceof ScopeError) {
54
+ return reply.code(403).send({ error: 'forbidden', message: err.message });
55
+ }
56
+ if (err instanceof TokenError)
57
+ return unauthorized(reply, err.message);
58
+ throw err;
59
+ }
60
+ };
61
+ });
42
62
  if (opts.webhookPath !== false) {
43
63
  const path = opts.webhookPath ?? '/internal/config-changed';
44
64
  await app.register(async (child) => {
45
- // La firma HMAC è calcolata sul body grezzo.
65
+ // JWT (body_sha256) e firma HMAC sono calcolati sul body grezzo.
46
66
  child.addContentTypeParser('application/json', { parseAs: 'string' }, (_req, body, done) => done(null, body));
47
67
  child.post(path, async (req, reply) => {
48
68
  try {
49
- const event = client.verifyWebhook(req.headers, String(req.body ?? ''));
69
+ const event = await client.verifyWebhookRequest(req.headers, String(req.body ?? ''));
50
70
  client.invalidate(event.org_id);
51
71
  return reply.code(204).send();
52
72
  }
@@ -59,13 +79,18 @@ const plugin = async (app, opts) => {
59
79
  });
60
80
  });
61
81
  }
62
- // Registrazione all'avvio: permessi e webhook. Senza service key non c'è nulla da registrare.
82
+ // Registrazione all'avvio: permessi, acceptsFrom e webhook. Senza token SA né service key
83
+ // non c'è modo di chiamare /internal/*.
63
84
  app.addHook('onReady', async () => {
64
- if (!opts.serviceKey)
85
+ if (!client.hasInternalCredentials())
65
86
  return;
66
87
  try {
67
- if (opts.permissions?.length)
68
- await client.registerPermissions(opts.permissions);
88
+ if (opts.permissions?.length || opts.acceptsFrom) {
89
+ await client.registerPermissions(opts.permissions ?? [], {
90
+ acceptsFrom: opts.acceptsFrom,
91
+ acceptsDelegationFrom: opts.acceptsDelegationFrom,
92
+ });
93
+ }
69
94
  if (opts.webhookUrl)
70
95
  await client.registerWebhook(opts.webhookUrl);
71
96
  }
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@babelpeak/babel-suite-server-sdk",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "SDK Node per integrare un servizio con Babel Suite: auth JWT, permessi, config LLM",
5
5
  "license": "UNLICENSED",
6
6
  "repository": {