问题描述
在聊天对话框通过附件按钮上传文件时,UI 显示 Error: Upload failed: 403。
复现步骤
- 打开任意聊天会话
- 点击输入框旁的附件按钮(或拖拽文件到输入区)
- 选择文件上传
- 观察到错误提示 "Upload failed: 403"
根因分析
聊天对话框上传文件调用的是 POST /upload(packages/client/src/stores/hermes/chat.ts:175)。
该路由在 packages/server/src/routes/index.ts:69 被注册为受保护路由,经过两层中间件可能导致 403:
1. requireUserJwt 中间件 (middleware/user-auth.ts:190)
/upload 在 isProtectedHttpPath() 中被列为受保护路径(line 108)
- 用户状态不是
active(被禁用) → 返回 403(line 210-213)
2. resolveUserProfile 中间件 (middleware/user-auth.ts:241)
- 客户端在
chat.ts:174 始终发送 X-Hermes-Profile header
- 用户没有该 profile 的访问权限 → 返回 403(line 254-257)
3. 错误消息被吞掉
- 客户端
chat.ts:180:throw new Error("Upload failed: 403")
- 只显示 HTTP 状态码,不显示服务器返回的
body.error
相关文件
packages/client/src/stores/hermes/chat.ts (line 164-183) — 聊天上传逻辑
packages/server/src/middleware/user-auth.ts (line 104-108, 190-218, 241-262)
packages/server/src/routes/index.ts (line 69) — 路由注册
packages/server/src/controllers/upload.ts — 上传控制器
packages/server/src/routes/hermes/files.ts (line 224-288) — 文件管理上传(额外 requireSuperAdmin)
建议修复
- 客户端:解析并显示服务器返回的
body.error,而非仅状态码
- 服务端:评估
/upload 的 resolveUserProfile 是否需要
- 诊断:增加服务端日志,记录 403 时的具体原因(用户状态/profile权限/其他)
环境
Hermes Web UI v0.6.17
问题描述
在聊天对话框通过附件按钮上传文件时,UI 显示
Error: Upload failed: 403。复现步骤
根因分析
聊天对话框上传文件调用的是
POST /upload(packages/client/src/stores/hermes/chat.ts:175)。该路由在
packages/server/src/routes/index.ts:69被注册为受保护路由,经过两层中间件可能导致 403:1.
requireUserJwt中间件 (middleware/user-auth.ts:190)/upload在isProtectedHttpPath()中被列为受保护路径(line 108)active(被禁用) → 返回 403(line 210-213)2.
resolveUserProfile中间件 (middleware/user-auth.ts:241)chat.ts:174始终发送X-Hermes-Profileheader3. 错误消息被吞掉
chat.ts:180:throw new Error("Upload failed: 403")body.error相关文件
packages/client/src/stores/hermes/chat.ts(line 164-183) — 聊天上传逻辑packages/server/src/middleware/user-auth.ts(line 104-108, 190-218, 241-262)packages/server/src/routes/index.ts(line 69) — 路由注册packages/server/src/controllers/upload.ts— 上传控制器packages/server/src/routes/hermes/files.ts(line 224-288) — 文件管理上传(额外 requireSuperAdmin)建议修复
body.error,而非仅状态码/upload的resolveUserProfile是否需要环境
Hermes Web UI v0.6.17