@mcp-abap-adt/auth-providers 1.2.0 → 2.2.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 +135 -0
- package/COPYING +674 -0
- package/LICENSE +160 -17
- package/README.md +401 -66
- package/bin/auth-authorization-code.ts +5 -3
- package/dist/__tests__/helpers/netHelpers.d.ts +16 -0
- package/dist/__tests__/helpers/netHelpers.d.ts.map +1 -1
- package/dist/__tests__/helpers/netHelpers.js +29 -0
- package/dist/__tests__/helpers/testLogger.d.ts +1 -1
- package/dist/__tests__/helpers/testLogger.d.ts.map +1 -1
- package/dist/auth/announce.d.ts +11 -0
- package/dist/auth/announce.d.ts.map +1 -0
- package/dist/auth/announce.js +19 -0
- package/dist/auth/browserAuth.d.ts +23 -15
- package/dist/auth/browserAuth.d.ts.map +1 -1
- package/dist/auth/browserAuth.js +25 -111
- package/dist/auth/callbackServer.d.ts +7 -1
- package/dist/auth/callbackServer.d.ts.map +1 -1
- package/dist/auth/callbackServer.js +31 -21
- package/dist/auth/deviceFlowAuth.d.ts +1 -1
- package/dist/auth/deviceFlowAuth.d.ts.map +1 -1
- package/dist/auth/oidcBrowserAuth.d.ts +2 -9
- package/dist/auth/oidcBrowserAuth.d.ts.map +1 -1
- package/dist/auth/oidcBrowserAuth.js +16 -125
- package/dist/auth/oidcDiscovery.d.ts +1 -1
- package/dist/auth/oidcDiscovery.d.ts.map +1 -1
- package/dist/auth/oidcToken.d.ts +1 -1
- package/dist/auth/oidcToken.d.ts.map +1 -1
- package/dist/auth/saml2Auth.d.ts +2 -9
- package/dist/auth/saml2Auth.d.ts.map +1 -1
- package/dist/auth/saml2Auth.js +10 -130
- package/dist/auth/saml2TokenExchange.d.ts +1 -1
- package/dist/auth/saml2TokenExchange.d.ts.map +1 -1
- package/dist/errors/TokenProviderErrors.js +6 -6
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -1
- package/dist/providers/AuthorizationCodeProvider.d.ts +8 -3
- package/dist/providers/AuthorizationCodeProvider.d.ts.map +1 -1
- package/dist/providers/AuthorizationCodeProvider.js +55 -44
- package/dist/providers/BaseTokenProvider.d.ts +2 -1
- package/dist/providers/BaseTokenProvider.d.ts.map +1 -1
- package/dist/providers/ClientCredentialsProvider.d.ts +1 -1
- package/dist/providers/ClientCredentialsProvider.d.ts.map +1 -1
- package/dist/providers/ClientCredentialsProvider.js +3 -3
- package/dist/providers/DeviceFlowProvider.d.ts +3 -1
- package/dist/providers/DeviceFlowProvider.d.ts.map +1 -1
- package/dist/providers/DeviceFlowProvider.js +17 -14
- package/dist/providers/OidcBrowserProvider.d.ts +5 -7
- package/dist/providers/OidcBrowserProvider.d.ts.map +1 -1
- package/dist/providers/OidcBrowserProvider.js +58 -61
- package/dist/providers/OidcDeviceFlowProvider.d.ts +2 -1
- package/dist/providers/OidcDeviceFlowProvider.d.ts.map +1 -1
- package/dist/providers/OidcDeviceFlowProvider.js +13 -11
- package/dist/providers/OidcPasswordProvider.d.ts +2 -1
- package/dist/providers/OidcPasswordProvider.d.ts.map +1 -1
- package/dist/providers/OidcPasswordProvider.js +4 -4
- package/dist/providers/OidcTokenExchangeProvider.d.ts +2 -1
- package/dist/providers/OidcTokenExchangeProvider.d.ts.map +1 -1
- package/dist/providers/OidcTokenExchangeProvider.js +3 -3
- package/dist/providers/Saml2BearerProvider.d.ts +4 -3
- package/dist/providers/Saml2BearerProvider.d.ts.map +1 -1
- package/dist/providers/Saml2BearerProvider.js +6 -3
- package/dist/providers/Saml2PureProvider.d.ts +4 -3
- package/dist/providers/Saml2PureProvider.d.ts.map +1 -1
- package/dist/providers/Saml2PureProvider.js +6 -3
- package/dist/providers/saml2Utils.d.ts +13 -12
- package/dist/providers/saml2Utils.d.ts.map +1 -1
- package/dist/providers/saml2Utils.js +46 -26
- package/dist/sso/SsoProviderFactory.d.ts +1 -1
- package/dist/sso/SsoProviderFactory.d.ts.map +1 -1
- package/dist/sso/types.d.ts +1 -1
- package/dist/sso/types.d.ts.map +1 -1
- package/dist/strategies/BrowserCallbackStrategy.d.ts +64 -0
- package/dist/strategies/BrowserCallbackStrategy.d.ts.map +1 -0
- package/dist/strategies/BrowserCallbackStrategy.js +210 -0
- package/dist/strategies/asOidcResult.d.ts +11 -0
- package/dist/strategies/asOidcResult.d.ts.map +1 -0
- package/dist/strategies/asOidcResult.js +30 -0
- package/dist/strategies/codeStrategies.d.ts +22 -0
- package/dist/strategies/codeStrategies.d.ts.map +1 -0
- package/dist/strategies/codeStrategies.js +39 -0
- package/dist/strategies/index.d.ts +8 -0
- package/dist/strategies/index.d.ts.map +1 -0
- package/dist/strategies/index.js +18 -0
- package/dist/strategies/manualStrategies.d.ts +20 -0
- package/dist/strategies/manualStrategies.d.ts.map +1 -0
- package/dist/strategies/manualStrategies.js +77 -0
- package/package.json +8 -5
- package/dist/auth/manualInput.d.ts +0 -5
- package/dist/auth/manualInput.d.ts.map +0 -1
- package/dist/auth/manualInput.js +0 -19
|
@@ -2,110 +2,28 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* OIDC browser authorization code flow (capture code)
|
|
4
4
|
*/
|
|
5
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
-
if (k2 === undefined) k2 = k;
|
|
7
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
-
}
|
|
11
|
-
Object.defineProperty(o, k2, desc);
|
|
12
|
-
}) : (function(o, m, k, k2) {
|
|
13
|
-
if (k2 === undefined) k2 = k;
|
|
14
|
-
o[k2] = m[k];
|
|
15
|
-
}));
|
|
16
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
-
}) : function(o, v) {
|
|
19
|
-
o["default"] = v;
|
|
20
|
-
});
|
|
21
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
-
var ownKeys = function(o) {
|
|
23
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
-
var ar = [];
|
|
25
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
-
return ar;
|
|
27
|
-
};
|
|
28
|
-
return ownKeys(o);
|
|
29
|
-
};
|
|
30
|
-
return function (mod) {
|
|
31
|
-
if (mod && mod.__esModule) return mod;
|
|
32
|
-
var result = {};
|
|
33
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
-
__setModuleDefault(result, mod);
|
|
35
|
-
return result;
|
|
36
|
-
};
|
|
37
|
-
})();
|
|
38
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
exports.
|
|
40
|
-
const net = __importStar(require("node:net"));
|
|
6
|
+
exports.withOidcCallbackServer = void 0;
|
|
41
7
|
const callbackServer_1 = require("./callbackServer");
|
|
42
|
-
const BROWSER_MAP = {
|
|
43
|
-
chrome: 'chrome',
|
|
44
|
-
edge: 'msedge',
|
|
45
|
-
firefox: 'firefox',
|
|
46
|
-
system: undefined,
|
|
47
|
-
auto: undefined,
|
|
48
|
-
headless: null,
|
|
49
|
-
none: null,
|
|
50
|
-
};
|
|
51
|
-
function isPortAvailable(port) {
|
|
52
|
-
return new Promise((resolve) => {
|
|
53
|
-
const server = net.createServer();
|
|
54
|
-
server.listen(port, () => {
|
|
55
|
-
server.once('close', () => resolve(true));
|
|
56
|
-
server.close();
|
|
57
|
-
});
|
|
58
|
-
server.on('error', () => resolve(false));
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
async function openBrowserUrl(authorizationUrl, browser, logger) {
|
|
62
|
-
const browserApp = BROWSER_MAP[browser];
|
|
63
|
-
if (browserApp === null) {
|
|
64
|
-
logger?.info('[OIDC] Browser suppressed, open URL manually', {
|
|
65
|
-
authorizationUrl,
|
|
66
|
-
});
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
if (browser === 'auto') {
|
|
70
|
-
try {
|
|
71
|
-
const openModule = await Promise.resolve().then(() => __importStar(require('open')));
|
|
72
|
-
const open = openModule.default;
|
|
73
|
-
await open(authorizationUrl);
|
|
74
|
-
logger?.info('[OIDC] Browser opened');
|
|
75
|
-
return;
|
|
76
|
-
}
|
|
77
|
-
catch (error) {
|
|
78
|
-
logger?.warn('[OIDC] Failed to open browser automatically', {
|
|
79
|
-
error: error instanceof Error ? error.message : String(error),
|
|
80
|
-
});
|
|
81
|
-
logger?.info('[OIDC] Open URL manually', { authorizationUrl });
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
try {
|
|
86
|
-
const openModule = await Promise.resolve().then(() => __importStar(require('open')));
|
|
87
|
-
const open = openModule.default;
|
|
88
|
-
if (browserApp) {
|
|
89
|
-
await open(authorizationUrl, { app: { name: browserApp } });
|
|
90
|
-
}
|
|
91
|
-
else {
|
|
92
|
-
await open(authorizationUrl);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
catch (error) {
|
|
96
|
-
logger?.warn('[OIDC] Failed to open browser', {
|
|
97
|
-
error: error instanceof Error ? error.message : String(error),
|
|
98
|
-
});
|
|
99
|
-
logger?.info('[OIDC] Open URL manually', { authorizationUrl });
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
8
|
const withOidcCallbackServer = (options, use) => (0, callbackServer_1.runCallbackScope)(options, (app, settle) => {
|
|
103
9
|
app.get('/callback', (req, res) => {
|
|
10
|
+
// An IdP that declines says so explicitly. That is a finished login,
|
|
11
|
+
// not a stray request, and it must not wait for the timeout.
|
|
12
|
+
const { error, error_description, error_uri } = req.query;
|
|
13
|
+
if (error) {
|
|
14
|
+
const message = error_description
|
|
15
|
+
? `${String(error)}: ${String(error_description)}`
|
|
16
|
+
: String(error);
|
|
17
|
+
res.status(400).send(`Authentication failed: ${message}`);
|
|
18
|
+
settle.err(new Error(`OIDC authentication failed: ${message}` +
|
|
19
|
+
(error_uri ? ` (${String(error_uri)})` : '')), res);
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
104
22
|
const code = req.query.code;
|
|
105
23
|
const state = req.query.state;
|
|
106
24
|
if (!code || typeof code !== 'string') {
|
|
107
|
-
res.status(400).send('
|
|
108
|
-
settle.
|
|
25
|
+
res.status(400).send('Error: not an authorization callback');
|
|
26
|
+
settle.ignore('no code and no error in query', res);
|
|
109
27
|
return;
|
|
110
28
|
}
|
|
111
29
|
res
|
|
@@ -114,31 +32,4 @@ const withOidcCallbackServer = (options, use) => (0, callbackServer_1.runCallbac
|
|
|
114
32
|
settle.ok({ code, state: typeof state === 'string' ? state : undefined }, res);
|
|
115
33
|
});
|
|
116
34
|
}, use);
|
|
117
|
-
|
|
118
|
-
* OIDC browser login.
|
|
119
|
-
*
|
|
120
|
-
* The callback socket belongs to the scope: it is released when the scope ends,
|
|
121
|
-
* whatever ends it. Before this, the flow had no timeout at all — an abandoned
|
|
122
|
-
* login never settled and the port was held for the life of the process.
|
|
123
|
-
*/
|
|
124
|
-
async function startOidcBrowserAuth(authorizationUrl, browser, logger, port = 3001, timeoutMs = 30 * 1000) {
|
|
125
|
-
// Pre-check kept for its message: AuthBroker matches /already in use/i to
|
|
126
|
-
// distinguish a busy port from other failures.
|
|
127
|
-
const portAvailable = await isPortAvailable(port);
|
|
128
|
-
if (!portAvailable) {
|
|
129
|
-
throw new Error(`Port ${port} is already in use. Please specify a different port or free the port.`);
|
|
130
|
-
}
|
|
131
|
-
return await withOidcCallbackServer({ port, timeoutMs }, async (server) => {
|
|
132
|
-
logger?.info('[OIDC] Callback server listening', { port: server.port });
|
|
133
|
-
const waiting = server.waitForResult();
|
|
134
|
-
// Not awaited: a launcher that hangs must not delay the timeout or the
|
|
135
|
-
// release of the port.
|
|
136
|
-
void openBrowserUrl(authorizationUrl, browser, logger).catch((error) => {
|
|
137
|
-
logger?.warn('[OIDC] Failed to open browser', {
|
|
138
|
-
error: error instanceof Error ? error.message : String(error),
|
|
139
|
-
});
|
|
140
|
-
logger?.info('[OIDC] Open URL manually', { authorizationUrl });
|
|
141
|
-
});
|
|
142
|
-
return await waiting;
|
|
143
|
-
});
|
|
144
|
-
}
|
|
35
|
+
exports.withOidcCallbackServer = withOidcCallbackServer;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oidcDiscovery.d.ts","sourceRoot":"","sources":["../../src/auth/oidcDiscovery.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"oidcDiscovery.d.ts","sourceRoot":"","sources":["../../src/auth/oidcDiscovery.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAC;AAG9D,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,6BAA6B,CAAC,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAWD,wBAAsB,YAAY,CAChC,oBAAoB,EAAE,MAAM,EAC5B,MAAM,CAAC,EAAE,OAAO,GACf,OAAO,CAAC,qBAAqB,CAAC,CAkBhC"}
|
package/dist/auth/oidcToken.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oidcToken.d.ts","sourceRoot":"","sources":["../../src/auth/oidcToken.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"oidcToken.d.ts","sourceRoot":"","sources":["../../src/auth/oidcToken.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAC;AAG9D,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA6BD,wBAAsB,yBAAyB,CAC7C,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,MAAM,CAAC,EAAE,OAAO,GACf,OAAO,CAAC,iBAAiB,CAAC,CAoB5B;AAED,wBAAsB,gBAAgB,CACpC,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,YAAY,EAAE,MAAM,EACpB,MAAM,CAAC,EAAE,OAAO,GACf,OAAO,CAAC,iBAAiB,CAAC,CAgB5B;AAED,MAAM,WAAW,0BAA0B;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,2BAA2B,CAC/C,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,CAAC,EAAE,OAAO,GACf,OAAO,CAAC,0BAA0B,CAAC,CA0BrC;AAED,wBAAsB,gBAAgB,CACpC,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,UAAU,EAAE,MAAM,EAClB,QAAQ,GAAE,MAAU,EACpB,MAAM,CAAC,EAAE,OAAO,GACf,OAAO,CAAC,iBAAiB,CAAC,CA8B5B;AAED,wBAAsB,aAAa,CACjC,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,CAAC,EAAE,OAAO,GACf,OAAO,CAAC,iBAAiB,CAAC,CA6B5B;AAED,wBAAsB,aAAa,CACjC,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,YAAY,EAAE,MAAM,EACpB,gBAAgB,EAAE,MAAM,EACxB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,UAAU,CAAC,EAAE,MAAM,EACnB,cAAc,CAAC,EAAE,MAAM,EACvB,MAAM,CAAC,EAAE,OAAO,GACf,OAAO,CAAC,iBAAiB,CAAC,CAgC5B"}
|
package/dist/auth/saml2Auth.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* SAML 2.0 auth helpers
|
|
3
3
|
*/
|
|
4
|
-
import type {
|
|
4
|
+
import type { CallbackServerFactory } from '@mcp-abap-adt/interfaces-auth';
|
|
5
5
|
export interface Saml2AuthConfig {
|
|
6
6
|
idpSsoUrl: string;
|
|
7
7
|
spEntityId: string;
|
|
@@ -10,13 +10,6 @@ export interface Saml2AuthConfig {
|
|
|
10
10
|
authorizationUrl?: string;
|
|
11
11
|
}
|
|
12
12
|
export declare function buildSamlAuthorizationUrl(config: Saml2AuthConfig): string;
|
|
13
|
-
|
|
14
|
-
* SAML browser login.
|
|
15
|
-
*
|
|
16
|
-
* The callback socket belongs to the scope: it is released when the scope ends,
|
|
17
|
-
* whatever ends it. Before this, the flow had no timeout at all — an abandoned
|
|
18
|
-
* login never settled and the port was held for the life of the process.
|
|
19
|
-
*/
|
|
20
|
-
export declare function startSamlBrowserAuth(config: Saml2AuthConfig, browser: string, logger?: ILogger, port?: number, timeoutMs?: number): Promise<string>;
|
|
13
|
+
export declare const withSamlCallbackServer: CallbackServerFactory<string>;
|
|
21
14
|
export declare function parseSamlNotOnOrAfter(samlResponse: string): number | undefined;
|
|
22
15
|
//# sourceMappingURL=saml2Auth.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"saml2Auth.d.ts","sourceRoot":"","sources":["../../src/auth/saml2Auth.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"saml2Auth.d.ts","sourceRoot":"","sources":["../../src/auth/saml2Auth.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EACV,qBAAqB,EAGtB,MAAM,+BAA+B,CAAC;AAIvC,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAyBD,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAazE;AAED,eAAO,MAAM,sBAAsB,EAAE,qBAAqB,CAAC,MAAM,CAgC9D,CAAC;AAEJ,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,MAAM,GACnB,MAAM,GAAG,SAAS,CAYpB"}
|
package/dist/auth/saml2Auth.js
CHANGED
|
@@ -2,70 +2,17 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* SAML 2.0 auth helpers
|
|
4
4
|
*/
|
|
5
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
-
if (k2 === undefined) k2 = k;
|
|
7
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
-
}
|
|
11
|
-
Object.defineProperty(o, k2, desc);
|
|
12
|
-
}) : (function(o, m, k, k2) {
|
|
13
|
-
if (k2 === undefined) k2 = k;
|
|
14
|
-
o[k2] = m[k];
|
|
15
|
-
}));
|
|
16
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
-
}) : function(o, v) {
|
|
19
|
-
o["default"] = v;
|
|
20
|
-
});
|
|
21
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
-
var ownKeys = function(o) {
|
|
23
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
-
var ar = [];
|
|
25
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
-
return ar;
|
|
27
|
-
};
|
|
28
|
-
return ownKeys(o);
|
|
29
|
-
};
|
|
30
|
-
return function (mod) {
|
|
31
|
-
if (mod && mod.__esModule) return mod;
|
|
32
|
-
var result = {};
|
|
33
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
-
__setModuleDefault(result, mod);
|
|
35
|
-
return result;
|
|
36
|
-
};
|
|
37
|
-
})();
|
|
38
5
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
39
6
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
40
7
|
};
|
|
41
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.withSamlCallbackServer = void 0;
|
|
42
10
|
exports.buildSamlAuthorizationUrl = buildSamlAuthorizationUrl;
|
|
43
|
-
exports.startSamlBrowserAuth = startSamlBrowserAuth;
|
|
44
11
|
exports.parseSamlNotOnOrAfter = parseSamlNotOnOrAfter;
|
|
45
12
|
const node_crypto_1 = require("node:crypto");
|
|
46
|
-
const net = __importStar(require("node:net"));
|
|
47
13
|
const node_zlib_1 = require("node:zlib");
|
|
48
14
|
const express_1 = __importDefault(require("express"));
|
|
49
15
|
const callbackServer_1 = require("./callbackServer");
|
|
50
|
-
const BROWSER_MAP = {
|
|
51
|
-
chrome: 'chrome',
|
|
52
|
-
edge: 'msedge',
|
|
53
|
-
firefox: 'firefox',
|
|
54
|
-
system: undefined,
|
|
55
|
-
auto: undefined,
|
|
56
|
-
headless: null,
|
|
57
|
-
none: null,
|
|
58
|
-
};
|
|
59
|
-
function isPortAvailable(port) {
|
|
60
|
-
return new Promise((resolve) => {
|
|
61
|
-
const server = net.createServer();
|
|
62
|
-
server.listen(port, () => {
|
|
63
|
-
server.once('close', () => resolve(true));
|
|
64
|
-
server.close();
|
|
65
|
-
});
|
|
66
|
-
server.on('error', () => resolve(false));
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
16
|
function base64Encode(input) {
|
|
70
17
|
return Buffer.isBuffer(input)
|
|
71
18
|
? input.toString('base64')
|
|
@@ -99,59 +46,20 @@ function buildSamlAuthorizationUrl(config) {
|
|
|
99
46
|
: '';
|
|
100
47
|
return `${config.idpSsoUrl}?SAMLRequest=${samlRequest}${relayState}`;
|
|
101
48
|
}
|
|
102
|
-
async function openBrowserUrl(authorizationUrl, browser, logger) {
|
|
103
|
-
const browserApp = BROWSER_MAP[browser];
|
|
104
|
-
if (browserApp === null) {
|
|
105
|
-
logger?.info('[SAML] Browser suppressed, open URL manually', {
|
|
106
|
-
authorizationUrl,
|
|
107
|
-
});
|
|
108
|
-
return;
|
|
109
|
-
}
|
|
110
|
-
if (browser === 'auto') {
|
|
111
|
-
try {
|
|
112
|
-
const openModule = await Promise.resolve().then(() => __importStar(require('open')));
|
|
113
|
-
const open = openModule.default;
|
|
114
|
-
await open(authorizationUrl);
|
|
115
|
-
logger?.info('[SAML] Browser opened');
|
|
116
|
-
return;
|
|
117
|
-
}
|
|
118
|
-
catch (error) {
|
|
119
|
-
logger?.warn('[SAML] Failed to open browser automatically', {
|
|
120
|
-
error: error instanceof Error ? error.message : String(error),
|
|
121
|
-
});
|
|
122
|
-
logger?.info('[SAML] Open URL manually', { authorizationUrl });
|
|
123
|
-
return;
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
try {
|
|
127
|
-
const openModule = await Promise.resolve().then(() => __importStar(require('open')));
|
|
128
|
-
const open = openModule.default;
|
|
129
|
-
if (browserApp) {
|
|
130
|
-
await open(authorizationUrl, { app: { name: browserApp } });
|
|
131
|
-
}
|
|
132
|
-
else {
|
|
133
|
-
await open(authorizationUrl);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
catch (error) {
|
|
137
|
-
logger?.warn('[SAML] Failed to open browser', {
|
|
138
|
-
error: error instanceof Error ? error.message : String(error),
|
|
139
|
-
});
|
|
140
|
-
logger?.info('[SAML] Open URL manually', { authorizationUrl });
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
49
|
const withSamlCallbackServer = (options, use) => (0, callbackServer_1.runCallbackScope)(options, (app, settle) => {
|
|
144
50
|
app.use(express_1.default.urlencoded({ extended: false, limit: '5mb' }));
|
|
145
51
|
const handle = (samlResponse, res) => {
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
.send('SAML authentication complete. You can close this window.');
|
|
52
|
+
// The response is decided after the payload is examined. Answering 200
|
|
53
|
+
// first told a request that carried nothing that it had authenticated.
|
|
149
54
|
if (typeof samlResponse === 'string' && samlResponse) {
|
|
55
|
+
res
|
|
56
|
+
.status(200)
|
|
57
|
+
.send('SAML authentication complete. You can close this window.');
|
|
150
58
|
settle.ok(samlResponse, res);
|
|
59
|
+
return;
|
|
151
60
|
}
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
}
|
|
61
|
+
res.status(400).send('Error: not a SAML assertion callback');
|
|
62
|
+
settle.ignore('no SAMLResponse in the request', res);
|
|
155
63
|
};
|
|
156
64
|
app.post('/callback', (req, res) => {
|
|
157
65
|
handle(req.body?.SAMLResponse, res);
|
|
@@ -160,35 +68,7 @@ const withSamlCallbackServer = (options, use) => (0, callbackServer_1.runCallbac
|
|
|
160
68
|
handle(req.query.SAMLResponse, res);
|
|
161
69
|
});
|
|
162
70
|
}, use);
|
|
163
|
-
|
|
164
|
-
* SAML browser login.
|
|
165
|
-
*
|
|
166
|
-
* The callback socket belongs to the scope: it is released when the scope ends,
|
|
167
|
-
* whatever ends it. Before this, the flow had no timeout at all — an abandoned
|
|
168
|
-
* login never settled and the port was held for the life of the process.
|
|
169
|
-
*/
|
|
170
|
-
async function startSamlBrowserAuth(config, browser, logger, port = 3001, timeoutMs = 30 * 1000) {
|
|
171
|
-
// Pre-check kept for its message: AuthBroker matches /already in use/i to
|
|
172
|
-
// distinguish a busy port from other failures.
|
|
173
|
-
const portAvailable = await isPortAvailable(port);
|
|
174
|
-
if (!portAvailable) {
|
|
175
|
-
throw new Error(`Port ${port} is already in use. Please specify a different port or free the port.`);
|
|
176
|
-
}
|
|
177
|
-
const authorizationUrl = buildSamlAuthorizationUrl(config);
|
|
178
|
-
return await withSamlCallbackServer({ port, timeoutMs }, async (server) => {
|
|
179
|
-
logger?.info('[SAML] Callback server listening', { port: server.port });
|
|
180
|
-
const waiting = server.waitForResult();
|
|
181
|
-
// Not awaited: a launcher that hangs must not delay the timeout or the
|
|
182
|
-
// release of the port.
|
|
183
|
-
void openBrowserUrl(authorizationUrl, browser, logger).catch((error) => {
|
|
184
|
-
logger?.warn('[SAML] Failed to open browser', {
|
|
185
|
-
error: error instanceof Error ? error.message : String(error),
|
|
186
|
-
});
|
|
187
|
-
logger?.info('[SAML] Open URL manually', { authorizationUrl });
|
|
188
|
-
});
|
|
189
|
-
return await waiting;
|
|
190
|
-
});
|
|
191
|
-
}
|
|
71
|
+
exports.withSamlCallbackServer = withSamlCallbackServer;
|
|
192
72
|
function parseSamlNotOnOrAfter(samlResponse) {
|
|
193
73
|
try {
|
|
194
74
|
const decoded = Buffer.from(samlResponse, 'base64').toString('utf8');
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* SAML 2.0 bearer assertion exchange
|
|
3
3
|
*/
|
|
4
|
-
import type { ILogger } from '@mcp-abap-adt/interfaces';
|
|
4
|
+
import type { ILogger } from '@mcp-abap-adt/interfaces-utils';
|
|
5
5
|
export interface Saml2TokenExchangeResponse {
|
|
6
6
|
accessToken: string;
|
|
7
7
|
refreshToken?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"saml2TokenExchange.d.ts","sourceRoot":"","sources":["../../src/auth/saml2TokenExchange.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"saml2TokenExchange.d.ts","sourceRoot":"","sources":["../../src/auth/saml2TokenExchange.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAC;AAG9D,MAAM,WAAW,0BAA0B;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAMD,wBAAsB,qBAAqB,CACzC,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,MAAM,CAAC,EAAE,OAAO,GACf,OAAO,CAAC,0BAA0B,CAAC,CAwCrC"}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
9
|
exports.BrowserAuthError = exports.ServiceKeyError = exports.SessionDataError = exports.RefreshError = exports.ValidationError = exports.TokenProviderError = void 0;
|
|
10
|
-
const
|
|
10
|
+
const interfaces_auth_1 = require("@mcp-abap-adt/interfaces-auth");
|
|
11
11
|
/**
|
|
12
12
|
* Base class for all token provider errors
|
|
13
13
|
*/
|
|
@@ -27,7 +27,7 @@ exports.TokenProviderError = TokenProviderError;
|
|
|
27
27
|
class ValidationError extends TokenProviderError {
|
|
28
28
|
missingFields;
|
|
29
29
|
constructor(message, missingFields) {
|
|
30
|
-
super(message,
|
|
30
|
+
super(message, interfaces_auth_1.TOKEN_PROVIDER_ERROR_CODES.VALIDATION_ERROR);
|
|
31
31
|
this.missingFields = missingFields;
|
|
32
32
|
this.name = 'ValidationError';
|
|
33
33
|
Object.setPrototypeOf(this, ValidationError.prototype);
|
|
@@ -40,7 +40,7 @@ exports.ValidationError = ValidationError;
|
|
|
40
40
|
class RefreshError extends TokenProviderError {
|
|
41
41
|
cause;
|
|
42
42
|
constructor(message, cause) {
|
|
43
|
-
super(message,
|
|
43
|
+
super(message, interfaces_auth_1.TOKEN_PROVIDER_ERROR_CODES.REFRESH_ERROR);
|
|
44
44
|
this.cause = cause;
|
|
45
45
|
this.name = 'RefreshError';
|
|
46
46
|
Object.setPrototypeOf(this, RefreshError.prototype);
|
|
@@ -53,7 +53,7 @@ exports.RefreshError = RefreshError;
|
|
|
53
53
|
class SessionDataError extends TokenProviderError {
|
|
54
54
|
missingFields;
|
|
55
55
|
constructor(message, missingFields) {
|
|
56
|
-
super(message,
|
|
56
|
+
super(message, interfaces_auth_1.TOKEN_PROVIDER_ERROR_CODES.SESSION_DATA_ERROR);
|
|
57
57
|
this.missingFields = missingFields;
|
|
58
58
|
this.name = 'SessionDataError';
|
|
59
59
|
Object.setPrototypeOf(this, SessionDataError.prototype);
|
|
@@ -66,7 +66,7 @@ exports.SessionDataError = SessionDataError;
|
|
|
66
66
|
class ServiceKeyError extends TokenProviderError {
|
|
67
67
|
missingFields;
|
|
68
68
|
constructor(message, missingFields) {
|
|
69
|
-
super(message,
|
|
69
|
+
super(message, interfaces_auth_1.TOKEN_PROVIDER_ERROR_CODES.SERVICE_KEY_ERROR);
|
|
70
70
|
this.missingFields = missingFields;
|
|
71
71
|
this.name = 'ServiceKeyError';
|
|
72
72
|
Object.setPrototypeOf(this, ServiceKeyError.prototype);
|
|
@@ -79,7 +79,7 @@ exports.ServiceKeyError = ServiceKeyError;
|
|
|
79
79
|
class BrowserAuthError extends TokenProviderError {
|
|
80
80
|
cause;
|
|
81
81
|
constructor(message, cause) {
|
|
82
|
-
super(message,
|
|
82
|
+
super(message, interfaces_auth_1.TOKEN_PROVIDER_ERROR_CODES.BROWSER_AUTH_ERROR);
|
|
83
83
|
this.cause = cause;
|
|
84
84
|
this.name = 'BrowserAuthError';
|
|
85
85
|
Object.setPrototypeOf(this, BrowserAuthError.prototype);
|
package/dist/index.d.ts
CHANGED
|
@@ -4,9 +4,15 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Provides token providers
|
|
6
6
|
*/
|
|
7
|
+
export { withBrowserCallbackServer } from './auth/callbackServer';
|
|
8
|
+
export type { OidcCallbackResult } from './auth/oidcBrowserAuth';
|
|
9
|
+
export { withOidcCallbackServer } from './auth/oidcBrowserAuth';
|
|
10
|
+
export { withSamlCallbackServer } from './auth/saml2Auth';
|
|
7
11
|
export { BrowserAuthError, RefreshError, ServiceKeyError, SessionDataError, TokenProviderError, ValidationError, } from './errors/TokenProviderErrors';
|
|
8
12
|
export type { AuthorizationCodeProviderConfig, ClientCredentialsProviderConfig, DeviceFlowProviderConfig, OidcBrowserProviderConfig, OidcDeviceFlowProviderConfig, OidcPasswordProviderConfig, OidcTokenExchangeProviderConfig, Saml2BearerProviderConfig, Saml2PureProviderConfig, } from './providers';
|
|
9
13
|
export { AuthorizationCodeProvider, BaseTokenProvider, ClientCredentialsProvider, DeviceFlowProvider, OidcBrowserProvider, OidcDeviceFlowProvider, OidcPasswordProvider, OidcTokenExchangeProvider, Saml2BearerProvider, Saml2PureProvider, } from './providers';
|
|
10
14
|
export { SsoProviderFactory } from './sso/SsoProviderFactory';
|
|
11
15
|
export type { SsoProviderConfig, SsoProviderInstance } from './sso/types';
|
|
16
|
+
export type { BrowserCallbackStrategyOptions, CallbackStrategyOptions, ExternalCodeStrategyOptions, ManualStrategyOptions, StaticCodeStrategyOptions, } from './strategies';
|
|
17
|
+
export { asOidcResult, BrowserCallbackStrategy, browserCallbackStrategy, DEFAULT_CALLBACK_PORT, DEFAULT_LOGIN_TIMEOUT_MS, externalCodeStrategy, manualPasteStrategy, manualSamlResponseStrategy, oidcCallbackStrategy, samlCallbackStrategy, staticCodeStrategy, } from './strategies';
|
|
12
18
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,GAChB,MAAM,8BAA8B,CAAC;AACtC,YAAY,EACV,+BAA+B,EAC/B,+BAA+B,EAC/B,wBAAwB,EACxB,yBAAyB,EACzB,4BAA4B,EAC5B,0BAA0B,EAC1B,+BAA+B,EAC/B,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,yBAAyB,EACzB,iBAAiB,EACjB,yBAAyB,EACzB,kBAAkB,EAClB,mBAAmB,EACnB,sBAAsB,EACtB,oBAAoB,EACpB,yBAAyB,EACzB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAClE,YAAY,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,GAChB,MAAM,8BAA8B,CAAC;AACtC,YAAY,EACV,+BAA+B,EAC/B,+BAA+B,EAC/B,wBAAwB,EACxB,yBAAyB,EACzB,4BAA4B,EAC5B,0BAA0B,EAC1B,+BAA+B,EAC/B,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,yBAAyB,EACzB,iBAAiB,EACjB,yBAAyB,EACzB,kBAAkB,EAClB,mBAAmB,EACnB,sBAAsB,EACtB,oBAAoB,EACpB,yBAAyB,EACzB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,YAAY,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAC1E,YAAY,EACV,8BAA8B,EAC9B,uBAAuB,EACvB,2BAA2B,EAC3B,qBAAqB,EACrB,yBAAyB,GAC1B,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,YAAY,EACZ,uBAAuB,EACvB,uBAAuB,EACvB,qBAAqB,EACrB,wBAAwB,EACxB,oBAAoB,EACpB,mBAAmB,EACnB,0BAA0B,EAC1B,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,cAAc,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -6,7 +6,14 @@
|
|
|
6
6
|
* Provides token providers
|
|
7
7
|
*/
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.SsoProviderFactory = exports.Saml2PureProvider = exports.Saml2BearerProvider = exports.OidcTokenExchangeProvider = exports.OidcPasswordProvider = exports.OidcDeviceFlowProvider = exports.OidcBrowserProvider = exports.DeviceFlowProvider = exports.ClientCredentialsProvider = exports.BaseTokenProvider = exports.AuthorizationCodeProvider = exports.ValidationError = exports.TokenProviderError = exports.SessionDataError = exports.ServiceKeyError = exports.RefreshError = exports.BrowserAuthError = void 0;
|
|
9
|
+
exports.staticCodeStrategy = exports.samlCallbackStrategy = exports.oidcCallbackStrategy = exports.manualSamlResponseStrategy = exports.manualPasteStrategy = exports.externalCodeStrategy = exports.DEFAULT_LOGIN_TIMEOUT_MS = exports.DEFAULT_CALLBACK_PORT = exports.browserCallbackStrategy = exports.BrowserCallbackStrategy = exports.asOidcResult = exports.SsoProviderFactory = exports.Saml2PureProvider = exports.Saml2BearerProvider = exports.OidcTokenExchangeProvider = exports.OidcPasswordProvider = exports.OidcDeviceFlowProvider = exports.OidcBrowserProvider = exports.DeviceFlowProvider = exports.ClientCredentialsProvider = exports.BaseTokenProvider = exports.AuthorizationCodeProvider = exports.ValidationError = exports.TokenProviderError = exports.SessionDataError = exports.ServiceKeyError = exports.RefreshError = exports.BrowserAuthError = exports.withSamlCallbackServer = exports.withOidcCallbackServer = exports.withBrowserCallbackServer = void 0;
|
|
10
|
+
// Callback server factories — "take the transport this package gives".
|
|
11
|
+
var callbackServer_1 = require("./auth/callbackServer");
|
|
12
|
+
Object.defineProperty(exports, "withBrowserCallbackServer", { enumerable: true, get: function () { return callbackServer_1.withBrowserCallbackServer; } });
|
|
13
|
+
var oidcBrowserAuth_1 = require("./auth/oidcBrowserAuth");
|
|
14
|
+
Object.defineProperty(exports, "withOidcCallbackServer", { enumerable: true, get: function () { return oidcBrowserAuth_1.withOidcCallbackServer; } });
|
|
15
|
+
var saml2Auth_1 = require("./auth/saml2Auth");
|
|
16
|
+
Object.defineProperty(exports, "withSamlCallbackServer", { enumerable: true, get: function () { return saml2Auth_1.withSamlCallbackServer; } });
|
|
10
17
|
// Errors
|
|
11
18
|
var TokenProviderErrors_1 = require("./errors/TokenProviderErrors");
|
|
12
19
|
Object.defineProperty(exports, "BrowserAuthError", { enumerable: true, get: function () { return TokenProviderErrors_1.BrowserAuthError; } });
|
|
@@ -30,3 +37,16 @@ Object.defineProperty(exports, "Saml2PureProvider", { enumerable: true, get: fun
|
|
|
30
37
|
// SSO factory
|
|
31
38
|
var SsoProviderFactory_1 = require("./sso/SsoProviderFactory");
|
|
32
39
|
Object.defineProperty(exports, "SsoProviderFactory", { enumerable: true, get: function () { return SsoProviderFactory_1.SsoProviderFactory; } });
|
|
40
|
+
// Authorization strategies — or bring your own IAuthorizationStrategy.
|
|
41
|
+
var strategies_1 = require("./strategies");
|
|
42
|
+
Object.defineProperty(exports, "asOidcResult", { enumerable: true, get: function () { return strategies_1.asOidcResult; } });
|
|
43
|
+
Object.defineProperty(exports, "BrowserCallbackStrategy", { enumerable: true, get: function () { return strategies_1.BrowserCallbackStrategy; } });
|
|
44
|
+
Object.defineProperty(exports, "browserCallbackStrategy", { enumerable: true, get: function () { return strategies_1.browserCallbackStrategy; } });
|
|
45
|
+
Object.defineProperty(exports, "DEFAULT_CALLBACK_PORT", { enumerable: true, get: function () { return strategies_1.DEFAULT_CALLBACK_PORT; } });
|
|
46
|
+
Object.defineProperty(exports, "DEFAULT_LOGIN_TIMEOUT_MS", { enumerable: true, get: function () { return strategies_1.DEFAULT_LOGIN_TIMEOUT_MS; } });
|
|
47
|
+
Object.defineProperty(exports, "externalCodeStrategy", { enumerable: true, get: function () { return strategies_1.externalCodeStrategy; } });
|
|
48
|
+
Object.defineProperty(exports, "manualPasteStrategy", { enumerable: true, get: function () { return strategies_1.manualPasteStrategy; } });
|
|
49
|
+
Object.defineProperty(exports, "manualSamlResponseStrategy", { enumerable: true, get: function () { return strategies_1.manualSamlResponseStrategy; } });
|
|
50
|
+
Object.defineProperty(exports, "oidcCallbackStrategy", { enumerable: true, get: function () { return strategies_1.oidcCallbackStrategy; } });
|
|
51
|
+
Object.defineProperty(exports, "samlCallbackStrategy", { enumerable: true, get: function () { return strategies_1.samlCallbackStrategy; } });
|
|
52
|
+
Object.defineProperty(exports, "staticCodeStrategy", { enumerable: true, get: function () { return strategies_1.staticCodeStrategy; } });
|
|
@@ -4,15 +4,20 @@
|
|
|
4
4
|
* Uses authorization_code grant type with browser-based OAuth2 flow.
|
|
5
5
|
* Supports pre-built authorization URLs and automatic refresh.
|
|
6
6
|
*/
|
|
7
|
-
import type {
|
|
7
|
+
import type { IAuthorizationStrategy, ITokenResult, OAuth2GrantType } from '@mcp-abap-adt/interfaces-auth';
|
|
8
|
+
import type { ILogger } from '@mcp-abap-adt/interfaces-utils';
|
|
8
9
|
import { BaseTokenProvider } from './BaseTokenProvider';
|
|
9
10
|
export interface AuthorizationCodeProviderConfig {
|
|
10
11
|
uaaUrl: string;
|
|
11
12
|
clientId: string;
|
|
12
13
|
clientSecret: string;
|
|
14
|
+
/** Pre-built authorization URL. Carries its own redirect; see the guard below. */
|
|
13
15
|
authorizationUrl?: string;
|
|
14
|
-
|
|
15
|
-
|
|
16
|
+
/**
|
|
17
|
+
* How the login is conducted. Omitted means a browser callback on the default
|
|
18
|
+
* port — the package's own transport, which a consumer may replace wholesale.
|
|
19
|
+
*/
|
|
20
|
+
authorization?: IAuthorizationStrategy<string>;
|
|
16
21
|
accessToken?: string;
|
|
17
22
|
refreshToken?: string;
|
|
18
23
|
logger?: ILogger;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthorizationCodeProvider.d.ts","sourceRoot":"","sources":["../../src/providers/AuthorizationCodeProvider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"AuthorizationCodeProvider.d.ts","sourceRoot":"","sources":["../../src/providers/AuthorizationCodeProvider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,sBAAsB,EACtB,YAAY,EACZ,eAAe,EAChB,MAAM,+BAA+B,CAAC;AAGvC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAC;AAO9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,MAAM,WAAW,+BAA+B;IAE9C,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IAErB,kFAAkF;IAClF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;OAGG;IACH,aAAa,CAAC,EAAE,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAG/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;GAKG;AACH,qBAAa,yBAA0B,SAAQ,iBAAiB;IAC9D,OAAO,CAAC,MAAM,CAAkC;gBAEpC,MAAM,EAAE,+BAA+B;IA4D7C,SAAS,IAAI,OAAO,CAAC,YAAY,CAAC;IAIxC,SAAS,CAAC,WAAW,IAAI,eAAe;cAIxB,YAAY,IAAI,OAAO,CAAC,YAAY,CAAC;cA+ErC,cAAc,IAAI,OAAO,CAAC,YAAY,CAAC;CA0CxD"}
|