@mcp-abap-adt/auth-broker 0.1.12 → 0.2.2

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 CHANGED
@@ -11,6 +11,146 @@ Thank you to all contributors! See [CONTRIBUTORS.md](CONTRIBUTORS.md) for the co
11
11
 
12
12
  ## [Unreleased]
13
13
 
14
+ ## [0.2.2] - 2025-12-13
15
+
16
+ ### Changed
17
+ - Dependency bump: `@mcp-abap-adt/interfaces` to `^0.1.16` to align with latest interfaces release
18
+
19
+ ## [0.2.1] - 2025-12-12
20
+
21
+ ### Fixed
22
+ - **ServiceUrl fallback from serviceKeyStore**: Fixed `getToken()` method to retrieve `serviceUrl` from `serviceKeyStore` when it's missing in session
23
+ - Previously, `getToken()` would throw an error immediately if `serviceUrl` was not found in session, even when it was available in `serviceKeyStore`
24
+ - Now, the method first checks session for `serviceUrl`, and if not found, attempts to retrieve it from `serviceKeyStore` before throwing an error
25
+ - This allows integration tests and real-world scenarios to work correctly when session is empty but service key contains `serviceUrl`
26
+ - Error messages now indicate that `serviceUrl` can come from either session or `serviceKeyStore`
27
+
28
+ ## [0.2.0] - 2025-12-08
29
+
30
+ ### Breaking Changes
31
+
32
+ **⚠️ IMPORTANT: This is a breaking change with NO backward compatibility. Migration is required. See Migration Guide below.**
33
+
34
+ #### Constructor Signature Changed
35
+ - **Constructor now accepts configuration object**: The constructor signature has changed from requiring all three dependencies to making `serviceKeyStore` and `tokenProvider` optional
36
+ - **No backward compatibility**: Old constructor signature is NOT supported. You must update your code to use the new signature. Migration guide provided below.
37
+ - **Before (v0.1.x)**:
38
+ ```typescript
39
+ new AuthBroker({
40
+ serviceKeyStore: serviceKeyStore, // required
41
+ sessionStore: sessionStore, // required
42
+ tokenProvider: tokenProvider, // required
43
+ }, browser?, logger?)
44
+ ```
45
+ - **After (v0.2.0)**:
46
+ ```typescript
47
+ new AuthBroker({
48
+ sessionStore: sessionStore, // required
49
+ serviceKeyStore?: serviceKeyStore, // optional
50
+ tokenProvider?: tokenProvider, // optional
51
+ }, browser?, logger?)
52
+ ```
53
+
54
+ #### New Authentication Flow
55
+ - **Three-step authentication flow**: `getToken()` now implements a new three-step flow (Step 0, Step 1, Step 2) instead of the previous six-step fallback chain
56
+ - **Direct UAA HTTP requests**: When UAA credentials are available in session, broker uses direct HTTP requests to UAA without requiring `tokenProvider`
57
+ - **Session initialization requirements**: SessionStore must contain initial session with `serviceUrl` before calling `getToken()`
58
+
59
+ ### Added
60
+
61
+ #### Direct UAA HTTP Requests
62
+ - **Direct UAA refresh_token grant**: When UAA credentials are available in session, broker can refresh tokens directly via HTTP without `tokenProvider`
63
+ - **Direct UAA client_credentials grant**: When UAA credentials are available, broker can obtain tokens directly via HTTP without `tokenProvider`
64
+ - **Automatic fallback to provider**: If direct UAA requests fail and `tokenProvider` is available, broker automatically falls back to provider
65
+
66
+ #### Flexible Configuration
67
+ - **Optional serviceKeyStore**: `serviceKeyStore` is now optional - only needed for initializing sessions from service keys
68
+ - **Optional tokenProvider**: `tokenProvider` is now optional - only needed for browser authentication or when direct UAA requests fail
69
+ - **Session-only mode**: Can work with only `sessionStore` if session contains valid UAA credentials (no `serviceKeyStore` or `tokenProvider` needed)
70
+
71
+ #### Enhanced Error Messages
72
+ - **Step-based error messages**: Error messages now indicate which step failed (Step 0, Step 1, or Step 2)
73
+ - **Context-aware errors**: Error messages include information about what was tried and what's available
74
+ - **Actionable errors**: Error messages suggest what to do next (e.g., "Provide serviceKeyStore to initialize from service key")
75
+
76
+ ### Changed
77
+
78
+ #### Authentication Flow (getToken)
79
+ - **Step 0: Session Initialization**:
80
+ - Checks if session has `authorizationToken` and UAA credentials
81
+ - If both empty and `serviceKeyStore` available: tries direct UAA request from service key, falls back to provider if failed
82
+ - If session has token OR UAA credentials → proceeds to Step 1
83
+ - **Step 1: Refresh Token Flow**:
84
+ - If refresh token exists: tries direct UAA refresh, falls back to provider if failed
85
+ - If successful → returns new token
86
+ - Otherwise → proceeds to Step 2
87
+ - **Step 2: UAA Credentials Flow**:
88
+ - Tries direct UAA client_credentials request, falls back to provider if failed
89
+ - If successful → returns new token
90
+ - If all failed → throws error
91
+
92
+ #### Token Refresh (refreshToken)
93
+ - **Direct UAA support**: Uses direct UAA HTTP requests when UAA credentials are available
94
+ - **Provider fallback**: Falls back to provider if direct UAA fails and provider is available
95
+
96
+ #### Dependencies
97
+ - **Added axios**: Added `axios@^1.13.2` as dependency for direct UAA HTTP requests
98
+ - **Updated interfaces**: Works with `@mcp-abap-adt/interfaces@^0.1.4+`
99
+
100
+ ### Migration Guide
101
+
102
+ #### Updating Constructor Calls
103
+
104
+ **Before (v0.1.x)**:
105
+ ```typescript
106
+ const broker = new AuthBroker({
107
+ serviceKeyStore: new AbapServiceKeyStore(['/path/to/destinations']),
108
+ sessionStore: new AbapSessionStore(['/path/to/destinations']),
109
+ tokenProvider: new BtpTokenProvider(),
110
+ }, 'chrome', logger);
111
+ ```
112
+
113
+ **After (v0.2.0) - All dependencies**:
114
+ ```typescript
115
+ const broker = new AuthBroker({
116
+ sessionStore: new AbapSessionStore(['/path/to/destinations']),
117
+ serviceKeyStore: new AbapServiceKeyStore(['/path/to/destinations']), // optional
118
+ tokenProvider: new BtpTokenProvider(), // optional
119
+ }, 'chrome', logger);
120
+ ```
121
+
122
+ **After (v0.2.0) - Session only (if session has UAA credentials)**:
123
+ ```typescript
124
+ const broker = new AuthBroker({
125
+ sessionStore: new AbapSessionStore(['/path/to/destinations']),
126
+ // serviceKeyStore and tokenProvider not needed if session has UAA credentials
127
+ });
128
+ ```
129
+
130
+ **After (v0.2.0) - Session + Service Key (for initialization)**:
131
+ ```typescript
132
+ const broker = new AuthBroker({
133
+ sessionStore: new AbapSessionStore(['/path/to/destinations']),
134
+ serviceKeyStore: new AbapServiceKeyStore(['/path/to/destinations']),
135
+ // tokenProvider optional - direct UAA requests will be used
136
+ });
137
+ ```
138
+
139
+ #### Session Requirements
140
+
141
+ **Important**: SessionStore must contain initial session with `serviceUrl` before calling `getToken()`. If session is empty, provide `serviceKeyStore` to initialize from service key.
142
+
143
+ #### When to Provide tokenProvider
144
+
145
+ - **Required**: When initializing session from service key via browser authentication (Step 0)
146
+ - **Optional but recommended**: As fallback when direct UAA requests fail
147
+ - **Not needed**: When session contains valid UAA credentials (direct UAA requests will be used)
148
+
149
+ ### Dependencies
150
+ - Updated to work with `@mcp-abap-adt/connection` v0.2.0+ (which removed token refresh and session storage)
151
+ - Updated to work with `@mcp-abap-adt/interfaces` v0.1.4+ (which removed session state methods from `IAbapConnection`)
152
+ - Added `axios@^1.13.2` for direct UAA HTTP requests
153
+
14
154
  ## [0.1.12] - 2025-12-09
15
155
 
16
156
  ### Added
@@ -483,4 +623,3 @@ Thank you to all contributors! See [CONTRIBUTORS.md](CONTRIBUTORS.md) for the co
483
623
  - **Module system**: CommonJS
484
624
  - **Build output**: TypeScript compiled to JavaScript with type definitions
485
625
  - **Logging**: Injectable logger interface with environment variable control
486
-
package/README.md CHANGED
@@ -19,43 +19,84 @@ npm install @mcp-abap-adt/auth-broker
19
19
 
20
20
  ## Usage
21
21
 
22
+ ### Basic Usage (Session Only)
23
+
24
+ If your sessionStore contains valid UAA credentials, you only need to provide `sessionStore`:
25
+
26
+ ```typescript
27
+ import { AuthBroker, AbapSessionStore } from '@mcp-abap-adt/auth-broker';
28
+
29
+ // Session-only mode - works if session has UAA credentials
30
+ const broker = new AuthBroker({
31
+ sessionStore: new AbapSessionStore('/path/to/destinations'),
32
+ });
33
+
34
+ // Get token - uses direct UAA HTTP requests automatically
35
+ const token = await broker.getToken('TRIAL');
36
+ ```
37
+
38
+ ### Full Configuration (All Dependencies)
39
+
40
+ For maximum flexibility, provide all three dependencies:
41
+
22
42
  ```typescript
23
43
  import {
24
44
  AuthBroker,
25
45
  AbapServiceKeyStore,
26
46
  AbapSessionStore,
27
- SafeAbapSessionStore,
28
47
  BtpTokenProvider
29
48
  } from '@mcp-abap-adt/auth-broker';
30
49
 
31
- // Use default file-based stores (current working directory)
32
- const broker = new AuthBroker();
50
+ const broker = new AuthBroker({
51
+ sessionStore: new AbapSessionStore('/path/to/destinations'),
52
+ serviceKeyStore: new AbapServiceKeyStore('/path/to/destinations'), // optional
53
+ tokenProvider: new BtpTokenProvider(), // optional
54
+ }, 'chrome', logger);
55
+ ```
56
+
57
+ ### Session + Service Key (For Initialization)
58
+
59
+ If you need to initialize sessions from service keys:
33
60
 
34
- // Use custom file-based stores with specific paths
61
+ ```typescript
35
62
  const broker = new AuthBroker({
36
- serviceKeyStore: new AbapServiceKeyStore(['/path/to/destinations']),
37
- sessionStore: new AbapSessionStore(['/path/to/destinations']),
38
- tokenProvider: new BtpTokenProvider(),
39
- }, 'chrome');
63
+ sessionStore: new AbapSessionStore('/path/to/destinations'),
64
+ serviceKeyStore: new AbapServiceKeyStore('/path/to/destinations'),
65
+ // tokenProvider optional - direct UAA requests will be used from service key
66
+ });
67
+ ```
68
+
69
+ ### In-Memory Session Store
70
+
71
+ For testing or temporary sessions:
72
+
73
+ ```typescript
74
+ import { AuthBroker, SafeAbapSessionStore } from '@mcp-abap-adt/auth-broker';
40
75
 
41
- // Use safe in-memory session store (data lost after restart)
42
76
  const broker = new AuthBroker({
43
- serviceKeyStore: new AbapServiceKeyStore(['/path/to/destinations']),
44
- sessionStore: new SafeAbapSessionStore(), // In-memory, secure
45
- tokenProvider: new BtpTokenProvider(),
77
+ sessionStore: new SafeAbapSessionStore(), // In-memory, data lost after restart
46
78
  });
79
+ ```
47
80
 
48
- // Use BtpTokenProvider with custom browser auth port (to avoid port conflicts)
49
- const brokerWithCustomPort = new AuthBroker({
50
- serviceKeyStore: new AbapServiceKeyStore(['/path/to/destinations']),
51
- sessionStore: new AbapSessionStore(['/path/to/destinations']),
81
+ ### Custom Browser Auth Port
82
+
83
+ To avoid port conflicts with browser authentication:
84
+
85
+ ```typescript
86
+ const broker = new AuthBroker({
87
+ sessionStore: new AbapSessionStore('/path/to/destinations'),
88
+ serviceKeyStore: new AbapServiceKeyStore('/path/to/destinations'),
52
89
  tokenProvider: new BtpTokenProvider(4001), // Custom port for OAuth callback server
53
- });
90
+ }, 'chrome');
91
+ ```
54
92
 
55
- // Get token for destination (loads from .env, validates, refreshes if needed)
93
+ ### Getting Tokens
94
+
95
+ ```typescript
96
+ // Get token - automatically uses direct UAA requests if UAA credentials available
56
97
  const token = await broker.getToken('TRIAL');
57
98
 
58
- // Force refresh token using service key
99
+ // Force refresh token
59
100
  const newToken = await broker.refreshToken('TRIAL');
60
101
  ```
61
102
 
@@ -302,45 +343,83 @@ Instead, the consumer or `AbapSessionStore` itself should handle this:
302
343
 
303
344
  ```typescript
304
345
  new AuthBroker(
305
- stores?: {
306
- serviceKeyStore?: IServiceKeyStore;
307
- sessionStore?: ISessionStore;
308
- tokenProvider?: ITokenProvider;
346
+ config: {
347
+ sessionStore: ISessionStore; // required
348
+ serviceKeyStore?: IServiceKeyStore; // optional
349
+ tokenProvider?: ITokenProvider; // optional
309
350
  },
310
351
  browser?: string,
311
352
  logger?: ILogger
312
353
  )
313
354
  ```
314
355
 
315
- - `stores` - Optional object with custom storage implementations:
316
- - `serviceKeyStore` - Store for service keys (default: `AbapServiceKeyStore()`)
317
- - `sessionStore` - Store for session data (default: `AbapSessionStore()`)
318
- - `tokenProvider` - Token provider for token acquisition (default: `BtpTokenProvider()`)
319
- - Available implementations:
320
- - **ABAP**: `AbapServiceKeyStore(searchPaths?)`, `AbapSessionStore(searchPaths?)`, `SafeAbapSessionStore()`, `BtpTokenProvider()`
321
- - **XSUAA** (reduced scope): `XsuaaServiceKeyStore(searchPaths?)`, `XsuaaSessionStore(searchPaths?)`, `SafeXsuaaSessionStore()`, `XsuaaTokenProvider()`
322
- - **BTP** (full scope for ABAP): `AbapServiceKeyStore(searchPaths?)`, `BtpSessionStore(searchPaths?)`, `SafeBtpSessionStore()`, `BtpTokenProvider()`
356
+ **Parameters:**
357
+ - `config` - Configuration object:
358
+ - `sessionStore` - **Required** - Store for session data. Must contain initial session with `serviceUrl`
359
+ - `serviceKeyStore` - **Optional** - Store for service keys. Only needed for initializing sessions from service keys
360
+ - `tokenProvider` - **Optional** - Token provider for token acquisition. Only needed for browser authentication or when direct UAA requests fail
323
361
  - `browser` - Optional browser name for authentication (`chrome`, `edge`, `firefox`, `system`, `none`). Default: `system`
324
362
  - For XSUAA, browser is not used (client_credentials grant type) - use `'none'`
325
- - `logger` - Optional logger instance. If not provided, uses default logger
363
+ - `logger` - Optional logger instance. If not provided, uses no-op logger
326
364
 
327
- #### Methods
365
+ **When to Provide Each Dependency:**
328
366
 
329
- ##### `getToken(destination: string): Promise<string>`
367
+ - **`sessionStore` (required)**: Always required. Must contain initial session with `serviceUrl`
368
+ - **`serviceKeyStore` (optional)**:
369
+ - Required if you need to initialize sessions from service keys (Step 0)
370
+ - Not needed if session already contains UAA credentials
371
+ - **`tokenProvider` (optional)**:
372
+ - Required for browser authentication when initializing from service key (Step 0)
373
+ - Optional but recommended as fallback when direct UAA requests fail
374
+ - Not needed if session contains valid UAA credentials (direct UAA HTTP requests will be used)
330
375
 
331
- Gets authentication token for destination. Tries to load from session store, validates it, and refreshes if needed using a fallback chain:
376
+ **Available Implementations:**
377
+ - **ABAP**: `AbapServiceKeyStore(directory, defaultServiceUrl?, logger?)`, `AbapSessionStore(directory, defaultServiceUrl?, logger?)`, `SafeAbapSessionStore(defaultServiceUrl?, logger?)`, `BtpTokenProvider(browserAuthPort?)`
378
+ - **XSUAA** (reduced scope): `XsuaaServiceKeyStore(directory, logger?)`, `XsuaaSessionStore(directory, defaultServiceUrl, logger?)`, `SafeXsuaaSessionStore(defaultServiceUrl, logger?)`, `XsuaaTokenProvider()`
379
+ - **BTP** (full scope for ABAP): `AbapServiceKeyStore(directory, defaultServiceUrl?, logger?)`, `BtpSessionStore(directory, defaultServiceUrl, logger?)`, `SafeBtpSessionStore(defaultServiceUrl, logger?)`, `BtpTokenProvider(browserAuthPort?)`
332
380
 
333
- 1. **Check session**: Load token from session store and validate it
334
- 2. **Try refresh token**: If refresh token is available, attempt to refresh using it (via tokenProvider)
335
- 3. **Try UAA (client_credentials)**: Attempt to get token using UAA credentials (via tokenProvider)
336
- 4. **Try browser authentication**: Attempt browser-based OAuth2 flow using service key (via tokenProvider)
337
- 5. **Throw error**: If all authentication methods failed
381
+ #### Methods
338
382
 
339
- **Note**: Token validation is performed only when checking existing session. Tokens obtained through refresh/UAA/browser authentication are not validated before being saved.
383
+ ##### `getToken(destination: string): Promise<string>`
384
+
385
+ Gets authentication token for destination. Implements a three-step flow:
386
+
387
+ **Step 0: Initialize Session with Token (if needed)**
388
+ - Checks if session has `authorizationToken` and UAA credentials
389
+ - If both are empty and `serviceKeyStore` is available:
390
+ - Tries direct UAA request from service key (if UAA credentials available)
391
+ - If failed and `tokenProvider` available → uses provider for authentication
392
+ - If session has token OR UAA credentials → proceeds to Step 1
393
+
394
+ **Step 1: Refresh Token Flow**
395
+ - Checks if refresh token exists in session
396
+ - If refresh token exists:
397
+ - Tries direct UAA refresh (if UAA credentials in session)
398
+ - If failed and `tokenProvider` available → uses provider
399
+ - If successful → returns new token
400
+ - Otherwise → proceeds to Step 2
401
+
402
+ **Step 2: UAA Credentials Flow**
403
+ - Checks if UAA credentials exist in session or service key
404
+ - Tries direct UAA client_credentials request (if UAA credentials available)
405
+ - If failed and `tokenProvider` available → uses provider
406
+ - If successful → returns new token
407
+ - If all failed → throws error
408
+
409
+ **Important Notes:**
410
+ - If `sessionStore` contains valid UAA credentials, neither `serviceKeyStore` nor `tokenProvider` are required. Direct UAA HTTP requests will be used automatically.
411
+ - `tokenProvider` is only needed for browser authentication or when direct UAA requests fail.
412
+ - Token validation is performed only when checking existing session. Tokens obtained through refresh/UAA/browser authentication are not validated before being saved.
340
413
 
341
414
  ##### `refreshToken(destination: string): Promise<string>`
342
415
 
343
- Force refresh token for destination using service key from `{destination}.json` file.
416
+ Force refresh token for destination. Uses refresh token from session if available, otherwise uses UAA credentials from session or service key.
417
+
418
+ **Flow:**
419
+ - If refresh token exists and UAA credentials available → tries direct UAA refresh
420
+ - If direct UAA fails and `tokenProvider` available → uses provider
421
+ - If no refresh token but UAA credentials available → tries direct UAA client_credentials
422
+ - If all failed → throws error
344
423
 
345
424
  ##### `clearCache(destination: string): void`
346
425
 
@@ -374,24 +453,54 @@ import {
374
453
  XsuaaServiceKeyStore,
375
454
  XsuaaSessionStore,
376
455
  XsuaaTokenProvider,
377
- BtpTokenProvider
456
+ BtpTokenProvider,
457
+ AbapServiceKeyStore,
458
+ BtpSessionStore
378
459
  } from '@mcp-abap-adt/auth-broker';
379
460
 
380
- // XSUAA authentication (no browser needed)
461
+ // XSUAA authentication - session only (direct UAA requests)
381
462
  const xsuaaBroker = new AuthBroker({
382
- serviceKeyStore: new XsuaaServiceKeyStore(['/path/to/keys']),
383
- sessionStore: new XsuaaSessionStore(['/path/to/sessions']),
384
- tokenProvider: new XsuaaTokenProvider(),
463
+ sessionStore: new XsuaaSessionStore('/path/to/sessions', 'https://mcp.example.com'),
464
+ // serviceKeyStore and tokenProvider not needed if session has UAA credentials
465
+ });
466
+
467
+ // XSUAA authentication - with service key initialization
468
+ const xsuaaBrokerWithServiceKey = new AuthBroker({
469
+ sessionStore: new XsuaaSessionStore('/path/to/sessions', 'https://mcp.example.com'),
470
+ serviceKeyStore: new XsuaaServiceKeyStore('/path/to/keys'),
471
+ // tokenProvider optional - direct UAA requests will be used
385
472
  }, 'none');
386
473
 
387
- // BTP authentication (browser or refresh token)
474
+ // BTP authentication - session only (direct UAA requests)
388
475
  const btpBroker = new AuthBroker({
389
- serviceKeyStore: new AbapServiceKeyStore(['/path/to/keys']),
390
- sessionStore: new BtpSessionStore(['/path/to/sessions']),
391
- tokenProvider: new BtpTokenProvider(),
476
+ sessionStore: new BtpSessionStore('/path/to/sessions', 'https://abap.example.com'),
477
+ // serviceKeyStore and tokenProvider not needed if session has UAA credentials
478
+ });
479
+
480
+ // BTP authentication - with service key and provider (for browser auth)
481
+ const btpBrokerFull = new AuthBroker({
482
+ sessionStore: new BtpSessionStore('/path/to/sessions', 'https://abap.example.com'),
483
+ serviceKeyStore: new AbapServiceKeyStore('/path/to/keys'),
484
+ tokenProvider: new BtpTokenProvider(), // needed for browser authentication
392
485
  });
393
486
  ```
394
487
 
488
+ ### Direct UAA HTTP Requests
489
+
490
+ When UAA credentials are available in session, `AuthBroker` automatically uses direct HTTP requests to UAA without requiring `tokenProvider`:
491
+
492
+ - **Refresh Token Grant**: Direct HTTP POST to `{uaaUrl}/oauth/token` with `grant_type=refresh_token`
493
+ - **Client Credentials Grant**: Direct HTTP POST to `{uaaUrl}/oauth/token` with `grant_type=client_credentials`
494
+
495
+ **Benefits:**
496
+ - No dependency on `tokenProvider` when session has UAA credentials
497
+ - Faster token refresh (no provider overhead)
498
+ - Simpler configuration (only `sessionStore` needed)
499
+
500
+ **Fallback to Provider:**
501
+ - If direct UAA request fails and `tokenProvider` is available, broker automatically falls back to provider
502
+ - Provider is useful for browser authentication or alternative authentication flows
503
+
395
504
  ### Utility Script
396
505
 
397
506
  Generate `.env` files from service keys:
@@ -5,8 +5,16 @@ import { ILogger } from '@mcp-abap-adt/interfaces';
5
5
  import { IServiceKeyStore, ISessionStore, IAuthorizationConfig, IConnectionConfig } from './stores/interfaces';
6
6
  import { ITokenProvider } from './providers';
7
7
  /**
8
- * AuthBroker manages JWT authentication tokens for destinations
8
+ * Configuration object for AuthBroker constructor
9
9
  */
10
+ export interface AuthBrokerConfig {
11
+ /** Session store (required) - stores and retrieves session data */
12
+ sessionStore: ISessionStore;
13
+ /** Service key store (optional) - stores and retrieves service keys */
14
+ serviceKeyStore?: IServiceKeyStore;
15
+ /** Token provider (optional) - handles token refresh and authentication flows. If not provided, direct UAA HTTP requests will be used when UAA credentials are available */
16
+ tokenProvider?: ITokenProvider;
17
+ }
10
18
  export declare class AuthBroker {
11
19
  private browser;
12
20
  private logger;
@@ -15,57 +23,71 @@ export declare class AuthBroker {
15
23
  private tokenProvider;
16
24
  /**
17
25
  * Create a new AuthBroker instance
18
- * @param stores Object with stores and token provider
19
- * - serviceKeyStore: Store for service keys
20
- * - sessionStore: Store for session data
21
- * - tokenProvider: Token provider implementing ITokenProvider interface
26
+ * @param config Configuration object with stores and token provider
27
+ * - sessionStore: Store for session data (required)
28
+ * - serviceKeyStore: Store for service keys (optional)
29
+ * - tokenProvider: Token provider implementing ITokenProvider interface (optional). If not provided, direct UAA HTTP requests will be used when UAA credentials are available
22
30
  * @param browser Optional browser name for authentication (chrome, edge, firefox, system, none).
23
31
  * Default: 'system' (system default browser).
24
32
  * Use 'none' to print URL instead of opening browser.
25
33
  * @param logger Optional logger instance implementing ILogger interface. If not provided, uses no-op logger.
26
34
  */
27
- constructor(stores: {
28
- serviceKeyStore: IServiceKeyStore;
29
- sessionStore: ISessionStore;
30
- tokenProvider: ITokenProvider;
31
- }, browser?: string, logger?: ILogger);
35
+ constructor(config: AuthBrokerConfig, browser?: string, logger?: ILogger);
36
+ /**
37
+ * Refresh token using refresh_token grant type (direct UAA HTTP request)
38
+ * @param refreshToken Refresh token
39
+ * @param authConfig UAA authorization configuration
40
+ * @returns Promise that resolves to new tokens
41
+ */
42
+ private refreshTokenDirect;
43
+ /**
44
+ * Get token using client_credentials grant type (direct UAA HTTP request)
45
+ * @param authConfig UAA authorization configuration
46
+ * @returns Promise that resolves to access token
47
+ */
48
+ private getTokenWithClientCredentials;
32
49
  /**
33
50
  * Get authentication token for destination.
34
- * Tries to load from session store, validates it, and refreshes if needed using a fallback chain.
35
- *
36
- * **Fallback Chain:**
37
- * 1. **Check session**: Load token from session store and validate it
38
- * - If token is valid, return it immediately
39
- * - If token is invalid or missing, continue to next step
40
- *
41
- * 2. **Check service key**: Verify that service key exists
42
- * - If no service key found, throw error
43
- *
44
- * 3. **Try refresh token**: If refresh token is available in session, attempt to refresh using it (via tokenProvider)
45
- * - If successful, save new token to session and return it
46
- * - If failed, continue to next step
51
+ * Implements a three-step flow: Step 0 (initialize), Step 1 (refresh), Step 2 (UAA).
47
52
  *
48
- * 4. **Try UAA (client_credentials)**: Attempt to get token using UAA credentials (via tokenProvider)
49
- * - If UAA parameters are available and authentication succeeds, save token to session and return it
50
- * - If failed or parameters missing, continue to next step
53
+ * **Flow:**
54
+ * **Step 0: Initialize Session with Token (if needed)**
55
+ * - Check if session has `authorizationToken` AND UAA credentials
56
+ * - If both are empty AND serviceKeyStore is available:
57
+ * - Try direct UAA request from service key (if UAA credentials available)
58
+ * - If failed and tokenProvider available → use provider
59
+ * - If session has token OR UAA credentials → proceed to Step 1
51
60
  *
52
- * 5. **Try browser authentication**: Attempt browser-based OAuth2 flow using service key (via tokenProvider)
53
- * - If successful, save token and refresh token to session and return it
54
- * - If failed, continue to next step
61
+ * **Step 1: Refresh Token Flow**
62
+ * - Check if refresh token exists in session
63
+ * - If refresh token exists:
64
+ * - Try direct UAA refresh (if UAA credentials in session)
65
+ * - If failed and tokenProvider available → use provider
66
+ * - If successful → return new token
67
+ * - Otherwise → proceed to Step 2
55
68
  *
56
- * 6. **Throw error**: If all authentication methods failed, throw comprehensive error with details
69
+ * **Step 2: UAA Credentials Flow**
70
+ * - Check if UAA credentials exist in session or service key
71
+ * - Try direct UAA client_credentials request (if UAA credentials available)
72
+ * - If failed and tokenProvider available → use provider
73
+ * - If successful → return new token
74
+ * - If all failed → return error
57
75
  *
58
- * **Note**: Token validation is performed only when checking existing session (step 1).
59
- * Tokens obtained through refresh/UAA/browser authentication are not validated before being saved.
76
+ * **Important Notes:**
77
+ * - If sessionStore contains valid UAA credentials, neither serviceKeyStore nor tokenProvider are required.
78
+ * Direct UAA HTTP requests will be used automatically.
79
+ * - tokenProvider is only needed when:
80
+ * - Initializing session from service key via browser authentication (Step 0)
81
+ * - Direct UAA requests fail and fallback to provider is needed
60
82
  *
61
83
  * @param destination Destination name (e.g., "TRIAL")
62
84
  * @returns Promise that resolves to JWT token string
63
- * @throws Error if neither session data nor service key found, or if all authentication methods failed
85
+ * @throws Error if session initialization fails or all authentication methods failed
64
86
  */
65
87
  getToken(destination: string): Promise<string>;
66
88
  /**
67
- * Force refresh token for destination using service key.
68
- * If no refresh token exists, starts browser authentication flow.
89
+ * Force refresh token for destination.
90
+ * Uses refresh token from session if available, otherwise uses UAA credentials from session or service key.
69
91
  * @param destination Destination name (e.g., "TRIAL")
70
92
  * @returns Promise that resolves to new JWT token string
71
93
  */
@@ -1 +1 @@
1
- {"version":3,"file":"AuthBroker.d.ts","sourceRoot":"","sources":["../src/AuthBroker.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAW,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC/G,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAY7C;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,eAAe,CAAmB;IAC1C,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,aAAa,CAAiB;IAEtC;;;;;;;;;;OAUG;gBAED,MAAM,EAAE;QAAE,eAAe,EAAE,gBAAgB,CAAC;QAAC,YAAY,EAAE,aAAa,CAAC;QAAC,aAAa,EAAE,cAAc,CAAA;KAAE,EACzG,OAAO,CAAC,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,OAAO;IA8DlB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAgCG;IACG,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA6KpD;;;;;OAKG;IACG,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAuDxD;;;;OAIG;IACG,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAsBvF;;;;OAIG;IACG,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;CAoBlF"}
1
+ {"version":3,"file":"AuthBroker.d.ts","sourceRoot":"","sources":["../src/AuthBroker.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAW,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC/G,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAa7C;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,mEAAmE;IACnE,YAAY,EAAE,aAAa,CAAC;IAC5B,uEAAuE;IACvE,eAAe,CAAC,EAAE,gBAAgB,CAAC;IACnC,4KAA4K;IAC5K,aAAa,CAAC,EAAE,cAAc,CAAC;CAChC;AAcD,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,eAAe,CAA+B;IACtD,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,aAAa,CAA6B;IAElD;;;;;;;;;;OAUG;gBAED,MAAM,EAAE,gBAAgB,EACxB,OAAO,CAAC,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,OAAO;IAgElB;;;;;OAKG;YACW,kBAAkB;IA4ChC;;;;OAIG;YACW,6BAA6B;IA0C3C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAqCG;IACG,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA0SpD;;;;;OAKG;IACG,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAuFxD;;;;OAIG;IACG,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IA2BvF;;;;OAIG;IACG,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;CAyBlF"}