@mcp-abap-adt/auth-broker 3.0.4 → 4.0.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.
Files changed (51) hide show
  1. package/CHANGELOG.md +448 -1
  2. package/README.md +723 -533
  3. package/dist/AuthBroker.d.ts +178 -29
  4. package/dist/AuthBroker.d.ts.map +1 -1
  5. package/dist/AuthBroker.js +494 -101
  6. package/dist/DestinationConfigError.d.ts +27 -0
  7. package/dist/DestinationConfigError.d.ts.map +1 -0
  8. package/dist/DestinationConfigError.js +36 -0
  9. package/dist/SessionWriter.d.ts +54 -0
  10. package/dist/SessionWriter.d.ts.map +1 -0
  11. package/dist/SessionWriter.js +135 -0
  12. package/dist/binding.d.ts +95 -0
  13. package/dist/binding.d.ts.map +1 -0
  14. package/dist/binding.js +207 -0
  15. package/dist/bindingOf.d.ts +36 -0
  16. package/dist/bindingOf.d.ts.map +1 -0
  17. package/dist/bindingOf.js +53 -0
  18. package/dist/destinations.d.ts +139 -0
  19. package/dist/destinations.d.ts.map +1 -0
  20. package/dist/destinations.js +429 -0
  21. package/dist/index.d.ts +7 -3
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +11 -7
  24. package/dist/providers/ITokenProvider.d.ts +2 -1
  25. package/dist/providers/ITokenProvider.d.ts.map +1 -1
  26. package/dist/providers/index.d.ts +2 -2
  27. package/dist/providers/index.js +2 -2
  28. package/dist/stores/index.d.ts +2 -2
  29. package/dist/stores/index.js +2 -2
  30. package/dist/stores/interfaces.d.ts +4 -3
  31. package/dist/stores/interfaces.d.ts.map +1 -1
  32. package/dist/stores/interfaces.js +2 -2
  33. package/dist/types.d.ts +5 -2
  34. package/dist/types.d.ts.map +1 -1
  35. package/dist/types.js +3 -1
  36. package/package.json +25 -45
  37. package/CONTRIBUTORS.md +0 -33
  38. package/dist/__tests__/helpers/configHelpers.d.ts +0 -59
  39. package/dist/__tests__/helpers/configHelpers.d.ts.map +0 -1
  40. package/dist/__tests__/helpers/configHelpers.js +0 -206
  41. package/dist/__tests__/helpers/netHelpers.d.ts +0 -3
  42. package/dist/__tests__/helpers/netHelpers.d.ts.map +0 -1
  43. package/dist/__tests__/helpers/netHelpers.js +0 -63
  44. package/dist/__tests__/helpers/testLogger.d.ts +0 -7
  45. package/dist/__tests__/helpers/testLogger.d.ts.map +0 -1
  46. package/dist/__tests__/helpers/testLogger.js +0 -54
  47. package/dist/bin/mcp-auth.js +0 -752
  48. package/dist/bin/mcp-sso.js +0 -825
  49. package/dist/bin/mcpSsoConfig.js +0 -566
  50. package/dist/bin/samlMetadata.js +0 -175
  51. package/dist/bin/workDir.js +0 -79
@@ -1,5 +1,15 @@
1
1
  /**
2
- * AuthBroker: tokens for a destination, from a provider, kept in a session store.
2
+ * AuthBroker: the credential for a destination, and tokens for one.
3
+ *
4
+ * `getProvider` builds the `IAuthProvider` a destination states, from the
5
+ * means its service key store holds and the secret its session store holds.
6
+ * Every token provider it builds writes what it obtains back to the session
7
+ * store through `onTokens` — the secret alone, retried by the broker when the
8
+ * store fails (`SessionWriter`); `flush()` reports what is still pending.
9
+ * The token API (`getToken`, `refreshToken`, `createTokenRefresher`) asks that
10
+ * same provider — one per destination, shared — or, when the consumer gives
11
+ * one, the consumer's provider, whose every answer it writes through the same
12
+ * path.
3
13
  *
4
14
  * The broker orchestrates and nothing more. It resolves what the stores know
5
15
  * about a destination, hands it to the provider, asks the provider for a token
@@ -8,7 +18,8 @@
8
18
  * pasted code) are the provider's decisions — made by its strategy — and the
9
19
  * broker does not repeat or override any of them.
10
20
  */
11
- import type { IRefreshableTokenProvider, ITokenRefresher } from '@mcp-abap-adt/interfaces-auth';
21
+ import type { IDeviceCodePresenter, OidcCallbackResult } from '@mcp-abap-adt/auth-providers';
22
+ import type { IAssertionReplayStore, IAuthorizationStrategy, IAuthProvider, IRefreshableTokenProvider, ITokenRefresher } from '@mcp-abap-adt/interfaces-auth';
12
23
  import type { ILogger } from '@mcp-abap-adt/interfaces-utils';
13
24
  import type { IAuthorizationConfig, IConnectionConfig, IServiceKeyStore, ISessionStore } from './stores/interfaces';
14
25
  /**
@@ -24,21 +35,42 @@ import type { IAuthorizationConfig, IConnectionConfig, IServiceKeyStore, ISessio
24
35
  * Called once per destination; the broker keeps the provider it returns.
25
36
  */
26
37
  export type TokenProviderFactory = (destination: string, authConfig: IAuthorizationConfig | null, connConfig: IConnectionConfig) => IRefreshableTokenProvider;
38
+ /** The grants whose provider takes an `IAuthorizationStrategy<string>`. */
39
+ export type StrategyGrant = 'authorization_code' | 'passcode' | 'saml2_pure' | 'saml2_bearer';
27
40
  /**
28
41
  * Configuration object for the AuthBroker constructor
29
42
  */
30
43
  export interface AuthBrokerConfig {
31
- /** Session store (required) — where tokens and the refresh token are kept */
44
+ /**
45
+ * Session store (required) — the session secret: the token or cookies,
46
+ * `expiresAt`, the refresh token.
47
+ */
32
48
  sessionStore: ISessionStore;
33
- /** Service key store (optional) — UAA credentials and the service URL */
49
+ /**
50
+ * Service key store — the means: `authType`, `grantType`, the client,
51
+ * basic's user and password, the SNC fields, `serviceUrl`. `getProvider`
52
+ * needs it: there is no other source of means.
53
+ */
34
54
  serviceKeyStore?: IServiceKeyStore;
35
55
  /**
36
- * The token provider, or a factory building one per destination.
56
+ * The token API's source: the token provider, or a factory building one per
57
+ * destination. Not used by `getProvider`, which builds what the destination
58
+ * states.
37
59
  *
38
60
  * An instance is used as given, for every destination. A factory is seeded
39
61
  * with what the stores hold for the destination (see `TokenProviderFactory`).
40
62
  */
41
- provider: IRefreshableTokenProvider | TokenProviderFactory;
63
+ provider?: IRefreshableTokenProvider | TokenProviderFactory;
64
+ /** The interactive strategy of the UAA code, passcode and SAML grants. */
65
+ authorization?: (destination: string, grant: StrategyGrant) => IAuthorizationStrategy<string>;
66
+ /** The interactive strategy of the OIDC authorization code grant. */
67
+ oidcAuthorization?: (destination: string) => IAuthorizationStrategy<OidcCallbackResult>;
68
+ /** Where the device flow shows the user its code. */
69
+ deviceCodePresenter?: (destination: string) => IDeviceCodePresenter;
70
+ /** `saml2_pure`: turns the SAMLResponse into the system's session cookies. */
71
+ samlCookies?: (destination: string) => (samlResponse: string) => Promise<string>;
72
+ /** The replay store the SAML assertion validators share. */
73
+ assertionReplayStore?: (destination: string) => IAssertionReplayStore;
42
74
  }
43
75
  /**
44
76
  * AuthBroker manages authentication tokens for destinations
@@ -48,7 +80,29 @@ export declare class AuthBroker {
48
80
  private readonly serviceKeyStore;
49
81
  private readonly sessionStore;
50
82
  private readonly provider;
51
- private readonly providers;
83
+ /** A consumer factory's providers: the promise of the build, as `built`. */
84
+ private readonly consumerBuilt;
85
+ /**
86
+ * One cache per destination, shared by `getProvider` and — when the
87
+ * consumer gives no provider — the token API: the promise of the
88
+ * build, set before its first read.
89
+ */
90
+ private readonly built;
91
+ /**
92
+ * The write that failed for a result, keyed on the result the provider
93
+ * handed over and returns, then on the destination it was written
94
+ * for: the token API throws it to its caller, as 3.x did, while the broker
95
+ * keeps retrying. Dropped once a write of that result for that destination
96
+ * lands.
97
+ */
98
+ private readonly failedWrites;
99
+ private readonly authorization;
100
+ private readonly oidcAuthorization;
101
+ private readonly deviceCodePresenter;
102
+ private readonly samlCookies;
103
+ private readonly assertionReplayStore;
104
+ /** getProvider's writes of the session secret, retried on their own. */
105
+ private readonly writer;
52
106
  /**
53
107
  * @param config Stores and the provider (instance or factory)
54
108
  * @param logger Optional logger. Nothing the broker logs contains a token.
@@ -58,36 +112,68 @@ export declare class AuthBroker {
58
112
  * A token for the destination: the provider's current one, which it refreshes
59
113
  * or obtains by login when it judges the cached one unusable.
60
114
  *
61
- * The result is written to the session store. Errors from the provider
62
- * (its typed errors included) propagate unchanged.
115
+ * Without a consumer `provider`, the provider is the one `getProvider` hands
116
+ * out for the destination — the same instance, so one token and one renewal
117
+ * serve both — and what it obtains is written by its `onTokens`. With one,
118
+ * the consumer's provider is asked and its answer written, as in 3.x — the
119
+ * secret alone.
120
+ *
121
+ * Errors from the provider (its typed errors included) propagate unchanged;
122
+ * so does a store failure, a failed write of the token included — the token
123
+ * stands and the broker keeps retrying the write.
124
+ *
125
+ * @throws DestinationConfigError for a destination the key store states as
126
+ * `basic` or `snc`, before any provider is asked; without a consumer
127
+ * `provider`, also for one whose provider obtains no token.
63
128
  */
64
129
  getToken(destination: string): Promise<string>;
65
130
  /**
66
131
  * A new token for the destination, never the cached one — for a caller whose
67
- * token the server has just refused. Calls the provider's `refreshTokens()`,
68
- * writes the result to the session store and returns it.
132
+ * token the server has just refused. Calls the provider's `refreshTokens()`;
133
+ * a renewal already in flight for the destination is joined, not repeated.
69
134
  */
70
135
  refreshToken(destination: string): Promise<string>;
71
136
  private obtain;
72
- private providerFor;
73
137
  /**
74
- * The credentials the provider is built with: the session's own when it holds
75
- * them, else the service key's, carrying the refresh token the session
76
- * stored. The session keeps a refresh token without credentials when the
77
- * credentials came from the service key, since the broker does not copy the
78
- * client secret into it; `loadSession` is where such a token is read.
138
+ * The destination's means, read first: a destination the key store states
139
+ * as `basic` or `snc` holds no token, so the token API refuses it before any
140
+ * provider is asked — it would write a token over a credential that is not
141
+ * one. A key store that states no `authType`, or no key store, is
142
+ * a 3.x setup, served as before.
143
+ */
144
+ private statedForTokens;
145
+ /** The token API on `getProvider`'s provider. */
146
+ private obtainShared;
147
+ /**
148
+ * The token API on the consumer's provider, as 3.x: the session read first,
149
+ * then the key store, for `serviceUrl` and the client; every answer — a
150
+ * cache hit included — written, the secret alone, through the broker's one
151
+ * write path.
152
+ */
153
+ private obtainFromConsumer;
154
+ /** The failure recorded for this result's write here, thrown as the store raised it. */
155
+ private throwFailedWrite;
156
+ /**
157
+ * The consumer's provider for the destination, cached per destination as a
158
+ * promise set before its first read and dropped when it throws, so
159
+ * the next call builds again: a factory's build — handed the client resolved
160
+ * then — or an instance as given, for every destination, handed no client.
161
+ * Either way the binding is fixed here, from the `serviceUrl`, SAP client and
162
+ * client of this first call, and kept with the provider.
163
+ */
164
+ private consumerProviderFor;
165
+ /**
166
+ * The credentials a consumer's factory is built with: the session's own when
167
+ * it holds them, else the service key's, carrying the refresh token the
168
+ * session stored — the 3.x order. A session store of auth-stores 3
169
+ * answers no client, so the key store's is what is found.
79
170
  */
80
171
  private resolveAuthorizationConfig;
81
- private resolveServiceUrl;
82
172
  /**
83
- * Writes the result by its type: a SAML result is session cookies, anything
84
- * else a bearer token. The refresh token is written only when the result has
85
- * one, so a provider that returns none does not erase the stored one.
86
- *
87
- * `ITokenResult.expiresAt` has no field in `IConnectionConfig` to go to; the
88
- * provider seeded with the stored token reads the expiry from the JWT itself.
173
+ * `serviceUrl` for a consumer's provider, in the 3.x order: the session's,
174
+ * else the key store's, else an error before the provider is asked.
89
175
  */
90
- private persist;
176
+ private resolveServiceUrl;
91
177
  /**
92
178
  * A store read where absence is an answer and anything else is not.
93
179
  *
@@ -101,15 +187,78 @@ export declare class AuthBroker {
101
187
  */
102
188
  private read;
103
189
  /**
104
- * Authorization configuration for the destination: the session's, else the
105
- * service key's, else null.
190
+ * The destination's client: the service key store's `uaaUrl`, `uaaClientId`
191
+ * and `uaaClientSecret`, with the refresh token the session stores laid over
192
+ * them; `null` when the key store has no client. A client a session store
193
+ * answers is not read, nor a refresh token a key store answers.
106
194
  */
107
195
  getAuthorizationConfig(destination: string): Promise<IAuthorizationConfig | null>;
108
196
  /**
109
- * Connection configuration for the destination: the session's, else the
110
- * service key's (which has URLs but no token), else null.
197
+ * The destination's connection config: the service key store's means with
198
+ * the session's secret (`authorizationToken`, `sessionCookies`,
199
+ * `expiresAt`) and its binding (`issuedFor`, `issuedBy`) laid over them; `null` when neither store holds anything.
200
+ * Means a session store answers are not read, nor a secret a key store
201
+ * answers.
111
202
  */
112
203
  getConnectionConfig(destination: string): Promise<IConnectionConfig | null>;
204
+ /**
205
+ * The credential for the destination, ready for a connector: the provider
206
+ * its configuration states (`authType`, and `grantType` for `jwt` / `saml`),
207
+ * built from the means the service key store holds and the secret the
208
+ * session store holds.
209
+ *
210
+ * One provider per destination for the broker's life: concurrent first calls
211
+ * share one build, and a build that threw is tried again on the next call.
212
+ *
213
+ * A token provider (the UAA, OIDC and SAML grants) is seeded from the
214
+ * session when the stored secret is bound to this destination, and writes
215
+ * every token it obtains — at `prepare()`, on expiry, or in `rejected()` after
216
+ * a 401 — back to the session store before it answers (see `flush()`).
217
+ *
218
+ * @throws DestinationConfigError when the destination lacks what its type
219
+ * needs — naming the fields or options, never a value.
220
+ */
221
+ getProvider(destination: string): Promise<IAuthProvider>;
222
+ private build;
223
+ /**
224
+ * The stored secret when it is bound to this destination's resource and
225
+ * issuer, else `null`: the provider is then built as with no session
226
+ * and logs in afresh — the refresh token is not spent either. The log line
227
+ * names the destination only: never a URI, never a token.
228
+ */
229
+ private boundOrDiscarded;
230
+ /**
231
+ * Waits for the session writes still pending — each gets one more attempt —
232
+ * and rejects naming the destinations whose store still refuses. Call it on
233
+ * shutdown to know whether every token a provider obtained is stored; the
234
+ * broker keeps retrying after a rejection.
235
+ */
236
+ flush(): Promise<void>;
237
+ /**
238
+ * One write of the destination's session secret — and nothing else:
239
+ * `{ authorizationToken, expiresAt, refreshToken, issuedFor, issuedBy }` in
240
+ * one `saveSession` — or, for a `saml2_pure` result (`tokenType: 'saml'`),
241
+ * `{ sessionCookies, expiresAt, issuedFor, issuedBy }`: cookies are written
242
+ * as cookies, every other result as a token (`saml2_bearer` included). No means is ever written: not `serviceUrl`, not
243
+ * `authType`, not the client — they live in the key store, which the broker
244
+ * never writes.
245
+ *
246
+ * - `expiresAt`: fixed by `onTokens` when the result arrived — the result's
247
+ * own, else the `expiresIn` it reports counted from then (the rule the
248
+ * provider applies to its own cache).
249
+ * - `refreshToken`: the result's, else the one the session holds, read at
250
+ * write time, so a result without one does not erase the stored one — for
251
+ * a provider the broker built, only a stored one bound where this one is:
252
+ * a refresh token obtained for another resource or from another client is
253
+ * not carried into this secret. A consumer's provider was seeded
254
+ * with whatever the session held, so whatever it holds is carried.
255
+ * - `issuedFor` / `issuedBy`: the binding computed when the provider was
256
+ * built, each left out when the means lack its source — so the
257
+ * store clears it.
258
+ * - A destination the key store now states as `basic` or `snc` is not
259
+ * written: those obtain no session secret.
260
+ */
261
+ private writeSecret;
113
262
  /**
114
263
  * An `ITokenRefresher` for one destination, for injection into a connection:
115
264
  * `getToken()` is the broker's `getToken`, `refreshToken()` its forced
@@ -1 +1 @@
1
- {"version":3,"file":"AuthBroker.d.ts","sourceRoot":"","sources":["../src/AuthBroker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACV,yBAAyB,EACzB,eAAe,EAEhB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,KAAK,EACV,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACd,MAAM,qBAAqB,CAAC;AAS7B;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,oBAAoB,GAAG,CACjC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,oBAAoB,GAAG,IAAI,EACvC,UAAU,EAAE,iBAAiB,KAC1B,yBAAyB,CAAC;AAE/B;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,6EAA6E;IAC7E,YAAY,EAAE,aAAa,CAAC;IAC5B,yEAAyE;IACzE,eAAe,CAAC,EAAE,gBAAgB,CAAC;IACnC;;;;;OAKG;IACH,QAAQ,EAAE,yBAAyB,GAAG,oBAAoB,CAAC;CAC5D;AAUD;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;IACjC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA+B;IAC/D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgB;IAC7C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmD;IAC5E,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgD;IAE1E;;;OAGG;gBACS,MAAM,EAAE,gBAAgB,EAAE,MAAM,CAAC,EAAE,OAAO;IA2DtD;;;;;;OAMG;IACG,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIpD;;;;OAIG;IACG,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAI1C,MAAM;YA2BN,WAAW;IA4BzB;;;;;;OAMG;YACW,0BAA0B;YAiC1B,iBAAiB;IAuB/B;;;;;;;OAOG;YACW,OAAO;IAoDrB;;;;;;;;;;OAUG;YACW,IAAI;IAgBlB;;;OAGG;IACG,sBAAsB,CAC1B,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAkBvC;;;OAGG;IACG,mBAAmB,CACvB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAkBpC;;;;OAIG;IACH,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,eAAe;CAM3D"}
1
+ {"version":3,"file":"AuthBroker.d.ts","sourceRoot":"","sources":["../src/AuthBroker.ts"],"names":[],"mappings":"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"}