mcp-user-system 2.0.6 → 2.1.1
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/env.d.ts +0 -2
- package/dist/env.js +1 -19
- package/dist/env.js.map +1 -1
- package/dist/index.js +1 -12
- package/dist/index.js.map +1 -1
- package/dist/tools/auth.d.ts +24 -30
- package/dist/tools/auth.js +75 -58
- package/dist/tools/auth.js.map +1 -1
- package/dist/tools/client.d.ts +5 -0
- package/dist/tools/client.js +127 -151
- package/dist/tools/client.js.map +1 -1
- package/package.json +1 -1
package/dist/env.d.ts
CHANGED
package/dist/env.js
CHANGED
|
@@ -1,30 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Environment variable loader for mcp-user-system.
|
|
3
3
|
*/
|
|
4
|
-
function requireEnv(name) {
|
|
5
|
-
const value = process.env[name];
|
|
6
|
-
if (!value) {
|
|
7
|
-
throw new Error(`Missing required environment variable: ${name}`);
|
|
8
|
-
}
|
|
9
|
-
return value;
|
|
10
|
-
}
|
|
11
|
-
function optionalEnv(name) {
|
|
12
|
-
return process.env[name] || undefined;
|
|
13
|
-
}
|
|
14
4
|
export function loadConfig() {
|
|
15
|
-
const accessToken = optionalEnv("TUS_ACCESS_TOKEN");
|
|
16
|
-
const username = optionalEnv("TUS_USERNAME");
|
|
17
|
-
const password = optionalEnv("TUS_PASSWORD");
|
|
18
|
-
if (!accessToken && (!username || !password)) {
|
|
19
|
-
process.stderr.write("[MCP] Warning: No auth configured. Use the 'login' tool to authenticate, or set TUS_ACCESS_TOKEN / TUS_USERNAME+TUS_PASSWORD.\n");
|
|
20
|
-
}
|
|
21
|
-
// 默认 http://localhost:7081,防止环境变量未正确传入时 baseUrl 为 "null"
|
|
22
5
|
const baseUrl = process.env["TUS_BASE_URL"] || "https://models.ipsunion.com/prod-api";
|
|
6
|
+
const accessToken = process.env["TUS_ACCESS_TOKEN"] || undefined;
|
|
23
7
|
return {
|
|
24
8
|
baseUrl,
|
|
25
9
|
accessToken,
|
|
26
|
-
username,
|
|
27
|
-
password,
|
|
28
10
|
};
|
|
29
11
|
}
|
|
30
12
|
//# sourceMappingURL=env.js.map
|
package/dist/env.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,MAAM,UAAU,UAAU;IACxB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,sCAAsC,CAAC;IACtF,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,SAAS,CAAC;IAEjE,OAAO;QACL,OAAO;QACP,WAAW;KACZ,CAAC;AACJ,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -30,7 +30,7 @@ const allTools = [
|
|
|
30
30
|
// ── MCP Server Setup ──
|
|
31
31
|
const server = new Server({
|
|
32
32
|
name: "mcp-user-system",
|
|
33
|
-
version: "2.0
|
|
33
|
+
version: "2.1.0",
|
|
34
34
|
}, {
|
|
35
35
|
capabilities: {
|
|
36
36
|
tools: {},
|
|
@@ -83,17 +83,6 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
83
83
|
});
|
|
84
84
|
// ── Start Server ──
|
|
85
85
|
async function main() {
|
|
86
|
-
// 尝试自动登录(配置了用户名密码但没有 token 时)
|
|
87
|
-
try {
|
|
88
|
-
const loggedIn = await authTools.tryAutoLogin();
|
|
89
|
-
if (loggedIn) {
|
|
90
|
-
console.error("Auto-login successful using TUS_USERNAME/TUS_PASSWORD");
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
catch (err) {
|
|
94
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
95
|
-
console.error(`Auto-login failed: ${message}`);
|
|
96
|
-
}
|
|
97
86
|
const transport = new StdioServerTransport();
|
|
98
87
|
await server.connect(transport);
|
|
99
88
|
console.error("mcp-user-system server running on stdio");
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/auth.d.ts
CHANGED
|
@@ -1,4 +1,18 @@
|
|
|
1
1
|
export declare const tools: ({
|
|
2
|
+
name: string;
|
|
3
|
+
description: string;
|
|
4
|
+
inputSchema: {
|
|
5
|
+
type: "object";
|
|
6
|
+
properties: {
|
|
7
|
+
username?: undefined;
|
|
8
|
+
password?: undefined;
|
|
9
|
+
captchaCode?: undefined;
|
|
10
|
+
uuid?: undefined;
|
|
11
|
+
token?: undefined;
|
|
12
|
+
};
|
|
13
|
+
required: never[];
|
|
14
|
+
};
|
|
15
|
+
} | {
|
|
2
16
|
name: string;
|
|
3
17
|
description: string;
|
|
4
18
|
inputSchema: {
|
|
@@ -12,6 +26,14 @@ export declare const tools: ({
|
|
|
12
26
|
type: string;
|
|
13
27
|
description: string;
|
|
14
28
|
};
|
|
29
|
+
captchaCode: {
|
|
30
|
+
type: string;
|
|
31
|
+
description: string;
|
|
32
|
+
};
|
|
33
|
+
uuid: {
|
|
34
|
+
type: string;
|
|
35
|
+
description: string;
|
|
36
|
+
};
|
|
15
37
|
token?: undefined;
|
|
16
38
|
};
|
|
17
39
|
required: string[];
|
|
@@ -28,38 +50,10 @@ export declare const tools: ({
|
|
|
28
50
|
};
|
|
29
51
|
username?: undefined;
|
|
30
52
|
password?: undefined;
|
|
53
|
+
captchaCode?: undefined;
|
|
54
|
+
uuid?: undefined;
|
|
31
55
|
};
|
|
32
56
|
required: string[];
|
|
33
57
|
};
|
|
34
|
-
} | {
|
|
35
|
-
name: string;
|
|
36
|
-
description: string;
|
|
37
|
-
inputSchema: {
|
|
38
|
-
type: "object";
|
|
39
|
-
properties: {
|
|
40
|
-
username?: undefined;
|
|
41
|
-
password?: undefined;
|
|
42
|
-
token?: undefined;
|
|
43
|
-
};
|
|
44
|
-
required: never[];
|
|
45
|
-
};
|
|
46
58
|
})[];
|
|
47
59
|
export declare function handle(name: string, args: Record<string, string>): Promise<unknown>;
|
|
48
|
-
/**
|
|
49
|
-
* 执行密码登录
|
|
50
|
-
* POST /console/user/login
|
|
51
|
-
* 前端 request 拦截器会将整个 JSON body AES 加密后以 { data: "<base64>" } 发送,
|
|
52
|
-
* 后端有对应的解密过滤器还原原始 body。MCP 需模拟相同行为。
|
|
53
|
-
* 响应格式: { code: 200, msg: "操作成功", token: "eyJ..." }
|
|
54
|
-
*/
|
|
55
|
-
export declare function doLogin(username: string, password: string): Promise<unknown>;
|
|
56
|
-
/**
|
|
57
|
-
* 尝试使用环境变量中的用户名密码自动登录
|
|
58
|
-
* 返回 true 表示登录成功,false 表示跳过(无凭据或已有 token)
|
|
59
|
-
*/
|
|
60
|
-
export declare function tryAutoLogin(): Promise<boolean>;
|
|
61
|
-
/**
|
|
62
|
-
* 强制使用环境变量中的用户名密码重新登录(用于 token 失效后的自动恢复)
|
|
63
|
-
* 返回 true 表示登录成功,false 表示无法重试(未配置凭据)
|
|
64
|
-
*/
|
|
65
|
-
export declare function tryRelogin(): Promise<boolean>;
|
package/dist/tools/auth.js
CHANGED
|
@@ -1,25 +1,41 @@
|
|
|
1
|
-
import { apiPostRaw, setToken, getToken } from "./client.js";
|
|
1
|
+
import { apiGetRaw, apiPostRaw, setToken, getToken } from "./client.js";
|
|
2
2
|
import { loadConfig } from "../env.js";
|
|
3
3
|
import { aesEncrypt } from "./crypto.js";
|
|
4
|
+
import * as fs from "fs";
|
|
5
|
+
import * as path from "path";
|
|
6
|
+
import * as os from "os";
|
|
4
7
|
// ---- 工具定义 ----
|
|
5
8
|
export const tools = [
|
|
9
|
+
{
|
|
10
|
+
name: "fetch_captcha",
|
|
11
|
+
description: "获取图形验证码。返回验证码图片路径和 uuid。" +
|
|
12
|
+
"调用后请用 Read 工具查看图片内容(通常是简单的数学计算题),算出答案后调用 login 工具登录。",
|
|
13
|
+
inputSchema: {
|
|
14
|
+
type: "object",
|
|
15
|
+
properties: {},
|
|
16
|
+
required: [],
|
|
17
|
+
},
|
|
18
|
+
},
|
|
6
19
|
{
|
|
7
20
|
name: "login",
|
|
8
|
-
description: "
|
|
21
|
+
description: "使用用户名、密码和验证码登录系统。" +
|
|
22
|
+
"需先调用 fetch_captcha 获取 uuid,再识别验证码图片得出答案后调用此工具。" +
|
|
9
23
|
"登录成功后后续请求将自动使用该令牌。",
|
|
10
24
|
inputSchema: {
|
|
11
25
|
type: "object",
|
|
12
26
|
properties: {
|
|
13
27
|
username: { type: "string", description: "用户名或手机号" },
|
|
14
28
|
password: { type: "string", description: "密码" },
|
|
29
|
+
captchaCode: { type: "string", description: "验证码计算结果(如数学题 3+5=? 则填 8)" },
|
|
30
|
+
uuid: { type: "string", description: "验证码对应的 uuid(来自 fetch_captcha)" },
|
|
15
31
|
},
|
|
16
|
-
required: ["username", "password"],
|
|
32
|
+
required: ["username", "password", "captchaCode", "uuid"],
|
|
17
33
|
},
|
|
18
34
|
},
|
|
19
35
|
{
|
|
20
36
|
name: "set_access_token",
|
|
21
|
-
description: "
|
|
22
|
-
"适用于已有 token
|
|
37
|
+
description: "直接设置或更新访问令牌(JWT token)。" +
|
|
38
|
+
"适用于已有 token 的场景,token 失效时可随时调用此工具更新,无需重启服务。",
|
|
23
39
|
inputSchema: {
|
|
24
40
|
type: "object",
|
|
25
41
|
properties: {
|
|
@@ -30,7 +46,7 @@ export const tools = [
|
|
|
30
46
|
},
|
|
31
47
|
{
|
|
32
48
|
name: "get_token_status",
|
|
33
|
-
description: "
|
|
49
|
+
description: "查看当前认证状态(是否已设置 token、token 来源)",
|
|
34
50
|
inputSchema: {
|
|
35
51
|
type: "object",
|
|
36
52
|
properties: {},
|
|
@@ -41,8 +57,10 @@ export const tools = [
|
|
|
41
57
|
// ---- 处理函数 ----
|
|
42
58
|
export async function handle(name, args) {
|
|
43
59
|
switch (name) {
|
|
60
|
+
case "fetch_captcha":
|
|
61
|
+
return doFetchCaptcha();
|
|
44
62
|
case "login":
|
|
45
|
-
return doLogin(args.username, args.password);
|
|
63
|
+
return doLogin(args.username, args.password, args.captchaCode, args.uuid);
|
|
46
64
|
case "set_access_token":
|
|
47
65
|
return doSetToken(args.token);
|
|
48
66
|
case "get_token_status":
|
|
@@ -53,35 +71,64 @@ export async function handle(name, args) {
|
|
|
53
71
|
}
|
|
54
72
|
// ---- 内部函数 ----
|
|
55
73
|
/**
|
|
56
|
-
*
|
|
74
|
+
* 获取图形验证码
|
|
75
|
+
* GET /captchaImage → { code: 200, captchaEnabled: true, uuid: "...", img: "<base64>" }
|
|
76
|
+
* 将 base64 图片保存到临时文件,返回文件路径和 uuid
|
|
77
|
+
*/
|
|
78
|
+
async function doFetchCaptcha() {
|
|
79
|
+
const response = await apiGetRaw("/captchaImage");
|
|
80
|
+
const captchaEnabled = response.captchaEnabled;
|
|
81
|
+
if (!captchaEnabled) {
|
|
82
|
+
return {
|
|
83
|
+
captchaEnabled: false,
|
|
84
|
+
message: "验证码未启用,可直接调用 login 工具登录(captchaCode 和 uuid 传空字符串)",
|
|
85
|
+
uuid: "",
|
|
86
|
+
imagePath: "",
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
const img = response.img;
|
|
90
|
+
const uuid = response.uuid;
|
|
91
|
+
if (!img || !uuid) {
|
|
92
|
+
throw new Error("验证码接口返回数据异常:缺少 img 或 uuid 字段");
|
|
93
|
+
}
|
|
94
|
+
// 将 base64 图片保存到临时文件
|
|
95
|
+
const tmpDir = os.tmpdir();
|
|
96
|
+
const tmpFile = path.join(tmpDir, `captcha_${uuid}.jpg`);
|
|
97
|
+
fs.writeFileSync(tmpFile, Buffer.from(img, "base64"));
|
|
98
|
+
return {
|
|
99
|
+
captchaEnabled: true,
|
|
100
|
+
uuid,
|
|
101
|
+
imagePath: tmpFile,
|
|
102
|
+
message: "验证码已获取,请用 Read 工具查看图片内容,识别数学算式并计算结果,然后调用 login 工具登录",
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* 执行密码登录(含验证码)
|
|
57
107
|
* POST /console/user/login
|
|
58
|
-
* 前端 request 拦截器会将整个 JSON body AES 加密后以 { data: "<base64>" }
|
|
59
|
-
* 后端有对应的解密过滤器还原原始 body。MCP 需模拟相同行为。
|
|
60
|
-
* 响应格式: { code: 200, msg: "操作成功", token: "eyJ..." }
|
|
108
|
+
* 前端 request 拦截器会将整个 JSON body AES 加密后以 { data: "<base64>" } 发送
|
|
61
109
|
*/
|
|
62
|
-
|
|
110
|
+
async function doLogin(username, password, captchaCode, uuid) {
|
|
63
111
|
// 构造原始请求体(与前端登录组件一致)
|
|
64
|
-
const plainBody = {
|
|
112
|
+
const plainBody = {
|
|
113
|
+
username,
|
|
114
|
+
password,
|
|
115
|
+
code: captchaCode,
|
|
116
|
+
uuid: uuid || "",
|
|
117
|
+
loginSms: false,
|
|
118
|
+
};
|
|
65
119
|
// AES-128-CBC 加密整个 JSON body → Base64
|
|
66
120
|
const encryptedData = aesEncrypt(JSON.stringify(plainBody));
|
|
67
|
-
// 以 { data: "<encrypted>" }
|
|
121
|
+
// 以 { data: "<encrypted>" } 格式发送
|
|
68
122
|
const response = await apiPostRaw("/console/user/login", { data: encryptedData });
|
|
69
|
-
// Debug: 打印完整后端响应
|
|
70
|
-
if (process.env.TUS_DEBUG) {
|
|
71
|
-
console.error("[MCP-DEBUG] login 响应:", JSON.stringify(response).slice(0, 1000));
|
|
72
|
-
}
|
|
73
|
-
// 兼容多种响应格式:
|
|
74
|
-
// 格式1: { code: 200, msg: "操作成功", token: "eyJ..." } (AjaxResult.put)
|
|
75
|
-
// 格式2: { code: 200, msg: "操作成功", data: { token: "eyJ..." } }
|
|
76
|
-
// 格式3: { code: 200, data: "eyJ..." } (token 直接作为 data)
|
|
77
123
|
const code = response.code;
|
|
78
124
|
if (code !== undefined && code !== 200) {
|
|
79
125
|
throw new Error(`登录失败 (${code}): ${response.msg}`);
|
|
80
126
|
}
|
|
81
127
|
// 从多个位置尝试获取 token
|
|
82
|
-
const token = response.token ??
|
|
128
|
+
const token = response.token ??
|
|
129
|
+
response.data?.token ??
|
|
130
|
+
(typeof response.data === "string" ? response.data : undefined);
|
|
83
131
|
if (!token) {
|
|
84
|
-
// 打印完整响应帮助调试
|
|
85
132
|
const keys = Object.keys(response);
|
|
86
133
|
throw new Error(`登录成功但未返回 token,响应字段: [${keys.join(", ")}],完整响应: ${JSON.stringify(response).slice(0, 500)}`);
|
|
87
134
|
}
|
|
@@ -94,44 +141,15 @@ export async function doLogin(username, password) {
|
|
|
94
141
|
}
|
|
95
142
|
function doSetToken(token) {
|
|
96
143
|
if (!token || !token.startsWith("eyJ")) {
|
|
97
|
-
throw new Error("无效的 token
|
|
144
|
+
throw new Error("无效的 token,应提供以 eyJ 开头的 JWT 令牌");
|
|
98
145
|
}
|
|
99
146
|
setToken(token);
|
|
100
147
|
return {
|
|
101
148
|
success: true,
|
|
102
|
-
message: "
|
|
149
|
+
message: "令牌已更新,后续请求将自动使用该令牌",
|
|
103
150
|
tokenPreview: token.slice(0, 20) + "...",
|
|
104
151
|
};
|
|
105
152
|
}
|
|
106
|
-
/**
|
|
107
|
-
* 尝试使用环境变量中的用户名密码自动登录
|
|
108
|
-
* 返回 true 表示登录成功,false 表示跳过(无凭据或已有 token)
|
|
109
|
-
*/
|
|
110
|
-
export async function tryAutoLogin() {
|
|
111
|
-
const config = loadConfig();
|
|
112
|
-
// 已有 token 则跳过
|
|
113
|
-
if (getToken()) {
|
|
114
|
-
return false;
|
|
115
|
-
}
|
|
116
|
-
// 无用户名密码则跳过
|
|
117
|
-
if (!config.username || !config.password) {
|
|
118
|
-
return false;
|
|
119
|
-
}
|
|
120
|
-
await doLogin(config.username, config.password);
|
|
121
|
-
return true;
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* 强制使用环境变量中的用户名密码重新登录(用于 token 失效后的自动恢复)
|
|
125
|
-
* 返回 true 表示登录成功,false 表示无法重试(未配置凭据)
|
|
126
|
-
*/
|
|
127
|
-
export async function tryRelogin() {
|
|
128
|
-
const config = loadConfig();
|
|
129
|
-
if (!config.username || !config.password) {
|
|
130
|
-
return false;
|
|
131
|
-
}
|
|
132
|
-
await doLogin(config.username, config.password);
|
|
133
|
-
return true;
|
|
134
|
-
}
|
|
135
153
|
function getTokenStatus() {
|
|
136
154
|
const token = getToken();
|
|
137
155
|
const config = loadConfig();
|
|
@@ -140,9 +158,8 @@ function getTokenStatus() {
|
|
|
140
158
|
tokenSource: token
|
|
141
159
|
? config.accessToken === token
|
|
142
160
|
? "环境变量 (TUS_ACCESS_TOKEN)"
|
|
143
|
-
: "
|
|
144
|
-
: "
|
|
145
|
-
hasCredentials: !!(config.username && config.password),
|
|
161
|
+
: "对话中设置"
|
|
162
|
+
: "未设置",
|
|
146
163
|
};
|
|
147
164
|
}
|
|
148
165
|
//# sourceMappingURL=auth.js.map
|
package/dist/tools/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/tools/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/tools/auth.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/client.d.ts
CHANGED
|
@@ -21,6 +21,11 @@ export declare function apiGetPage<T = unknown>(path: string, params?: Record<st
|
|
|
21
21
|
* 与前端 request.js 一致:body 加密后以 { data: "<encrypted>" } 发送
|
|
22
22
|
*/
|
|
23
23
|
export declare function apiPost<T = unknown>(path: string, body?: unknown): Promise<T>;
|
|
24
|
+
/**
|
|
25
|
+
* 发起 GET 请求,不携带 Authorization 头,返回完整 JSON 响应
|
|
26
|
+
* 用于验证码等无需认证的接口
|
|
27
|
+
*/
|
|
28
|
+
export declare function apiGetRaw(path: string): Promise<Record<string, unknown>>;
|
|
24
29
|
/**
|
|
25
30
|
* 发起 POST 请求,不携带 Authorization 头,返回完整 JSON 响应
|
|
26
31
|
* 用于登录等无需认证的接口
|
package/dist/tools/client.js
CHANGED
|
@@ -1,13 +1,6 @@
|
|
|
1
1
|
import { loadConfig } from "../env.js";
|
|
2
|
-
import { tryRelogin } from "./auth.js";
|
|
3
2
|
import { aesEncrypt } from "./crypto.js";
|
|
4
|
-
// ──
|
|
5
|
-
function debugLog(label, ...args) {
|
|
6
|
-
if (process.env.TUS_DEBUG) {
|
|
7
|
-
console.error(`[MCP-DEBUG] ${label}`, ...args);
|
|
8
|
-
}
|
|
9
|
-
}
|
|
10
|
-
// ── Token management ──
|
|
3
|
+
// ── Token 管理(支持对话中动态更新) ──
|
|
11
4
|
let currentToken = loadConfig().accessToken;
|
|
12
5
|
export function getToken() {
|
|
13
6
|
return currentToken;
|
|
@@ -15,10 +8,15 @@ export function getToken() {
|
|
|
15
8
|
export function setToken(token) {
|
|
16
9
|
currentToken = token;
|
|
17
10
|
}
|
|
11
|
+
// ── Debug logging ──
|
|
12
|
+
function debugLog(label, ...args) {
|
|
13
|
+
if (process.env.TUS_DEBUG) {
|
|
14
|
+
console.error(`[MCP-DEBUG] ${label}`, ...args);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
18
17
|
// ── Helpers ──
|
|
19
18
|
function getBaseUrl() {
|
|
20
19
|
const config = loadConfig();
|
|
21
|
-
// 后端所有接口均在 /api 路径下
|
|
22
20
|
return config.baseUrl.replace(/\/+$/, "") + "/api";
|
|
23
21
|
}
|
|
24
22
|
// ── 标准请求头(与前端 request.js 拦截器一致) ──
|
|
@@ -32,181 +30,159 @@ const COMMON_HEADERS = {
|
|
|
32
30
|
function getAuthHeaders() {
|
|
33
31
|
const token = currentToken ?? loadConfig().accessToken;
|
|
34
32
|
if (!token) {
|
|
35
|
-
throw new Error("
|
|
33
|
+
throw new Error("未配置访问令牌,请使用 set_access_token 工具设置 token,或在环境变量中配置 TUS_ACCESS_TOKEN");
|
|
36
34
|
}
|
|
37
35
|
return {
|
|
38
36
|
...COMMON_HEADERS,
|
|
39
37
|
"Authorization": `Bearer ${token}`,
|
|
40
38
|
};
|
|
41
39
|
}
|
|
42
|
-
/**
|
|
43
|
-
* 判断错误是否为认证相关错误(token 过期、无效等)
|
|
44
|
-
*/
|
|
45
|
-
function isAuthError(error) {
|
|
46
|
-
if (!(error instanceof Error))
|
|
47
|
-
return false;
|
|
48
|
-
const msg = error.message.toLowerCase();
|
|
49
|
-
// HTTP 401
|
|
50
|
-
if (msg.includes("401"))
|
|
51
|
-
return true;
|
|
52
|
-
// 业务错误关键词
|
|
53
|
-
const authKeywords = ["token", "认证", "登录", "过期", "expired", "unauthorized", "无效"];
|
|
54
|
-
return authKeywords.some((kw) => msg.includes(kw));
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* 尝试自动重新登录并重试请求
|
|
58
|
-
* 如果配置了用户名密码且当前错误是认证错误,则重新登录后重试一次
|
|
59
|
-
*/
|
|
60
|
-
async function withAutoRetry(requestFn) {
|
|
61
|
-
try {
|
|
62
|
-
return await requestFn();
|
|
63
|
-
}
|
|
64
|
-
catch (err) {
|
|
65
|
-
if (!isAuthError(err)) {
|
|
66
|
-
throw err;
|
|
67
|
-
}
|
|
68
|
-
// 尝试用用户名密码重新登录
|
|
69
|
-
const reloggedIn = await tryRelogin();
|
|
70
|
-
if (!reloggedIn) {
|
|
71
|
-
throw err; // 无法重试,抛出原始错误
|
|
72
|
-
}
|
|
73
|
-
// 用新 token 重试
|
|
74
|
-
return await requestFn();
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
40
|
/**
|
|
78
41
|
* 发起 GET 请求
|
|
79
42
|
* 与前端 request.js 一致:params 加密后作为 ?data=<encrypted> 发送
|
|
80
43
|
*/
|
|
81
44
|
export async function apiGet(path, params) {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
const
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
if (value !== undefined && value !== "") {
|
|
88
|
-
cleanParams[key] = value;
|
|
89
|
-
}
|
|
45
|
+
const cleanParams = {};
|
|
46
|
+
if (params) {
|
|
47
|
+
for (const [key, value] of Object.entries(params)) {
|
|
48
|
+
if (value !== undefined && value !== "") {
|
|
49
|
+
cleanParams[key] = value;
|
|
90
50
|
}
|
|
91
51
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
throw new Error(`API error (${json.code}): ${json.msg}`);
|
|
115
|
-
}
|
|
116
|
-
// 兼容 R<> 格式(有 data 字段)和 AjaxResult 格式(无 data 字段)
|
|
117
|
-
if ('data' in json) {
|
|
118
|
-
return json.data;
|
|
119
|
-
}
|
|
120
|
-
return json;
|
|
52
|
+
}
|
|
53
|
+
const hasParams = Object.keys(cleanParams).length > 0;
|
|
54
|
+
const url = hasParams
|
|
55
|
+
? `${getBaseUrl()}${path}?data=${aesEncrypt(JSON.stringify(cleanParams))}`
|
|
56
|
+
: `${getBaseUrl()}${path}`;
|
|
57
|
+
debugLog(`GET ${url}`);
|
|
58
|
+
const controller = new AbortController();
|
|
59
|
+
const timeout = setTimeout(() => controller.abort(), 30000);
|
|
60
|
+
try {
|
|
61
|
+
const res = await fetch(url, {
|
|
62
|
+
method: "GET",
|
|
63
|
+
headers: getAuthHeaders(),
|
|
64
|
+
signal: controller.signal,
|
|
65
|
+
});
|
|
66
|
+
const text = await res.text();
|
|
67
|
+
debugLog(`GET ${path} → ${res.status}`, text.slice(0, 500));
|
|
68
|
+
if (!res.ok) {
|
|
69
|
+
throw new Error(`HTTP ${res.status}: ${text}`);
|
|
70
|
+
}
|
|
71
|
+
const json = JSON.parse(text);
|
|
72
|
+
if (json.code !== 200) {
|
|
73
|
+
throw new Error(`API error (${json.code}): ${json.msg}`);
|
|
121
74
|
}
|
|
122
|
-
|
|
123
|
-
|
|
75
|
+
// 兼容 R<> 格式(有 data 字段)和 AjaxResult 格式(无 data 字段)
|
|
76
|
+
if ('data' in json) {
|
|
77
|
+
return json.data;
|
|
124
78
|
}
|
|
125
|
-
|
|
79
|
+
return json;
|
|
80
|
+
}
|
|
81
|
+
finally {
|
|
82
|
+
clearTimeout(timeout);
|
|
83
|
+
}
|
|
126
84
|
}
|
|
127
85
|
/**
|
|
128
86
|
* 发起 GET 请求,返回分页数据(TableDataInfo 格式)
|
|
129
87
|
* 与前端 request.js 一致:params 加密后作为 ?data=<encrypted> 发送
|
|
130
88
|
*/
|
|
131
89
|
export async function apiGetPage(path, params) {
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
const
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
if (value !== undefined && value !== "") {
|
|
138
|
-
cleanParams[key] = value;
|
|
139
|
-
}
|
|
90
|
+
const cleanParams = {};
|
|
91
|
+
if (params) {
|
|
92
|
+
for (const [key, value] of Object.entries(params)) {
|
|
93
|
+
if (value !== undefined && value !== "") {
|
|
94
|
+
cleanParams[key] = value;
|
|
140
95
|
}
|
|
141
96
|
}
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
throw new Error(`HTTP ${res.status}: ${text}`);
|
|
161
|
-
}
|
|
162
|
-
const json = JSON.parse(text);
|
|
163
|
-
if (json.code !== undefined && json.code !== 200 && json.code !== 0) {
|
|
164
|
-
throw new Error(`API error (${json.code}): ${json.msg}`);
|
|
165
|
-
}
|
|
166
|
-
return json;
|
|
97
|
+
}
|
|
98
|
+
const hasParams = Object.keys(cleanParams).length > 0;
|
|
99
|
+
const url = hasParams
|
|
100
|
+
? `${getBaseUrl()}${path}?data=${aesEncrypt(JSON.stringify(cleanParams))}`
|
|
101
|
+
: `${getBaseUrl()}${path}`;
|
|
102
|
+
debugLog(`GET(page) ${url}`);
|
|
103
|
+
const controller = new AbortController();
|
|
104
|
+
const timeout = setTimeout(() => controller.abort(), 30000);
|
|
105
|
+
try {
|
|
106
|
+
const res = await fetch(url, {
|
|
107
|
+
method: "GET",
|
|
108
|
+
headers: getAuthHeaders(),
|
|
109
|
+
signal: controller.signal,
|
|
110
|
+
});
|
|
111
|
+
const text = await res.text();
|
|
112
|
+
debugLog(`GET(page) ${path} → ${res.status}`, text.slice(0, 500));
|
|
113
|
+
if (!res.ok) {
|
|
114
|
+
throw new Error(`HTTP ${res.status}: ${text}`);
|
|
167
115
|
}
|
|
168
|
-
|
|
169
|
-
|
|
116
|
+
const json = JSON.parse(text);
|
|
117
|
+
if (json.code !== undefined && json.code !== 200 && json.code !== 0) {
|
|
118
|
+
throw new Error(`API error (${json.code}): ${json.msg}`);
|
|
170
119
|
}
|
|
171
|
-
|
|
120
|
+
return json;
|
|
121
|
+
}
|
|
122
|
+
finally {
|
|
123
|
+
clearTimeout(timeout);
|
|
124
|
+
}
|
|
172
125
|
}
|
|
173
126
|
/**
|
|
174
127
|
* 发起 POST 请求(携带 Authorization 头)
|
|
175
128
|
* 与前端 request.js 一致:body 加密后以 { data: "<encrypted>" } 发送
|
|
176
129
|
*/
|
|
177
130
|
export async function apiPost(path, body) {
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
const
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
if (!res.ok) {
|
|
198
|
-
throw new Error(`HTTP ${res.status}: ${text}`);
|
|
199
|
-
}
|
|
200
|
-
const json = JSON.parse(text);
|
|
201
|
-
if (json.code !== 200) {
|
|
202
|
-
throw new Error(`API error (${json.code}): ${json.msg}`);
|
|
203
|
-
}
|
|
204
|
-
return json.data;
|
|
131
|
+
const url = `${getBaseUrl()}${path}`;
|
|
132
|
+
const encryptedBody = body
|
|
133
|
+
? { data: aesEncrypt(JSON.stringify(body)) }
|
|
134
|
+
: undefined;
|
|
135
|
+
const bodyStr = encryptedBody ? JSON.stringify(encryptedBody) : undefined;
|
|
136
|
+
debugLog(`POST ${url}`, body ? `原始: ${JSON.stringify(body).slice(0, 300)}` : "(无body)");
|
|
137
|
+
const controller = new AbortController();
|
|
138
|
+
const timeout = setTimeout(() => controller.abort(), 30000);
|
|
139
|
+
try {
|
|
140
|
+
const res = await fetch(url, {
|
|
141
|
+
method: "POST",
|
|
142
|
+
headers: getAuthHeaders(),
|
|
143
|
+
body: bodyStr,
|
|
144
|
+
signal: controller.signal,
|
|
145
|
+
});
|
|
146
|
+
const text = await res.text();
|
|
147
|
+
debugLog(`POST ${path} → ${res.status}`, text.slice(0, 500));
|
|
148
|
+
if (!res.ok) {
|
|
149
|
+
throw new Error(`HTTP ${res.status}: ${text}`);
|
|
205
150
|
}
|
|
206
|
-
|
|
207
|
-
|
|
151
|
+
const json = JSON.parse(text);
|
|
152
|
+
if (json.code !== 200) {
|
|
153
|
+
throw new Error(`API error (${json.code}): ${json.msg}`);
|
|
208
154
|
}
|
|
209
|
-
|
|
155
|
+
return json.data;
|
|
156
|
+
}
|
|
157
|
+
finally {
|
|
158
|
+
clearTimeout(timeout);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* 发起 GET 请求,不携带 Authorization 头,返回完整 JSON 响应
|
|
163
|
+
* 用于验证码等无需认证的接口
|
|
164
|
+
*/
|
|
165
|
+
export async function apiGetRaw(path) {
|
|
166
|
+
const url = `${getBaseUrl()}${path}`;
|
|
167
|
+
debugLog(`GET(raw) ${url}`);
|
|
168
|
+
const controller = new AbortController();
|
|
169
|
+
const timeout = setTimeout(() => controller.abort(), 30000);
|
|
170
|
+
try {
|
|
171
|
+
const res = await fetch(url, {
|
|
172
|
+
method: "GET",
|
|
173
|
+
headers: COMMON_HEADERS,
|
|
174
|
+
signal: controller.signal,
|
|
175
|
+
});
|
|
176
|
+
const text = await res.text();
|
|
177
|
+
debugLog(`GET(raw) ${path} → ${res.status}`, text.slice(0, 500));
|
|
178
|
+
if (!res.ok) {
|
|
179
|
+
throw new Error(`HTTP ${res.status}: ${text}`);
|
|
180
|
+
}
|
|
181
|
+
return JSON.parse(text);
|
|
182
|
+
}
|
|
183
|
+
finally {
|
|
184
|
+
clearTimeout(timeout);
|
|
185
|
+
}
|
|
210
186
|
}
|
|
211
187
|
/**
|
|
212
188
|
* 发起 POST 请求,不携带 Authorization 头,返回完整 JSON 响应
|
package/dist/tools/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/tools/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/tools/client.ts"],"names":[],"mappings":"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"}
|