@babelpeak/babel-suite-server-sdk 0.2.0 → 0.3.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/index.d.ts CHANGED
@@ -1,2 +1,3 @@
1
1
  export { suiteAuth, type SuiteAuthOptions } from './plugin.js';
2
+ export { DEFAULT_LOGIN_SCOPE, SuiteLogin, SuiteLoginError, returnToFrom, safeReturnTo, type SuiteLoginErrorCode, type SuiteLoginOptions, type SuiteLoginResult, type SuiteLoginTokens, } from './login.js';
2
3
  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,4 @@
1
1
  export { suiteAuth } from './plugin.js';
2
+ export { DEFAULT_LOGIN_SCOPE, SuiteLogin, SuiteLoginError, returnToFrom, safeReturnTo, } from './login.js';
2
3
  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
4
  //# 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,4BAA4B,EAC5B,qBAAqB,EACrB,eAAe,EACf,iBAAiB,EACjB,uBAAuB,EACvB,UAAU,EACV,WAAW,EACX,UAAU,EACV,UAAU,EACV,kBAAkB,GASnB,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,mBAAmB,EACnB,UAAU,EACV,eAAe,EACf,YAAY,EACZ,YAAY,GAKb,MAAM,YAAY,CAAC;AACpB,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"}
@@ -0,0 +1,97 @@
1
+ import { type JWTPayload } from 'jose';
2
+ /**
3
+ * Login con Babel Suite per app con backend (Authorization Code + PKCE), indipendente dal
4
+ * framework: genera l'URL di autorizzazione e un cookie con state, nonce, verifier e la pagina
5
+ * da cui l'utente è partito; al callback verifica tutto e restituisce token e `returnTo`.
6
+ *
7
+ * const login = new SuiteLogin({ issuer, clientId, clientSecret, redirectUri });
8
+ * // pagina protetta senza sessione:
9
+ * redirect(`/login?return_to=${encodeURIComponent(returnToFrom(request.url))}`)
10
+ * // GET /login
11
+ * const { url, cookie } = await login.start({ returnTo: query.return_to });
12
+ * // GET /callback
13
+ * const { tokens, claims, returnTo, clearCookie } = await login.finish(request.url, cookieHeader);
14
+ */
15
+ export interface SuiteLoginOptions {
16
+ /** URL di Suite (issuer OIDC). */
17
+ issuer: string;
18
+ clientId: string;
19
+ /** Client confidenziale (client_secret_basic). Senza: client pubblico, solo PKCE. */
20
+ clientSecret?: string;
21
+ /** Redirect URI registrata per il client: la rotta che chiama `finish`. */
22
+ redirectUri: string;
23
+ scope?: string;
24
+ /** Nome del cookie temporaneo del login (default `suite_login`). */
25
+ cookieName?: string;
26
+ /** Path del cookie: default il path della redirect URI, così viaggia solo verso il callback. */
27
+ cookiePath?: string;
28
+ /** Default: vero se la redirect URI è https. */
29
+ secureCookie?: boolean;
30
+ fetch?: typeof fetch;
31
+ }
32
+ export interface SuiteLoginTokens {
33
+ accessToken: string;
34
+ refreshToken?: string;
35
+ idToken: string;
36
+ expiresIn: number;
37
+ }
38
+ export interface SuiteLoginResult {
39
+ tokens: SuiteLoginTokens;
40
+ /** Claim dell'id token verificato (sub, sid, email, name, …). */
41
+ claims: JWTPayload & {
42
+ sid?: string;
43
+ email?: string;
44
+ name?: string;
45
+ };
46
+ /** Pagina da cui era partito il login, già validata come path relativo dell'app. */
47
+ returnTo: string;
48
+ /** Set-Cookie che cancella il cookie del login: va sempre inviato con la risposta. */
49
+ clearCookie: string;
50
+ }
51
+ export type SuiteLoginErrorCode = 'invalid_state' | 'access_denied' | 'provider_error' | 'token_error' | 'invalid_id_token';
52
+ export declare class SuiteLoginError extends Error {
53
+ readonly code: SuiteLoginErrorCode;
54
+ constructor(code: SuiteLoginErrorCode, message?: string);
55
+ }
56
+ export declare const DEFAULT_LOGIN_SCOPE = "openid email profile offline_access orgs";
57
+ /**
58
+ * Solo percorsi relativi della stessa app sopravvivono al giro di login: un valore assoluto,
59
+ * protocol-relative (`//host`) o con backslash diventa `/`. Evita gli open redirect.
60
+ */
61
+ export declare function safeReturnTo(value: string | null | undefined, fallback?: string): string;
62
+ /** Pagina corrente (path e query) da passare come `returnTo`, partendo dall'URL della richiesta. */
63
+ export declare function returnToFrom(requestUrl: string | URL): string;
64
+ export declare class SuiteLogin {
65
+ private readonly opts;
66
+ readonly issuer: string;
67
+ private readonly cookieName;
68
+ private readonly cookieAttrs;
69
+ private readonly doFetch;
70
+ private discovery?;
71
+ private jwks?;
72
+ constructor(opts: SuiteLoginOptions);
73
+ /** Set-Cookie che cancella lo stato del login (per esempio su un errore gestito a mano). */
74
+ get clearCookie(): string;
75
+ /** Avvia il login: redirect del browser a `url`, impostando `cookie` sulla stessa risposta. */
76
+ start(opts?: {
77
+ returnTo?: string | null;
78
+ loginHint?: string;
79
+ }): Promise<{
80
+ url: string;
81
+ cookie: string;
82
+ }>;
83
+ /**
84
+ * Chiude il login sul callback: controlla state e cookie, scambia il codice, verifica l'id token
85
+ * (firma, issuer, audience, nonce). Su errore lancia `SuiteLoginError`; in ogni caso la risposta
86
+ * deve includere `clearCookie`.
87
+ */
88
+ finish(callbackUrl: string | URL, cookieHeader: string | null | undefined): Promise<SuiteLoginResult>;
89
+ /** URL di logout di Suite (RP-initiated): chiude anche la sessione Suite. */
90
+ logoutUrl(opts?: {
91
+ idTokenHint?: string;
92
+ postLogoutRedirectUri?: string;
93
+ }): Promise<string>;
94
+ private readCookie;
95
+ private getDiscovery;
96
+ private getJwks;
97
+ }
package/dist/login.js ADDED
@@ -0,0 +1,207 @@
1
+ import { createHash, randomBytes } from 'node:crypto';
2
+ import { createRemoteJWKSet, customFetch, jwtVerify } from 'jose';
3
+ export class SuiteLoginError extends Error {
4
+ code;
5
+ constructor(code, message = code) {
6
+ super(message);
7
+ this.code = code;
8
+ }
9
+ }
10
+ export const DEFAULT_LOGIN_SCOPE = 'openid email profile offline_access orgs';
11
+ const STATE_MAX_AGE = 600;
12
+ const random = (bytes = 32) => randomBytes(bytes).toString('base64url');
13
+ /**
14
+ * Solo percorsi relativi della stessa app sopravvivono al giro di login: un valore assoluto,
15
+ * protocol-relative (`//host`) o con backslash diventa `/`. Evita gli open redirect.
16
+ */
17
+ export function safeReturnTo(value, fallback = '/') {
18
+ if (!value || !value.startsWith('/') || value.startsWith('//') || value.startsWith('/\\'))
19
+ return fallback;
20
+ // Caratteri di controllo (CR/LF, tab, …): il parser URL li scarterebbe cambiando il significato.
21
+ for (const ch of value) {
22
+ const c = ch.charCodeAt(0);
23
+ if (c < 0x20 || c === 0x7f)
24
+ return fallback;
25
+ }
26
+ try {
27
+ const base = 'http://app.invalid';
28
+ const url = new URL(value, base);
29
+ if (url.origin !== base)
30
+ return fallback;
31
+ return url.pathname + url.search + url.hash;
32
+ }
33
+ catch {
34
+ return fallback;
35
+ }
36
+ }
37
+ /** Pagina corrente (path e query) da passare come `returnTo`, partendo dall'URL della richiesta. */
38
+ export function returnToFrom(requestUrl) {
39
+ const url = new URL(String(requestUrl), 'http://app.invalid');
40
+ return safeReturnTo(url.pathname + url.search);
41
+ }
42
+ export class SuiteLogin {
43
+ opts;
44
+ issuer;
45
+ cookieName;
46
+ cookieAttrs;
47
+ doFetch;
48
+ discovery;
49
+ jwks;
50
+ constructor(opts) {
51
+ this.opts = opts;
52
+ this.issuer = opts.issuer.replace(/\/$/, '');
53
+ this.cookieName = opts.cookieName ?? 'suite_login';
54
+ const redirect = new URL(opts.redirectUri);
55
+ const secure = opts.secureCookie ?? redirect.protocol === 'https:';
56
+ // SameSite=Lax: il cookie deve arrivare con il redirect top-level di ritorno da Suite.
57
+ this.cookieAttrs = `Path=${opts.cookiePath ?? redirect.pathname}; HttpOnly; SameSite=Lax${secure ? '; Secure' : ''}`;
58
+ this.doFetch = opts.fetch ?? fetch;
59
+ }
60
+ /** Set-Cookie che cancella lo stato del login (per esempio su un errore gestito a mano). */
61
+ get clearCookie() {
62
+ return `${this.cookieName}=; ${this.cookieAttrs}; Max-Age=0`;
63
+ }
64
+ /** Avvia il login: redirect del browser a `url`, impostando `cookie` sulla stessa risposta. */
65
+ async start(opts = {}) {
66
+ const d = await this.getDiscovery();
67
+ const pending = {
68
+ state: random(),
69
+ nonce: random(),
70
+ verifier: random(48),
71
+ returnTo: safeReturnTo(opts.returnTo),
72
+ };
73
+ const url = new URL(d.authorization_endpoint);
74
+ url.search = new URLSearchParams({
75
+ client_id: this.opts.clientId,
76
+ redirect_uri: this.opts.redirectUri,
77
+ response_type: 'code',
78
+ scope: this.opts.scope ?? DEFAULT_LOGIN_SCOPE,
79
+ state: pending.state,
80
+ nonce: pending.nonce,
81
+ code_challenge: createHash('sha256').update(pending.verifier).digest('base64url'),
82
+ code_challenge_method: 'S256',
83
+ ...(opts.loginHint ? { login_hint: opts.loginHint } : {}),
84
+ }).toString();
85
+ const value = Buffer.from(JSON.stringify(pending)).toString('base64url');
86
+ return {
87
+ url: url.toString(),
88
+ cookie: `${this.cookieName}=${value}; ${this.cookieAttrs}; Max-Age=${STATE_MAX_AGE}`,
89
+ };
90
+ }
91
+ /**
92
+ * Chiude il login sul callback: controlla state e cookie, scambia il codice, verifica l'id token
93
+ * (firma, issuer, audience, nonce). Su errore lancia `SuiteLoginError`; in ogni caso la risposta
94
+ * deve includere `clearCookie`.
95
+ */
96
+ async finish(callbackUrl, cookieHeader) {
97
+ const params = new URL(String(callbackUrl), 'http://app.invalid').searchParams;
98
+ const error = params.get('error');
99
+ if (error) {
100
+ throw new SuiteLoginError(error === 'access_denied' ? 'access_denied' : 'provider_error', params.get('error_description') ?? error);
101
+ }
102
+ const pending = this.readCookie(cookieHeader);
103
+ const code = params.get('code');
104
+ if (!pending || !code || params.get('state') !== pending.state) {
105
+ throw new SuiteLoginError('invalid_state', 'state assente, scaduto o diverso');
106
+ }
107
+ const d = await this.getDiscovery();
108
+ const headers = {
109
+ 'content-type': 'application/x-www-form-urlencoded',
110
+ };
111
+ const body = new URLSearchParams({
112
+ grant_type: 'authorization_code',
113
+ code,
114
+ redirect_uri: this.opts.redirectUri,
115
+ code_verifier: pending.verifier,
116
+ });
117
+ if (this.opts.clientSecret) {
118
+ const basic = Buffer.from(`${encodeURIComponent(this.opts.clientId)}:${encodeURIComponent(this.opts.clientSecret)}`).toString('base64');
119
+ headers.authorization = `Basic ${basic}`;
120
+ }
121
+ else {
122
+ body.set('client_id', this.opts.clientId);
123
+ }
124
+ const res = await this.doFetch(d.token_endpoint, { method: 'POST', headers, body });
125
+ const json = (await res.json().catch(() => ({})));
126
+ if (!res.ok || !json.access_token || !json.id_token) {
127
+ throw new SuiteLoginError('token_error', json.error_description ?? json.error ?? `token endpoint: HTTP ${res.status}`);
128
+ }
129
+ let claims;
130
+ try {
131
+ ({ payload: claims } = await jwtVerify(json.id_token, await this.getJwks(), {
132
+ issuer: d.issuer,
133
+ audience: this.opts.clientId,
134
+ }));
135
+ }
136
+ catch (err) {
137
+ throw new SuiteLoginError('invalid_id_token', err.message);
138
+ }
139
+ if (claims.nonce !== pending.nonce)
140
+ throw new SuiteLoginError('invalid_id_token', 'nonce');
141
+ return {
142
+ tokens: {
143
+ accessToken: json.access_token,
144
+ refreshToken: json.refresh_token,
145
+ idToken: json.id_token,
146
+ expiresIn: json.expires_in ?? 0,
147
+ },
148
+ claims,
149
+ returnTo: pending.returnTo,
150
+ clearCookie: this.clearCookie,
151
+ };
152
+ }
153
+ /** URL di logout di Suite (RP-initiated): chiude anche la sessione Suite. */
154
+ async logoutUrl(opts = {}) {
155
+ const d = await this.getDiscovery();
156
+ const url = new URL(d.end_session_endpoint ?? `${this.issuer}/auth/logout`);
157
+ url.searchParams.set('client_id', this.opts.clientId);
158
+ if (opts.idTokenHint)
159
+ url.searchParams.set('id_token_hint', opts.idTokenHint);
160
+ if (opts.postLogoutRedirectUri)
161
+ url.searchParams.set('post_logout_redirect_uri', opts.postLogoutRedirectUri);
162
+ return url.toString();
163
+ }
164
+ readCookie(header) {
165
+ const raw = (header ?? '')
166
+ .split(';')
167
+ .map((c) => c.trim())
168
+ .find((c) => c.startsWith(`${this.cookieName}=`))
169
+ ?.slice(this.cookieName.length + 1);
170
+ if (!raw)
171
+ return undefined;
172
+ try {
173
+ const v = JSON.parse(Buffer.from(raw, 'base64url').toString('utf8'));
174
+ if (!v.state || !v.nonce || !v.verifier)
175
+ return undefined;
176
+ // Il cookie arriva dal browser: il ritorno si rivalida comunque.
177
+ return { ...v, returnTo: safeReturnTo(v.returnTo) };
178
+ }
179
+ catch {
180
+ return undefined;
181
+ }
182
+ }
183
+ getDiscovery() {
184
+ this.discovery ??= (async () => {
185
+ const res = await this.doFetch(`${this.issuer}/.well-known/openid-configuration`);
186
+ if (!res.ok)
187
+ throw new SuiteLoginError('provider_error', `discovery: HTTP ${res.status}`);
188
+ return (await res.json());
189
+ })().catch((err) => {
190
+ this.discovery = undefined;
191
+ throw err;
192
+ });
193
+ return this.discovery;
194
+ }
195
+ async getJwks() {
196
+ if (!this.jwks) {
197
+ const d = await this.getDiscovery();
198
+ this.jwks = createRemoteJWKSet(new URL(d.jwks_uri), {
199
+ cooldownDuration: 30_000,
200
+ cacheMaxAge: 10 * 60_000,
201
+ ...(this.opts.fetch ? { [customFetch]: this.opts.fetch } : {}),
202
+ });
203
+ }
204
+ return this.jwks;
205
+ }
206
+ }
207
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../src/login.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.2.0",
3
+ "version": "0.3.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": {