@samanhappy/mcphub 0.10.3 → 0.10.4
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/README.md +39 -1
- package/dist/config/index.js +24 -0
- package/dist/config/index.js.map +1 -1
- package/dist/constants/oauthServerDefaults.js +36 -0
- package/dist/constants/oauthServerDefaults.js.map +1 -0
- package/dist/controllers/oauthClientController.js +252 -0
- package/dist/controllers/oauthClientController.js.map +1 -0
- package/dist/controllers/oauthDynamicRegistrationController.js +479 -0
- package/dist/controllers/oauthDynamicRegistrationController.js.map +1 -0
- package/dist/controllers/oauthServerController.js +449 -0
- package/dist/controllers/oauthServerController.js.map +1 -0
- package/dist/controllers/openApiController.js +6 -3
- package/dist/controllers/openApiController.js.map +1 -1
- package/dist/controllers/serverController.js +116 -23
- package/dist/controllers/serverController.js.map +1 -1
- package/dist/middlewares/auth.js +23 -2
- package/dist/middlewares/auth.js.map +1 -1
- package/dist/middlewares/userContext.js +27 -11
- package/dist/middlewares/userContext.js.map +1 -1
- package/dist/models/OAuth.js +291 -0
- package/dist/models/OAuth.js.map +1 -0
- package/dist/routes/index.js +25 -0
- package/dist/routes/index.js.map +1 -1
- package/dist/server.js +4 -1
- package/dist/server.js.map +1 -1
- package/dist/services/dataServicex.js +3 -0
- package/dist/services/dataServicex.js.map +1 -1
- package/dist/services/oauthServerService.js +339 -0
- package/dist/services/oauthServerService.js.map +1 -0
- package/dist/services/sseService.js +368 -45
- package/dist/services/sseService.js.map +1 -1
- package/dist/utils/oauthBearer.js +35 -0
- package/dist/utils/oauthBearer.js.map +1 -0
- package/frontend/dist/assets/index-D-WhIyV-.js +251 -0
- package/frontend/dist/assets/index-D-WhIyV-.js.map +1 -0
- package/frontend/dist/index.html +1 -1
- package/mcp_settings.json +111 -0
- package/package.json +2 -1
- package/frontend/dist/assets/index-BpPaTvxv.js +0 -251
- package/frontend/dist/assets/index-BpPaTvxv.js.map +0 -1
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
import OAuth2Server from '@node-oauth/oauth2-server';
|
|
2
|
+
import { loadSettings } from '../config/index.js';
|
|
3
|
+
import { findUserByUsername, verifyPassword } from '../models/User.js';
|
|
4
|
+
import { findOAuthClientById, saveAuthorizationCode, getAuthorizationCode, revokeAuthorizationCode, saveToken, getToken, revokeToken, } from '../models/OAuth.js';
|
|
5
|
+
import crypto from 'crypto';
|
|
6
|
+
const { Request, Response } = OAuth2Server;
|
|
7
|
+
// OAuth2Server model implementation
|
|
8
|
+
const oauthModel = {
|
|
9
|
+
/**
|
|
10
|
+
* Get client by client ID
|
|
11
|
+
*/
|
|
12
|
+
getClient: async (clientId, clientSecret) => {
|
|
13
|
+
const client = findOAuthClientById(clientId);
|
|
14
|
+
if (!client) {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
// If client secret is provided, verify it
|
|
18
|
+
if (clientSecret && client.clientSecret) {
|
|
19
|
+
if (client.clientSecret !== clientSecret) {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return {
|
|
24
|
+
id: client.clientId,
|
|
25
|
+
clientId: client.clientId,
|
|
26
|
+
clientSecret: client.clientSecret,
|
|
27
|
+
redirectUris: client.redirectUris,
|
|
28
|
+
grants: client.grants,
|
|
29
|
+
};
|
|
30
|
+
},
|
|
31
|
+
/**
|
|
32
|
+
* Save authorization code
|
|
33
|
+
*/
|
|
34
|
+
saveAuthorizationCode: async (code, client, user) => {
|
|
35
|
+
const settings = loadSettings();
|
|
36
|
+
const oauthConfig = settings.systemConfig?.oauthServer;
|
|
37
|
+
const lifetime = oauthConfig?.authorizationCodeLifetime || 300;
|
|
38
|
+
const scopeString = Array.isArray(code.scope) ? code.scope.join(' ') : code.scope;
|
|
39
|
+
const authCode = saveAuthorizationCode({
|
|
40
|
+
redirectUri: code.redirectUri,
|
|
41
|
+
scope: scopeString,
|
|
42
|
+
clientId: client.id,
|
|
43
|
+
username: user.username,
|
|
44
|
+
codeChallenge: code.codeChallenge,
|
|
45
|
+
codeChallengeMethod: code.codeChallengeMethod,
|
|
46
|
+
}, lifetime);
|
|
47
|
+
return {
|
|
48
|
+
authorizationCode: authCode,
|
|
49
|
+
expiresAt: new Date(Date.now() + lifetime * 1000),
|
|
50
|
+
redirectUri: code.redirectUri,
|
|
51
|
+
scope: code.scope,
|
|
52
|
+
client,
|
|
53
|
+
user: {
|
|
54
|
+
username: user.username,
|
|
55
|
+
},
|
|
56
|
+
codeChallenge: code.codeChallenge,
|
|
57
|
+
codeChallengeMethod: code.codeChallengeMethod,
|
|
58
|
+
};
|
|
59
|
+
},
|
|
60
|
+
/**
|
|
61
|
+
* Get authorization code
|
|
62
|
+
*/
|
|
63
|
+
getAuthorizationCode: async (authorizationCode) => {
|
|
64
|
+
const code = getAuthorizationCode(authorizationCode);
|
|
65
|
+
if (!code) {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
const client = findOAuthClientById(code.clientId);
|
|
69
|
+
if (!client) {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
const scopeArray = code.scope ? code.scope.split(' ') : undefined;
|
|
73
|
+
return {
|
|
74
|
+
authorizationCode: code.code,
|
|
75
|
+
expiresAt: code.expiresAt,
|
|
76
|
+
redirectUri: code.redirectUri,
|
|
77
|
+
scope: scopeArray,
|
|
78
|
+
client: {
|
|
79
|
+
id: client.clientId,
|
|
80
|
+
clientId: client.clientId,
|
|
81
|
+
clientSecret: client.clientSecret,
|
|
82
|
+
redirectUris: client.redirectUris,
|
|
83
|
+
grants: client.grants,
|
|
84
|
+
},
|
|
85
|
+
user: {
|
|
86
|
+
username: code.username,
|
|
87
|
+
},
|
|
88
|
+
codeChallenge: code.codeChallenge,
|
|
89
|
+
codeChallengeMethod: code.codeChallengeMethod,
|
|
90
|
+
};
|
|
91
|
+
},
|
|
92
|
+
/**
|
|
93
|
+
* Revoke authorization code
|
|
94
|
+
*/
|
|
95
|
+
revokeAuthorizationCode: async (code) => {
|
|
96
|
+
revokeAuthorizationCode(code.authorizationCode);
|
|
97
|
+
return true;
|
|
98
|
+
},
|
|
99
|
+
/**
|
|
100
|
+
* Save access token and refresh token
|
|
101
|
+
*/
|
|
102
|
+
saveToken: async (token, client, user) => {
|
|
103
|
+
const settings = loadSettings();
|
|
104
|
+
const oauthConfig = settings.systemConfig?.oauthServer;
|
|
105
|
+
const accessTokenLifetime = oauthConfig?.accessTokenLifetime || 3600;
|
|
106
|
+
const refreshTokenLifetime = oauthConfig?.refreshTokenLifetime || 1209600;
|
|
107
|
+
const scopeString = Array.isArray(token.scope) ? token.scope.join(' ') : token.scope;
|
|
108
|
+
const savedToken = saveToken({
|
|
109
|
+
scope: scopeString,
|
|
110
|
+
clientId: client.id,
|
|
111
|
+
username: user.username,
|
|
112
|
+
}, accessTokenLifetime, refreshTokenLifetime);
|
|
113
|
+
const scopeArray = savedToken.scope ? savedToken.scope.split(' ') : undefined;
|
|
114
|
+
return {
|
|
115
|
+
accessToken: savedToken.accessToken,
|
|
116
|
+
accessTokenExpiresAt: savedToken.accessTokenExpiresAt,
|
|
117
|
+
refreshToken: savedToken.refreshToken,
|
|
118
|
+
refreshTokenExpiresAt: savedToken.refreshTokenExpiresAt,
|
|
119
|
+
scope: scopeArray,
|
|
120
|
+
client,
|
|
121
|
+
user: {
|
|
122
|
+
username: user.username,
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
},
|
|
126
|
+
/**
|
|
127
|
+
* Get access token
|
|
128
|
+
*/
|
|
129
|
+
getAccessToken: async (accessToken) => {
|
|
130
|
+
const token = getToken(accessToken);
|
|
131
|
+
if (!token) {
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
const client = findOAuthClientById(token.clientId);
|
|
135
|
+
if (!client) {
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
const scopeArray = token.scope ? token.scope.split(' ') : undefined;
|
|
139
|
+
return {
|
|
140
|
+
accessToken: token.accessToken,
|
|
141
|
+
accessTokenExpiresAt: token.accessTokenExpiresAt,
|
|
142
|
+
scope: scopeArray,
|
|
143
|
+
client: {
|
|
144
|
+
id: client.clientId,
|
|
145
|
+
clientId: client.clientId,
|
|
146
|
+
clientSecret: client.clientSecret,
|
|
147
|
+
redirectUris: client.redirectUris,
|
|
148
|
+
grants: client.grants,
|
|
149
|
+
},
|
|
150
|
+
user: {
|
|
151
|
+
username: token.username,
|
|
152
|
+
},
|
|
153
|
+
};
|
|
154
|
+
},
|
|
155
|
+
/**
|
|
156
|
+
* Get refresh token
|
|
157
|
+
*/
|
|
158
|
+
getRefreshToken: async (refreshToken) => {
|
|
159
|
+
const token = getToken(refreshToken);
|
|
160
|
+
if (!token || token.refreshToken !== refreshToken) {
|
|
161
|
+
return false;
|
|
162
|
+
}
|
|
163
|
+
const client = findOAuthClientById(token.clientId);
|
|
164
|
+
if (!client) {
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
const scopeArray = token.scope ? token.scope.split(' ') : undefined;
|
|
168
|
+
return {
|
|
169
|
+
refreshToken: token.refreshToken,
|
|
170
|
+
refreshTokenExpiresAt: token.refreshTokenExpiresAt,
|
|
171
|
+
scope: scopeArray,
|
|
172
|
+
client: {
|
|
173
|
+
id: client.clientId,
|
|
174
|
+
clientId: client.clientId,
|
|
175
|
+
clientSecret: client.clientSecret,
|
|
176
|
+
redirectUris: client.redirectUris,
|
|
177
|
+
grants: client.grants,
|
|
178
|
+
},
|
|
179
|
+
user: {
|
|
180
|
+
username: token.username,
|
|
181
|
+
},
|
|
182
|
+
};
|
|
183
|
+
},
|
|
184
|
+
/**
|
|
185
|
+
* Revoke token
|
|
186
|
+
*/
|
|
187
|
+
revokeToken: async (token) => {
|
|
188
|
+
const refreshToken = 'refreshToken' in token ? token.refreshToken : undefined;
|
|
189
|
+
if (refreshToken) {
|
|
190
|
+
revokeToken(refreshToken);
|
|
191
|
+
}
|
|
192
|
+
return true;
|
|
193
|
+
},
|
|
194
|
+
/**
|
|
195
|
+
* Verify scope
|
|
196
|
+
*/
|
|
197
|
+
verifyScope: async (token, scope) => {
|
|
198
|
+
if (!token.scope) {
|
|
199
|
+
return false;
|
|
200
|
+
}
|
|
201
|
+
const requestedScopes = Array.isArray(scope) ? scope : scope.split(' ');
|
|
202
|
+
const tokenScopes = Array.isArray(token.scope) ? token.scope : token.scope.split(' ');
|
|
203
|
+
return requestedScopes.every((s) => tokenScopes.includes(s));
|
|
204
|
+
},
|
|
205
|
+
/**
|
|
206
|
+
* Validate scope
|
|
207
|
+
*/
|
|
208
|
+
validateScope: async (user, client, scope) => {
|
|
209
|
+
const settings = loadSettings();
|
|
210
|
+
const oauthConfig = settings.systemConfig?.oauthServer;
|
|
211
|
+
const allowedScopes = oauthConfig?.allowedScopes || ['read', 'write'];
|
|
212
|
+
if (!scope || scope.length === 0) {
|
|
213
|
+
return allowedScopes;
|
|
214
|
+
}
|
|
215
|
+
const validScopes = scope.filter((s) => allowedScopes.includes(s));
|
|
216
|
+
return validScopes.length > 0 ? validScopes : false;
|
|
217
|
+
},
|
|
218
|
+
};
|
|
219
|
+
// Create OAuth2 server instance
|
|
220
|
+
let oauth = null;
|
|
221
|
+
/**
|
|
222
|
+
* Initialize OAuth server
|
|
223
|
+
*/
|
|
224
|
+
export const initOAuthServer = () => {
|
|
225
|
+
const settings = loadSettings();
|
|
226
|
+
const oauthConfig = settings.systemConfig?.oauthServer;
|
|
227
|
+
const requireState = oauthConfig?.requireState === true;
|
|
228
|
+
if (!oauthConfig || !oauthConfig.enabled) {
|
|
229
|
+
console.log('OAuth authorization server is disabled or not configured');
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
try {
|
|
233
|
+
oauth = new OAuth2Server({
|
|
234
|
+
model: oauthModel,
|
|
235
|
+
accessTokenLifetime: oauthConfig.accessTokenLifetime || 3600,
|
|
236
|
+
refreshTokenLifetime: oauthConfig.refreshTokenLifetime || 1209600,
|
|
237
|
+
authorizationCodeLifetime: oauthConfig.authorizationCodeLifetime || 300,
|
|
238
|
+
allowEmptyState: !requireState,
|
|
239
|
+
allowBearerTokensInQueryString: false,
|
|
240
|
+
// When requireClientSecret is false, allow PKCE without client secret
|
|
241
|
+
requireClientAuthentication: oauthConfig.requireClientSecret
|
|
242
|
+
? { authorization_code: true, refresh_token: true }
|
|
243
|
+
: { authorization_code: false, refresh_token: false },
|
|
244
|
+
});
|
|
245
|
+
console.log('OAuth authorization server initialized successfully');
|
|
246
|
+
}
|
|
247
|
+
catch (error) {
|
|
248
|
+
console.error('Failed to initialize OAuth authorization server:', error);
|
|
249
|
+
oauth = null;
|
|
250
|
+
}
|
|
251
|
+
};
|
|
252
|
+
/**
|
|
253
|
+
* Get OAuth server instance
|
|
254
|
+
*/
|
|
255
|
+
export const getOAuthServer = () => {
|
|
256
|
+
return oauth;
|
|
257
|
+
};
|
|
258
|
+
/**
|
|
259
|
+
* Check if OAuth server is enabled
|
|
260
|
+
*/
|
|
261
|
+
export const isOAuthServerEnabled = () => {
|
|
262
|
+
return oauth !== null;
|
|
263
|
+
};
|
|
264
|
+
/**
|
|
265
|
+
* Authenticate user for OAuth authorization
|
|
266
|
+
*/
|
|
267
|
+
export const authenticateUser = async (username, password) => {
|
|
268
|
+
const user = findUserByUsername(username);
|
|
269
|
+
if (!user) {
|
|
270
|
+
return null;
|
|
271
|
+
}
|
|
272
|
+
const isValid = await verifyPassword(password, user.password);
|
|
273
|
+
if (!isValid) {
|
|
274
|
+
return null;
|
|
275
|
+
}
|
|
276
|
+
return {
|
|
277
|
+
username: user.username,
|
|
278
|
+
isAdmin: user.isAdmin,
|
|
279
|
+
};
|
|
280
|
+
};
|
|
281
|
+
/**
|
|
282
|
+
* Generate PKCE code verifier
|
|
283
|
+
*/
|
|
284
|
+
export const generateCodeVerifier = () => {
|
|
285
|
+
return crypto.randomBytes(32).toString('base64url');
|
|
286
|
+
};
|
|
287
|
+
/**
|
|
288
|
+
* Generate PKCE code challenge from verifier
|
|
289
|
+
*/
|
|
290
|
+
export const generateCodeChallenge = (verifier) => {
|
|
291
|
+
return crypto.createHash('sha256').update(verifier).digest('base64url');
|
|
292
|
+
};
|
|
293
|
+
/**
|
|
294
|
+
* Verify PKCE code challenge
|
|
295
|
+
*/
|
|
296
|
+
export const verifyCodeChallenge = (verifier, challenge, method = 'S256') => {
|
|
297
|
+
if (method === 'plain') {
|
|
298
|
+
return verifier === challenge;
|
|
299
|
+
}
|
|
300
|
+
if (method === 'S256') {
|
|
301
|
+
const computed = generateCodeChallenge(verifier);
|
|
302
|
+
return computed === challenge;
|
|
303
|
+
}
|
|
304
|
+
return false;
|
|
305
|
+
};
|
|
306
|
+
/**
|
|
307
|
+
* Handle OAuth authorize request
|
|
308
|
+
*/
|
|
309
|
+
export const handleAuthorizeRequest = async (req, res) => {
|
|
310
|
+
if (!oauth) {
|
|
311
|
+
throw new Error('OAuth server not initialized');
|
|
312
|
+
}
|
|
313
|
+
const request = new Request(req);
|
|
314
|
+
const response = new Response(res);
|
|
315
|
+
return await oauth.authorize(request, response);
|
|
316
|
+
};
|
|
317
|
+
/**
|
|
318
|
+
* Handle OAuth token request
|
|
319
|
+
*/
|
|
320
|
+
export const handleTokenRequest = async (req, res) => {
|
|
321
|
+
if (!oauth) {
|
|
322
|
+
throw new Error('OAuth server not initialized');
|
|
323
|
+
}
|
|
324
|
+
const request = new Request(req);
|
|
325
|
+
const response = new Response(res);
|
|
326
|
+
return await oauth.token(request, response);
|
|
327
|
+
};
|
|
328
|
+
/**
|
|
329
|
+
* Handle OAuth authenticate request (validate access token)
|
|
330
|
+
*/
|
|
331
|
+
export const handleAuthenticateRequest = async (req, res) => {
|
|
332
|
+
if (!oauth) {
|
|
333
|
+
throw new Error('OAuth server not initialized');
|
|
334
|
+
}
|
|
335
|
+
const request = new Request(req);
|
|
336
|
+
const response = new Response(res);
|
|
337
|
+
return await oauth.authenticate(request, response);
|
|
338
|
+
};
|
|
339
|
+
//# sourceMappingURL=oauthServerService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauthServerService.js","sourceRoot":"","sources":["../../src/services/oauthServerService.ts"],"names":[],"mappings":"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"}
|