fastmcp 4.12.1 → 4.12.3
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/dist/FastMCP.cjs +3 -3
- package/dist/FastMCP.d.cts +4 -2
- package/dist/FastMCP.d.ts +4 -2
- package/dist/FastMCP.js +2 -2
- package/dist/{OAuthProvider-BNqoBTYA.d.cts → OAuthProvider-B_E71LUD.d.cts} +9 -0
- package/dist/{OAuthProvider-BNqoBTYA.d.ts → OAuthProvider-B_E71LUD.d.ts} +9 -0
- package/dist/auth/index.cjs +2 -2
- package/dist/auth/index.d.cts +2 -2
- package/dist/auth/index.d.ts +2 -2
- package/dist/auth/index.js +1 -1
- package/dist/{chunk-GM44BOI7.js → chunk-2ZFQSPXZ.js} +42 -23
- package/dist/chunk-2ZFQSPXZ.js.map +1 -0
- package/dist/{chunk-POXZCEYE.cjs → chunk-3O5ZKWCC.cjs} +73 -39
- package/dist/chunk-3O5ZKWCC.cjs.map +1 -0
- package/dist/{chunk-5BQXF2VT.js → chunk-5K4GLQMV.js} +36 -2
- package/dist/chunk-5K4GLQMV.js.map +1 -0
- package/dist/{chunk-DZYT6QAH.cjs → chunk-ENMHHQJF.cjs} +40 -21
- package/dist/chunk-ENMHHQJF.cjs.map +1 -0
- package/dist/examples/custom-routes.cjs +3 -3
- package/dist/examples/custom-routes.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-5BQXF2VT.js.map +0 -1
- package/dist/chunk-DZYT6QAH.cjs.map +0 -1
- package/dist/chunk-GM44BOI7.js.map +0 -1
- package/dist/chunk-POXZCEYE.cjs.map +0 -1
package/dist/FastMCP.cjs
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
|
|
13
|
-
var
|
|
13
|
+
var _chunk3O5ZKWCCcjs = require('./chunk-3O5ZKWCC.cjs');
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
|
|
@@ -23,7 +23,7 @@ var _chunkPOXZCEYEcjs = require('./chunk-POXZCEYE.cjs');
|
|
|
23
23
|
|
|
24
24
|
|
|
25
25
|
|
|
26
|
-
var
|
|
26
|
+
var _chunkENMHHQJFcjs = require('./chunk-ENMHHQJF.cjs');
|
|
27
27
|
|
|
28
28
|
|
|
29
29
|
|
|
@@ -47,5 +47,5 @@ var _chunkDZYT6QAHcjs = require('./chunk-DZYT6QAH.cjs');
|
|
|
47
47
|
|
|
48
48
|
|
|
49
49
|
|
|
50
|
-
exports.AuthProvider =
|
|
50
|
+
exports.AuthProvider = _chunkENMHHQJFcjs.AuthProvider; exports.AzureProvider = _chunkENMHHQJFcjs.AzureProvider; exports.DiscoveryDocumentCache = _chunk3O5ZKWCCcjs.DiscoveryDocumentCache; exports.FastMCP = _chunk3O5ZKWCCcjs.FastMCP; exports.FastMCPError = _chunk3O5ZKWCCcjs.FastMCPError; exports.FastMCPSession = _chunk3O5ZKWCCcjs.FastMCPSession; exports.GitHubProvider = _chunkENMHHQJFcjs.GitHubProvider; exports.GoogleProvider = _chunkENMHHQJFcjs.GoogleProvider; exports.OAuthProvider = _chunkENMHHQJFcjs.OAuthProvider; exports.ServerState = _chunk3O5ZKWCCcjs.ServerState; exports.SessionError = _chunk3O5ZKWCCcjs.SessionError; exports.UnexpectedStateError = _chunk3O5ZKWCCcjs.UnexpectedStateError; exports.UserError = _chunk3O5ZKWCCcjs.UserError; exports.audioContent = _chunk3O5ZKWCCcjs.audioContent; exports.getAuthSession = _chunkENMHHQJFcjs.getAuthSession; exports.imageContent = _chunk3O5ZKWCCcjs.imageContent; exports.jsonSchemaAdapter = _chunk3O5ZKWCCcjs.jsonSchemaAdapter; exports.requireAll = _chunkENMHHQJFcjs.requireAll; exports.requireAny = _chunkENMHHQJFcjs.requireAny; exports.requireAuth = _chunkENMHHQJFcjs.requireAuth; exports.requireRole = _chunkENMHHQJFcjs.requireRole; exports.requireScopes = _chunkENMHHQJFcjs.requireScopes;
|
|
51
51
|
//# sourceMappingURL=FastMCP.cjs.map
|
package/dist/FastMCP.d.cts
CHANGED
|
@@ -12,8 +12,8 @@ import { CorsOptions } from 'mcp-proxy';
|
|
|
12
12
|
export { CorsOptions } from 'mcp-proxy';
|
|
13
13
|
import { StrictEventEmitter } from 'strict-event-emitter-types';
|
|
14
14
|
import { z } from 'zod';
|
|
15
|
-
import { A as AuthProvider, O as OAuthSession, a as OAuthProxy } from './OAuthProvider-
|
|
16
|
-
export { j as AuthProviderConfig, b as AzureProvider, k as AzureProviderConfig, l as AzureSession, m as GenericOAuthProviderConfig, G as GitHubProvider, n as GitHubSession, c as GoogleProvider, o as GoogleSession, d as OAuthProvider, g as getAuthSession, r as requireAll, e as requireAny, f as requireAuth, h as requireRole, i as requireScopes } from './OAuthProvider-
|
|
15
|
+
import { A as AuthProvider, O as OAuthSession, a as OAuthProxy } from './OAuthProvider-B_E71LUD.cjs';
|
|
16
|
+
export { j as AuthProviderConfig, b as AzureProvider, k as AzureProviderConfig, l as AzureSession, m as GenericOAuthProviderConfig, G as GitHubProvider, n as GitHubSession, c as GoogleProvider, o as GoogleSession, d as OAuthProvider, g as getAuthSession, r as requireAll, e as requireAny, f as requireAuth, h as requireRole, i as requireScopes } from './OAuthProvider-B_E71LUD.cjs';
|
|
17
17
|
import 'node:http';
|
|
18
18
|
|
|
19
19
|
declare class DiscoveryDocumentCache {
|
|
@@ -21,9 +21,11 @@ declare class DiscoveryDocumentCache {
|
|
|
21
21
|
get size(): number;
|
|
22
22
|
/**
|
|
23
23
|
* @param options - configuration options
|
|
24
|
+
* @param options.timeoutMs - timeout in miliseconds for the upstream fetch
|
|
24
25
|
* @param options.ttl - time-to-live in miliseconds
|
|
25
26
|
*/
|
|
26
27
|
constructor(options?: {
|
|
28
|
+
timeoutMs?: number;
|
|
27
29
|
ttl?: number;
|
|
28
30
|
});
|
|
29
31
|
/**
|
package/dist/FastMCP.d.ts
CHANGED
|
@@ -12,8 +12,8 @@ import { CorsOptions } from 'mcp-proxy';
|
|
|
12
12
|
export { CorsOptions } from 'mcp-proxy';
|
|
13
13
|
import { StrictEventEmitter } from 'strict-event-emitter-types';
|
|
14
14
|
import { z } from 'zod';
|
|
15
|
-
import { A as AuthProvider, O as OAuthSession, a as OAuthProxy } from './OAuthProvider-
|
|
16
|
-
export { j as AuthProviderConfig, b as AzureProvider, k as AzureProviderConfig, l as AzureSession, m as GenericOAuthProviderConfig, G as GitHubProvider, n as GitHubSession, c as GoogleProvider, o as GoogleSession, d as OAuthProvider, g as getAuthSession, r as requireAll, e as requireAny, f as requireAuth, h as requireRole, i as requireScopes } from './OAuthProvider-
|
|
15
|
+
import { A as AuthProvider, O as OAuthSession, a as OAuthProxy } from './OAuthProvider-B_E71LUD.js';
|
|
16
|
+
export { j as AuthProviderConfig, b as AzureProvider, k as AzureProviderConfig, l as AzureSession, m as GenericOAuthProviderConfig, G as GitHubProvider, n as GitHubSession, c as GoogleProvider, o as GoogleSession, d as OAuthProvider, g as getAuthSession, r as requireAll, e as requireAny, f as requireAuth, h as requireRole, i as requireScopes } from './OAuthProvider-B_E71LUD.js';
|
|
17
17
|
import 'node:http';
|
|
18
18
|
|
|
19
19
|
declare class DiscoveryDocumentCache {
|
|
@@ -21,9 +21,11 @@ declare class DiscoveryDocumentCache {
|
|
|
21
21
|
get size(): number;
|
|
22
22
|
/**
|
|
23
23
|
* @param options - configuration options
|
|
24
|
+
* @param options.timeoutMs - timeout in miliseconds for the upstream fetch
|
|
24
25
|
* @param options.ttl - time-to-live in miliseconds
|
|
25
26
|
*/
|
|
26
27
|
constructor(options?: {
|
|
28
|
+
timeoutMs?: number;
|
|
27
29
|
ttl?: number;
|
|
28
30
|
});
|
|
29
31
|
/**
|
package/dist/FastMCP.js
CHANGED
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
audioContent,
|
|
11
11
|
imageContent,
|
|
12
12
|
jsonSchemaAdapter
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-5K4GLQMV.js";
|
|
14
14
|
import {
|
|
15
15
|
AuthProvider,
|
|
16
16
|
AzureProvider,
|
|
@@ -23,7 +23,7 @@ import {
|
|
|
23
23
|
requireAuth,
|
|
24
24
|
requireRole,
|
|
25
25
|
requireScopes
|
|
26
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-2ZFQSPXZ.js";
|
|
27
27
|
export {
|
|
28
28
|
AuthProvider,
|
|
29
29
|
AzureProvider,
|
|
@@ -260,6 +260,8 @@ interface OAuthProxyConfig {
|
|
|
260
260
|
upstreamClientId: string;
|
|
261
261
|
/** Pre-registered client secret with upstream provider */
|
|
262
262
|
upstreamClientSecret: string;
|
|
263
|
+
/** Timeout in milliseconds for upstream token/refresh HTTP requests (default: 10000) */
|
|
264
|
+
upstreamRequestTimeoutMs?: number;
|
|
263
265
|
/** Upstream provider's token endpoint URL */
|
|
264
266
|
upstreamTokenEndpoint: string;
|
|
265
267
|
/** Upstream token endpoint authentication method (default: "client_secret_basic") */
|
|
@@ -540,6 +542,13 @@ declare class OAuthProxy {
|
|
|
540
542
|
* Combines claims from access token and ID token (if present)
|
|
541
543
|
*/
|
|
542
544
|
private extractUpstreamClaims;
|
|
545
|
+
/**
|
|
546
|
+
* POST to the upstream token endpoint with a bounded wait.
|
|
547
|
+
*
|
|
548
|
+
* Maps an abort of the configured timeout signal to a clean OAuth error
|
|
549
|
+
* instead of letting the raw `TimeoutError`/`AbortError` propagate.
|
|
550
|
+
*/
|
|
551
|
+
private fetchUpstream;
|
|
543
552
|
/**
|
|
544
553
|
* Generate authorization code for client
|
|
545
554
|
*/
|
|
@@ -260,6 +260,8 @@ interface OAuthProxyConfig {
|
|
|
260
260
|
upstreamClientId: string;
|
|
261
261
|
/** Pre-registered client secret with upstream provider */
|
|
262
262
|
upstreamClientSecret: string;
|
|
263
|
+
/** Timeout in milliseconds for upstream token/refresh HTTP requests (default: 10000) */
|
|
264
|
+
upstreamRequestTimeoutMs?: number;
|
|
263
265
|
/** Upstream provider's token endpoint URL */
|
|
264
266
|
upstreamTokenEndpoint: string;
|
|
265
267
|
/** Upstream token endpoint authentication method (default: "client_secret_basic") */
|
|
@@ -540,6 +542,13 @@ declare class OAuthProxy {
|
|
|
540
542
|
* Combines claims from access token and ID token (if present)
|
|
541
543
|
*/
|
|
542
544
|
private extractUpstreamClaims;
|
|
545
|
+
/**
|
|
546
|
+
* POST to the upstream token endpoint with a bounded wait.
|
|
547
|
+
*
|
|
548
|
+
* Maps an abort of the configured timeout signal to a clean OAuth error
|
|
549
|
+
* instead of letting the raw `TimeoutError`/`AbortError` propagate.
|
|
550
|
+
*/
|
|
551
|
+
private fetchUpstream;
|
|
543
552
|
/**
|
|
544
553
|
* Generate authorization code for client
|
|
545
554
|
*/
|
package/dist/auth/index.cjs
CHANGED
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
|
|
25
25
|
|
|
26
26
|
|
|
27
|
-
var
|
|
27
|
+
var _chunkENMHHQJFcjs = require('../chunk-ENMHHQJF.cjs');
|
|
28
28
|
|
|
29
29
|
|
|
30
30
|
|
|
@@ -51,5 +51,5 @@ var _chunkDZYT6QAHcjs = require('../chunk-DZYT6QAH.cjs');
|
|
|
51
51
|
|
|
52
52
|
|
|
53
53
|
|
|
54
|
-
exports.AuthProvider =
|
|
54
|
+
exports.AuthProvider = _chunkENMHHQJFcjs.AuthProvider; exports.AzureProvider = _chunkENMHHQJFcjs.AzureProvider; exports.ConsentManager = _chunkENMHHQJFcjs.ConsentManager; exports.DEFAULT_ACCESS_TOKEN_TTL = _chunkENMHHQJFcjs.DEFAULT_ACCESS_TOKEN_TTL; exports.DEFAULT_ACCESS_TOKEN_TTL_NO_REFRESH = _chunkENMHHQJFcjs.DEFAULT_ACCESS_TOKEN_TTL_NO_REFRESH; exports.DEFAULT_AUTHORIZATION_CODE_TTL = _chunkENMHHQJFcjs.DEFAULT_AUTHORIZATION_CODE_TTL; exports.DEFAULT_REFRESH_TOKEN_TTL = _chunkENMHHQJFcjs.DEFAULT_REFRESH_TOKEN_TTL; exports.DEFAULT_TRANSACTION_TTL = _chunkENMHHQJFcjs.DEFAULT_TRANSACTION_TTL; exports.DiskStore = _chunkENMHHQJFcjs.DiskStore; exports.EncryptedTokenStorage = _chunkENMHHQJFcjs.EncryptedTokenStorage; exports.GitHubProvider = _chunkENMHHQJFcjs.GitHubProvider; exports.GoogleProvider = _chunkENMHHQJFcjs.GoogleProvider; exports.JWKSVerifier = _chunkENMHHQJFcjs.JWKSVerifier; exports.JWTIssuer = _chunkENMHHQJFcjs.JWTIssuer; exports.MemoryTokenStorage = _chunkENMHHQJFcjs.MemoryTokenStorage; exports.OAuthProvider = _chunkENMHHQJFcjs.OAuthProvider; exports.OAuthProxy = _chunkENMHHQJFcjs.OAuthProxy; exports.OAuthProxyError = _chunkENMHHQJFcjs.OAuthProxyError; exports.PKCEUtils = _chunkENMHHQJFcjs.PKCEUtils; exports.getAuthSession = _chunkENMHHQJFcjs.getAuthSession; exports.requireAll = _chunkENMHHQJFcjs.requireAll; exports.requireAny = _chunkENMHHQJFcjs.requireAny; exports.requireAuth = _chunkENMHHQJFcjs.requireAuth; exports.requireRole = _chunkENMHHQJFcjs.requireRole; exports.requireScopes = _chunkENMHHQJFcjs.requireScopes;
|
|
55
55
|
//# sourceMappingURL=index.cjs.map
|
package/dist/auth/index.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { p as OAuthTransaction, C as ConsentData, T as TokenStorage, q as TokenVerifier, s as TokenVerificationResult, P as PKCEPair } from '../OAuthProvider-
|
|
2
|
-
export { A as AuthProvider, j as AuthProviderConfig, y as AuthorizationParams, b as AzureProvider, k as AzureProviderConfig, l as AzureSession, z as ClientCode, B as DCRClientMetadata, E as DCRRequest, F as DCRResponse, D as DEFAULT_ACCESS_TOKEN_TTL, u as DEFAULT_ACCESS_TOKEN_TTL_NO_REFRESH, v as DEFAULT_AUTHORIZATION_CODE_TTL, w as DEFAULT_REFRESH_TOKEN_TTL, x as DEFAULT_TRANSACTION_TTL, m as GenericOAuthProviderConfig, G as GitHubProvider, n as GitHubSession, c as GoogleProvider, o as GoogleSession, H as OAuthError, d as OAuthProvider, I as OAuthProviderConfig, a as OAuthProxy, J as OAuthProxyConfig, t as OAuthProxyError, O as OAuthSession, K as ProxyDCRClient, R as RefreshRequest, L as TokenMapping, M as TokenRequest, N as TokenResponse, U as UpstreamTokenSet, g as getAuthSession, r as requireAll, e as requireAny, f as requireAuth, h as requireRole, i as requireScopes } from '../OAuthProvider-
|
|
1
|
+
import { p as OAuthTransaction, C as ConsentData, T as TokenStorage, q as TokenVerifier, s as TokenVerificationResult, P as PKCEPair } from '../OAuthProvider-B_E71LUD.cjs';
|
|
2
|
+
export { A as AuthProvider, j as AuthProviderConfig, y as AuthorizationParams, b as AzureProvider, k as AzureProviderConfig, l as AzureSession, z as ClientCode, B as DCRClientMetadata, E as DCRRequest, F as DCRResponse, D as DEFAULT_ACCESS_TOKEN_TTL, u as DEFAULT_ACCESS_TOKEN_TTL_NO_REFRESH, v as DEFAULT_AUTHORIZATION_CODE_TTL, w as DEFAULT_REFRESH_TOKEN_TTL, x as DEFAULT_TRANSACTION_TTL, m as GenericOAuthProviderConfig, G as GitHubProvider, n as GitHubSession, c as GoogleProvider, o as GoogleSession, H as OAuthError, d as OAuthProvider, I as OAuthProviderConfig, a as OAuthProxy, J as OAuthProxyConfig, t as OAuthProxyError, O as OAuthSession, K as ProxyDCRClient, R as RefreshRequest, L as TokenMapping, M as TokenRequest, N as TokenResponse, U as UpstreamTokenSet, g as getAuthSession, r as requireAll, e as requireAny, f as requireAuth, h as requireRole, i as requireScopes } from '../OAuthProvider-B_E71LUD.cjs';
|
|
3
3
|
import 'node:http';
|
|
4
4
|
|
|
5
5
|
/**
|
package/dist/auth/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { p as OAuthTransaction, C as ConsentData, T as TokenStorage, q as TokenVerifier, s as TokenVerificationResult, P as PKCEPair } from '../OAuthProvider-
|
|
2
|
-
export { A as AuthProvider, j as AuthProviderConfig, y as AuthorizationParams, b as AzureProvider, k as AzureProviderConfig, l as AzureSession, z as ClientCode, B as DCRClientMetadata, E as DCRRequest, F as DCRResponse, D as DEFAULT_ACCESS_TOKEN_TTL, u as DEFAULT_ACCESS_TOKEN_TTL_NO_REFRESH, v as DEFAULT_AUTHORIZATION_CODE_TTL, w as DEFAULT_REFRESH_TOKEN_TTL, x as DEFAULT_TRANSACTION_TTL, m as GenericOAuthProviderConfig, G as GitHubProvider, n as GitHubSession, c as GoogleProvider, o as GoogleSession, H as OAuthError, d as OAuthProvider, I as OAuthProviderConfig, a as OAuthProxy, J as OAuthProxyConfig, t as OAuthProxyError, O as OAuthSession, K as ProxyDCRClient, R as RefreshRequest, L as TokenMapping, M as TokenRequest, N as TokenResponse, U as UpstreamTokenSet, g as getAuthSession, r as requireAll, e as requireAny, f as requireAuth, h as requireRole, i as requireScopes } from '../OAuthProvider-
|
|
1
|
+
import { p as OAuthTransaction, C as ConsentData, T as TokenStorage, q as TokenVerifier, s as TokenVerificationResult, P as PKCEPair } from '../OAuthProvider-B_E71LUD.js';
|
|
2
|
+
export { A as AuthProvider, j as AuthProviderConfig, y as AuthorizationParams, b as AzureProvider, k as AzureProviderConfig, l as AzureSession, z as ClientCode, B as DCRClientMetadata, E as DCRRequest, F as DCRResponse, D as DEFAULT_ACCESS_TOKEN_TTL, u as DEFAULT_ACCESS_TOKEN_TTL_NO_REFRESH, v as DEFAULT_AUTHORIZATION_CODE_TTL, w as DEFAULT_REFRESH_TOKEN_TTL, x as DEFAULT_TRANSACTION_TTL, m as GenericOAuthProviderConfig, G as GitHubProvider, n as GitHubSession, c as GoogleProvider, o as GoogleSession, H as OAuthError, d as OAuthProvider, I as OAuthProviderConfig, a as OAuthProxy, J as OAuthProxyConfig, t as OAuthProxyError, O as OAuthSession, K as ProxyDCRClient, R as RefreshRequest, L as TokenMapping, M as TokenRequest, N as TokenResponse, U as UpstreamTokenSet, g as getAuthSession, r as requireAll, e as requireAny, f as requireAuth, h as requireRole, i as requireScopes } from '../OAuthProvider-B_E71LUD.js';
|
|
3
3
|
import 'node:http';
|
|
4
4
|
|
|
5
5
|
/**
|
package/dist/auth/index.js
CHANGED
|
@@ -274,6 +274,7 @@ var DEFAULT_ACCESS_TOKEN_TTL_NO_REFRESH = 31536e3;
|
|
|
274
274
|
var DEFAULT_REFRESH_TOKEN_TTL = 2592e3;
|
|
275
275
|
var DEFAULT_AUTHORIZATION_CODE_TTL = 300;
|
|
276
276
|
var DEFAULT_TRANSACTION_TTL = 600;
|
|
277
|
+
var DEFAULT_UPSTREAM_REQUEST_TIMEOUT_MS = 1e4;
|
|
277
278
|
|
|
278
279
|
// src/auth/utils/claimsExtractor.ts
|
|
279
280
|
var ClaimsExtractor = class {
|
|
@@ -417,7 +418,7 @@ var ClaimsExtractor = class {
|
|
|
417
418
|
};
|
|
418
419
|
|
|
419
420
|
// src/auth/utils/consent.ts
|
|
420
|
-
import { createHmac } from "crypto";
|
|
421
|
+
import { createHmac, timingSafeEqual } from "crypto";
|
|
421
422
|
var ConsentManager = class {
|
|
422
423
|
signingKey;
|
|
423
424
|
constructor(signingKey) {
|
|
@@ -670,7 +671,9 @@ var ConsentManager = class {
|
|
|
670
671
|
}
|
|
671
672
|
const payload = Buffer.from(payloadB64, "base64").toString("utf8");
|
|
672
673
|
const expectedSignature = this.sign(payload);
|
|
673
|
-
|
|
674
|
+
const actualBuf = Buffer.from(signature);
|
|
675
|
+
const expectedBuf = Buffer.from(expectedSignature);
|
|
676
|
+
if (actualBuf.length !== expectedBuf.length || !timingSafeEqual(actualBuf, expectedBuf)) {
|
|
674
677
|
return null;
|
|
675
678
|
}
|
|
676
679
|
const data = JSON.parse(payload);
|
|
@@ -725,7 +728,7 @@ var ConsentManager = class {
|
|
|
725
728
|
};
|
|
726
729
|
|
|
727
730
|
// src/auth/utils/jwtIssuer.ts
|
|
728
|
-
import { createHmac as createHmac2, pbkdf2, randomBytes } from "crypto";
|
|
731
|
+
import { createHmac as createHmac2, pbkdf2, randomBytes, timingSafeEqual as timingSafeEqual2 } from "crypto";
|
|
729
732
|
import { promisify } from "util";
|
|
730
733
|
var pbkdf2Async = promisify(pbkdf2);
|
|
731
734
|
var JWTIssuer = class {
|
|
@@ -802,7 +805,9 @@ var JWTIssuer = class {
|
|
|
802
805
|
}
|
|
803
806
|
const [headerB64, payloadB64, signatureB64] = parts;
|
|
804
807
|
const expectedSignature = this.sign(`${headerB64}.${payloadB64}`);
|
|
805
|
-
|
|
808
|
+
const actualBuf = Buffer.from(signatureB64);
|
|
809
|
+
const expectedBuf = Buffer.from(expectedSignature);
|
|
810
|
+
if (actualBuf.length !== expectedBuf.length || !timingSafeEqual2(actualBuf, expectedBuf)) {
|
|
806
811
|
return {
|
|
807
812
|
error: "Invalid signature",
|
|
808
813
|
valid: false
|
|
@@ -1147,6 +1152,7 @@ var OAuthProxy = class {
|
|
|
1147
1152
|
// Enabled by default for security
|
|
1148
1153
|
redirectPath: "/oauth/callback",
|
|
1149
1154
|
transactionTtl: DEFAULT_TRANSACTION_TTL,
|
|
1155
|
+
upstreamRequestTimeoutMs: DEFAULT_UPSTREAM_REQUEST_TIMEOUT_MS,
|
|
1150
1156
|
upstreamTokenEndpointAuthMethod: "client_secret_basic",
|
|
1151
1157
|
...config
|
|
1152
1158
|
};
|
|
@@ -1591,11 +1597,7 @@ var OAuthProxy = class {
|
|
|
1591
1597
|
if (useBasicAuth) {
|
|
1592
1598
|
headers["Authorization"] = this.getBasicAuthHeader();
|
|
1593
1599
|
}
|
|
1594
|
-
const tokenResponse = await
|
|
1595
|
-
body: new URLSearchParams(bodyParams),
|
|
1596
|
-
headers,
|
|
1597
|
-
method: "POST"
|
|
1598
|
-
});
|
|
1600
|
+
const tokenResponse = await this.fetchUpstream(bodyParams, headers);
|
|
1599
1601
|
if (!tokenResponse.ok) {
|
|
1600
1602
|
let errorCode = "server_error";
|
|
1601
1603
|
let errorDescription;
|
|
@@ -1664,6 +1666,31 @@ var OAuthProxy = class {
|
|
|
1664
1666
|
}
|
|
1665
1667
|
return Object.keys(allClaims).length > 0 ? allClaims : null;
|
|
1666
1668
|
}
|
|
1669
|
+
/**
|
|
1670
|
+
* POST to the upstream token endpoint with a bounded wait.
|
|
1671
|
+
*
|
|
1672
|
+
* Maps an abort of the configured timeout signal to a clean OAuth error
|
|
1673
|
+
* instead of letting the raw `TimeoutError`/`AbortError` propagate.
|
|
1674
|
+
*/
|
|
1675
|
+
async fetchUpstream(bodyParams, headers) {
|
|
1676
|
+
let tokenResponse;
|
|
1677
|
+
try {
|
|
1678
|
+
tokenResponse = await fetch(this.config.upstreamTokenEndpoint, {
|
|
1679
|
+
body: new URLSearchParams(bodyParams),
|
|
1680
|
+
headers,
|
|
1681
|
+
method: "POST",
|
|
1682
|
+
signal: AbortSignal.timeout(
|
|
1683
|
+
this.config.upstreamRequestTimeoutMs ?? DEFAULT_UPSTREAM_REQUEST_TIMEOUT_MS
|
|
1684
|
+
)
|
|
1685
|
+
});
|
|
1686
|
+
} catch (error) {
|
|
1687
|
+
if (error instanceof Error && (error.name === "AbortError" || error.name === "TimeoutError")) {
|
|
1688
|
+
throw new OAuthProxyError("server_error", "Upstream request timed out");
|
|
1689
|
+
}
|
|
1690
|
+
throw error;
|
|
1691
|
+
}
|
|
1692
|
+
return tokenResponse;
|
|
1693
|
+
}
|
|
1667
1694
|
/**
|
|
1668
1695
|
* Generate authorization code for client
|
|
1669
1696
|
*/
|
|
@@ -1734,11 +1761,7 @@ var OAuthProxy = class {
|
|
|
1734
1761
|
if (useBasicAuth) {
|
|
1735
1762
|
headers["Authorization"] = this.getBasicAuthHeader();
|
|
1736
1763
|
}
|
|
1737
|
-
const tokenResponse = await
|
|
1738
|
-
body: new URLSearchParams(bodyParams),
|
|
1739
|
-
headers,
|
|
1740
|
-
method: "POST"
|
|
1741
|
-
});
|
|
1764
|
+
const tokenResponse = await this.fetchUpstream(bodyParams, headers);
|
|
1742
1765
|
if (!tokenResponse.ok) {
|
|
1743
1766
|
let errorCode = "invalid_grant";
|
|
1744
1767
|
let errorDescription;
|
|
@@ -2060,11 +2083,7 @@ var OAuthProxy = class {
|
|
|
2060
2083
|
if (useBasicAuth) {
|
|
2061
2084
|
headers["Authorization"] = this.getBasicAuthHeader();
|
|
2062
2085
|
}
|
|
2063
|
-
const tokenResponse = await
|
|
2064
|
-
body: new URLSearchParams(bodyParams),
|
|
2065
|
-
headers,
|
|
2066
|
-
method: "POST"
|
|
2067
|
-
});
|
|
2086
|
+
const tokenResponse = await this.fetchUpstream(bodyParams, headers);
|
|
2068
2087
|
if (!tokenResponse.ok) {
|
|
2069
2088
|
let errorCode = "invalid_grant";
|
|
2070
2089
|
let errorDescription = "Upstream refresh failed";
|
|
@@ -2619,15 +2638,15 @@ var JWKSVerifier = class {
|
|
|
2619
2638
|
verifyOptions
|
|
2620
2639
|
);
|
|
2621
2640
|
const claims = {
|
|
2641
|
+
...payload,
|
|
2642
|
+
// Include all other claims
|
|
2622
2643
|
aud: payload.aud,
|
|
2623
2644
|
client_id: payload.client_id || payload.sub,
|
|
2624
2645
|
exp: payload.exp,
|
|
2625
2646
|
iat: payload.iat,
|
|
2626
2647
|
iss: payload.iss,
|
|
2627
2648
|
jti: payload.jti || "",
|
|
2628
|
-
scope: this.parseScope(payload.scope)
|
|
2629
|
-
...payload
|
|
2630
|
-
// Include all other claims
|
|
2649
|
+
scope: this.parseScope(payload.scope)
|
|
2631
2650
|
};
|
|
2632
2651
|
return {
|
|
2633
2652
|
claims,
|
|
@@ -2714,4 +2733,4 @@ export {
|
|
|
2714
2733
|
DiskStore,
|
|
2715
2734
|
JWKSVerifier
|
|
2716
2735
|
};
|
|
2717
|
-
//# sourceMappingURL=chunk-
|
|
2736
|
+
//# sourceMappingURL=chunk-2ZFQSPXZ.js.map
|