@mcp-abap-adt/auth-broker 0.3.6 → 1.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
CHANGED
|
@@ -11,6 +11,11 @@ Thank you to all contributors! See [CONTRIBUTORS.md](CONTRIBUTORS.md) for the co
|
|
|
11
11
|
|
|
12
12
|
## [Unreleased]
|
|
13
13
|
|
|
14
|
+
## [1.0.0] - 2026-02-10
|
|
15
|
+
|
|
16
|
+
### Added
|
|
17
|
+
- Persist SAML session cookies when token providers return `tokenType: 'saml'`.
|
|
18
|
+
|
|
14
19
|
## [0.3.6] - 2026-01-28
|
|
15
20
|
|
|
16
21
|
### Changed
|
package/dist/AuthBroker.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthBroker.d.ts","sourceRoot":"","sources":["../src/AuthBroker.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,eAAe,EAGrB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EACV,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACd,MAAM,qBAAqB,CAAC;AA6C7B;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,mEAAmE;IACnE,YAAY,EAAE,aAAa,CAAC;IAC5B,uEAAuE;IACvE,eAAe,CAAC,EAAE,gBAAgB,CAAC;IACnC,4IAA4I;IAC5I,aAAa,EAAE,cAAc,CAAC;IAC9B;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;GAEG;AACH,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,CAAiB;IACtC,OAAO,CAAC,gBAAgB,CAAU;IAElC;;;;;;;;;;;OAWG;gBACS,MAAM,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO;IAsFxE;;OAEG;YACW,eAAe;IA0D7B;;OAEG;YACW,aAAa;IAoD3B;;OAEG;YACW,oCAAoC;IA4ClD;;OAEG;YACW,kBAAkB;YAkClB,aAAa;YA0Db,kBAAkB;
|
|
1
|
+
{"version":3,"file":"AuthBroker.d.ts","sourceRoot":"","sources":["../src/AuthBroker.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,eAAe,EAGrB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EACV,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACd,MAAM,qBAAqB,CAAC;AA6C7B;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,mEAAmE;IACnE,YAAY,EAAE,aAAa,CAAC;IAC5B,uEAAuE;IACvE,eAAe,CAAC,EAAE,gBAAgB,CAAC;IACnC,4IAA4I;IAC5I,aAAa,EAAE,cAAc,CAAC;IAC9B;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;GAEG;AACH,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,CAAiB;IACtC,OAAO,CAAC,gBAAgB,CAAU;IAElC;;;;;;;;;;;OAWG;gBACS,MAAM,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO;IAsFxE;;OAEG;YACW,eAAe;IA0D7B;;OAEG;YACW,aAAa;IAoD3B;;OAEG;YACW,oCAAoC;IA4ClD;;OAEG;YACW,kBAAkB;YAkClB,aAAa;YA0Db,kBAAkB;IAkDhC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAuCG;IACG,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAsJpD;;;;;OAKG;IACG,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IASxD;;;;OAIG;IACG,sBAAsB,CAC1B,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAoEvC;;;;OAIG;IACG,mBAAmB,CACvB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAuEpC;;;;;;;;;;;;;;;;OAgBG;IACH,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,eAAe;CAqB3D"}
|
package/dist/AuthBroker.js
CHANGED
|
@@ -298,11 +298,13 @@ class AuthBroker {
|
|
|
298
298
|
if (!token) {
|
|
299
299
|
throw new Error(`Token provider did not return authorization token for destination "${destination}"`);
|
|
300
300
|
}
|
|
301
|
+
const isSaml = tokenResult.tokenType === 'saml';
|
|
301
302
|
const connectionConfigWithServiceUrl = {
|
|
302
303
|
...baseConnConfig,
|
|
303
304
|
serviceUrl,
|
|
304
|
-
authorizationToken: token,
|
|
305
|
-
|
|
305
|
+
authorizationToken: isSaml ? undefined : token,
|
|
306
|
+
sessionCookies: isSaml ? token : undefined,
|
|
307
|
+
authType: isSaml ? 'saml' : 'jwt',
|
|
306
308
|
};
|
|
307
309
|
const authorizationConfig = {
|
|
308
310
|
...authConfig,
|
|
@@ -368,14 +370,15 @@ class AuthBroker {
|
|
|
368
370
|
// Get serviceUrl (required)
|
|
369
371
|
const serviceUrl = await this.getServiceUrl(destination, connConfig);
|
|
370
372
|
// Check if we have token or UAA credentials
|
|
371
|
-
const
|
|
373
|
+
const sessionToken = connConfig?.authorizationToken || connConfig?.sessionCookies;
|
|
374
|
+
const hasToken = !!sessionToken;
|
|
372
375
|
const hasAuthConfig = !!authConfig;
|
|
373
376
|
this.logger?.info(`[AuthBroker] Session check for ${destination}`, {
|
|
374
377
|
hasToken,
|
|
375
378
|
hasAuthConfig,
|
|
376
379
|
hasServiceUrl: !!serviceUrl,
|
|
377
380
|
serviceUrl,
|
|
378
|
-
authorizationToken: (0, formatting_1.formatToken)(connConfig?.authorizationToken),
|
|
381
|
+
authorizationToken: (0, formatting_1.formatToken)(connConfig?.authorizationToken || connConfig?.sessionCookies),
|
|
379
382
|
hasRefreshToken: !!authConfig?.refreshToken,
|
|
380
383
|
refreshToken: (0, formatting_1.formatToken)(authConfig?.refreshToken),
|
|
381
384
|
});
|
|
@@ -528,8 +531,10 @@ class AuthBroker {
|
|
|
528
531
|
this.logger?.warn(`Failed to get connection config from session store for ${destination}: ${getErrorMessage(error)}`);
|
|
529
532
|
}
|
|
530
533
|
if (sessionConnConfig) {
|
|
531
|
-
const tokenLength = sessionConnConfig.authorizationToken
|
|
532
|
-
|
|
534
|
+
const tokenLength = (sessionConnConfig.authorizationToken ||
|
|
535
|
+
sessionConnConfig.sessionCookies)?.length || 0;
|
|
536
|
+
const formattedToken = (0, formatting_1.formatToken)(sessionConnConfig.authorizationToken ||
|
|
537
|
+
sessionConnConfig.sessionCookies);
|
|
533
538
|
this.logger?.debug(`Connection config from session for ${destination}: token(${tokenLength} chars${formattedToken ? `, ${formattedToken}` : ''}), serviceUrl(${sessionConnConfig.serviceUrl ? 'yes' : 'no'})`);
|
|
534
539
|
return sessionConnConfig;
|
|
535
540
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"netHelpers.d.ts","sourceRoot":"","sources":["../../../src/__tests__/helpers/netHelpers.ts"],"names":[],"mappings":"AAEA,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,CAcxD;AAED,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC,CAQ7D"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.getAvailablePort = getAvailablePort;
|
|
37
|
+
exports.canListenOnLocalhost = canListenOnLocalhost;
|
|
38
|
+
const net = __importStar(require("node:net"));
|
|
39
|
+
async function getAvailablePort() {
|
|
40
|
+
return new Promise((resolve, reject) => {
|
|
41
|
+
const server = net.createServer();
|
|
42
|
+
server.once('error', reject);
|
|
43
|
+
server.listen(0, '127.0.0.1', () => {
|
|
44
|
+
const address = server.address();
|
|
45
|
+
if (typeof address === 'object' && address?.port) {
|
|
46
|
+
const port = address.port;
|
|
47
|
+
server.close(() => resolve(port));
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
server.close(() => reject(new Error('Failed to acquire a port')));
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
async function canListenOnLocalhost() {
|
|
56
|
+
return new Promise((resolve) => {
|
|
57
|
+
const server = net.createServer();
|
|
58
|
+
server.once('error', () => resolve(false));
|
|
59
|
+
server.listen(0, '127.0.0.1', () => {
|
|
60
|
+
server.close(() => resolve(true));
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mcp-abap-adt/auth-broker",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"description": "JWT authentication broker for MCP ABAP ADT - manages tokens based on destination headers",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -56,9 +56,9 @@
|
|
|
56
56
|
"node": ">=18.0.0"
|
|
57
57
|
},
|
|
58
58
|
"dependencies": {
|
|
59
|
-
"@mcp-abap-adt/auth-providers": "^0.
|
|
60
|
-
"@mcp-abap-adt/auth-stores": "^0.
|
|
61
|
-
"@mcp-abap-adt/interfaces": "^
|
|
59
|
+
"@mcp-abap-adt/auth-providers": "^1.0.0",
|
|
60
|
+
"@mcp-abap-adt/auth-stores": "^1.0.0",
|
|
61
|
+
"@mcp-abap-adt/interfaces": "^2.3.0",
|
|
62
62
|
"axios": "^1.13.4",
|
|
63
63
|
"tsx": "^4.21.0"
|
|
64
64
|
},
|