@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.
- package/CHANGELOG.md +448 -1
- package/README.md +723 -533
- package/dist/AuthBroker.d.ts +178 -29
- package/dist/AuthBroker.d.ts.map +1 -1
- package/dist/AuthBroker.js +494 -101
- package/dist/DestinationConfigError.d.ts +27 -0
- package/dist/DestinationConfigError.d.ts.map +1 -0
- package/dist/DestinationConfigError.js +36 -0
- package/dist/SessionWriter.d.ts +54 -0
- package/dist/SessionWriter.d.ts.map +1 -0
- package/dist/SessionWriter.js +135 -0
- package/dist/binding.d.ts +95 -0
- package/dist/binding.d.ts.map +1 -0
- package/dist/binding.js +207 -0
- package/dist/bindingOf.d.ts +36 -0
- package/dist/bindingOf.d.ts.map +1 -0
- package/dist/bindingOf.js +53 -0
- package/dist/destinations.d.ts +139 -0
- package/dist/destinations.d.ts.map +1 -0
- package/dist/destinations.js +429 -0
- package/dist/index.d.ts +7 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -7
- package/dist/providers/ITokenProvider.d.ts +2 -1
- package/dist/providers/ITokenProvider.d.ts.map +1 -1
- package/dist/providers/index.d.ts +2 -2
- package/dist/providers/index.js +2 -2
- package/dist/stores/index.d.ts +2 -2
- package/dist/stores/index.js +2 -2
- package/dist/stores/interfaces.d.ts +4 -3
- package/dist/stores/interfaces.d.ts.map +1 -1
- package/dist/stores/interfaces.js +2 -2
- package/dist/types.d.ts +5 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +3 -1
- package/package.json +25 -45
- package/CONTRIBUTORS.md +0 -33
- package/dist/__tests__/helpers/configHelpers.d.ts +0 -59
- package/dist/__tests__/helpers/configHelpers.d.ts.map +0 -1
- package/dist/__tests__/helpers/configHelpers.js +0 -206
- package/dist/__tests__/helpers/netHelpers.d.ts +0 -3
- package/dist/__tests__/helpers/netHelpers.d.ts.map +0 -1
- package/dist/__tests__/helpers/netHelpers.js +0 -63
- package/dist/__tests__/helpers/testLogger.d.ts +0 -7
- package/dist/__tests__/helpers/testLogger.d.ts.map +0 -1
- package/dist/__tests__/helpers/testLogger.js +0 -54
- package/dist/bin/mcp-auth.js +0 -752
- package/dist/bin/mcp-sso.js +0 -825
- package/dist/bin/mcpSsoConfig.js +0 -566
- package/dist/bin/samlMetadata.js +0 -175
- package/dist/bin/workDir.js +0 -79
package/dist/AuthBroker.d.ts
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* AuthBroker:
|
|
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 {
|
|
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
|
-
/**
|
|
44
|
+
/**
|
|
45
|
+
* Session store (required) — the session secret: the token or cookies,
|
|
46
|
+
* `expiresAt`, the refresh token.
|
|
47
|
+
*/
|
|
32
48
|
sessionStore: ISessionStore;
|
|
33
|
-
/**
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
*
|
|
62
|
-
*
|
|
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
|
-
*
|
|
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
|
|
75
|
-
*
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
*
|
|
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
|
-
*
|
|
84
|
-
* else
|
|
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
|
|
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
|
-
*
|
|
105
|
-
*
|
|
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
|
-
*
|
|
110
|
-
*
|
|
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
|
package/dist/AuthBroker.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthBroker.d.ts","sourceRoot":"","sources":["../src/AuthBroker.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"AuthBroker.d.ts","sourceRoot":"","sources":["../src/AuthBroker.ts"],"names":[],"mappings":"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"}
|