fix(files): 去掉文件链接的签名与有效期,修客服端凭证裂图
问题:寄卖凭证的图片地址是带签名的临时链接(15 分钟有效),而入库时会把当时的链接 原样存进 screenshots_json;工单验收那条线出参时会用 refreshStoredFileUrl() 重签, 寄卖这条线(提报凭证/赠送凭证/卖家列表)漏了这一步,于是入库 15 分钟后链接必然失效, 客服看到裂图。图片本身没丢,是取的时候没重签。 业务定调:签名这套意义不大,直接去掉。 - buildFileUrl() 只产出不带签名、不带有效期的普通链接(对象 key 带随机段,不可枚举), 删除签名生成/校验与 15 分钟 TTL 常量,文件读取路由不再校验签名 - refreshStoredFileUrl() 语义改为"归一化":把历史存的签名链接洗成普通链接,老数据不用改也能看 - 寄卖出参统一归一化:提报凭证、赠送凭证(imageUrls + files[])、库存截图、卖家列表截图 真实库验证:库里早在 2026-09-15 就过期的老链接现在返回 HTTP 200(image/webp,52632 字节), 改造前是 403;客服接口下发地址已无签名;不存在的 key 仍 404。 取舍:文件路由原本靠签名把关,去掉后知道链接即可看图(key 含 24 位随机段,实际不可枚举)。 如需收紧可给该路由加后台登录校验。
This commit is contained in:
@@ -21,6 +21,7 @@
|
||||
| `632dddc4` | 上一轮:H5 渠道整体下线 + 凭据字段修复 + 状态机封闭(撤销守卫 / 库存绑定唯一性 / 生命周期解绑)+ 押金归属取台账 | 迁移 `079`、`consignment-*` 五个文件、`work-order-*` 三个仓库、两个前端面板 |
|
||||
| `5d11bf20` | 批次 C+D:指派部分成功补偿、凭证核销如实反馈、空规格不放行 + 履约/指派服务端规格复检 | `consignment-fulfillment-service.ts`、`consignment-matching-service.ts`、`consignment-repo.ts`、履约路由、`WorkOrdersPanel.tsx` |
|
||||
| `d6f6219f` | 批次 F1:内部现货履约停在「待加好友」,客服确认后才进赠送冷却 + 备注快捷项 | `work-order-gift-repo.ts`、履约服务、`WorkOrdersPanel.tsx`、`utils/gift-phase.ts` |
|
||||
| 本批提交(批次 O,同一提交内含本文档,故不写自身 hash) | 批次 O:文件链接去掉签名与有效期(修客服端凭证裂图),寄卖出参统一归一化 | `file-storage-service.ts`、`routes/files.ts`、`consignment-admin-service.ts` |
|
||||
| 本批提交(批次 N,同一提交内含本文档,故不写自身 hash) | 批次 N:删掉按库存号的卖家入口,卖家动作只按寄卖单号定位 | `consignment-worker-service.ts`、`routes/worker/consignment.ts`、`WorkerConsignmentPage.tsx` |
|
||||
| 本批提交(批次 M,同一提交内含本文档,故不写自身 hash) | 批次 M:停用客服手动入库(前端入口删除 + 后端 409 守卫),寄卖货源只走平台提报 | `consignment-admin-service.ts`、`consignment-repo.ts`、`ConsignmentInventoryPanel.tsx` |
|
||||
| 本批提交(批次 L,同一提交内含本文档,故不写自身 hash) | 批次 L:匹配弹窗两个动作一律二次确认 + 按钮分区/图标/后果说明,防点错 | `WorkOrdersPanel.tsx` |
|
||||
@@ -284,6 +285,39 @@
|
||||
前端在"部分匹配"候选上先 `modal.confirm` 危险确认,再带 `allowPartial: true` 重试,高配充低配的合法玩法保留但不可误触。
|
||||
3. ⏳ 匹配下推 SQL + 批量匹配接口 + 工单列表角标(P2-8)未做:当前仍是"取全量在库 → 内存比对"。
|
||||
|
||||
### 批次 O · 去掉文件链接的签名/有效期(本轮)
|
||||
|
||||
**问题(用户截图:客服看到的凭证是裂图)**:寄卖凭证的图片地址是**带签名的临时链接**:
|
||||
|
||||
```
|
||||
/api/v1/files/object?key=consignment_screenshot/2026/09/15/xxx.webp&expires=1789463063&signature=...
|
||||
```
|
||||
|
||||
签名有效期只有 **15 分钟**,而**入库时会把当时的链接原样存进 `screenshots_json`**。
|
||||
工单验收那条线在出参时用 `refreshStoredFileUrl()` 重签,所以工单图片正常;
|
||||
寄卖这条线(提报凭证 / 赠送凭证 / 卖家列表)漏了这一步 → 存下来的链接早过期 → 客服看到裂图。
|
||||
图片本身没丢,是"取的时候没重签"。
|
||||
|
||||
**业务定调**(用户):签名这套意义不大,直接去掉,用普通链接。
|
||||
|
||||
**改法**:
|
||||
|
||||
1. ✅ `buildFileUrl()` 现在只产出**不带签名、不带有效期**的普通链接
|
||||
(对象 key 带随机段,本身不可枚举),删掉签名生成/校验与 15 分钟 TTL 常量,
|
||||
文件读取路由不再校验签名。
|
||||
2. ✅ `refreshStoredFileUrl()` 保留但语义变成"**归一化**":把历史存的签名链接洗成普通链接,
|
||||
老数据不用改也能看(`normalizeStoredFileUrl` 保留为同义别名)。
|
||||
3. ✅ 寄卖侧出参统一走归一化:提报凭证、赠送凭证(`imageUrls` + `files[]`)、库存截图、卖家列表截图;
|
||||
这样新老数据都稳定可看,不再依赖"每一处读取都记得重签"。
|
||||
|
||||
**真实库验证**:库里那条**早在 2026-09-15 就过期**的老链接,现在真实请求返回
|
||||
`HTTP 200 / image/webp / 52632 字节`(改造前是 403);客服接口下发的地址已是不含签名的普通链接;
|
||||
不存在的 key 仍然 404。
|
||||
|
||||
**取舍说明**:文件路由本身没有登录校验,原来唯一把关的就是签名。去掉签名后,
|
||||
**知道链接的人就能看图**(key 里有 24 位随机段,实际不可枚举,等价于一条长口令)。
|
||||
寄卖凭证可能包含游戏账号/主页信息,如需收紧,可以后续给该路由加"仅登录后台可读"的校验。
|
||||
|
||||
### 批次 N · 删掉"按库存号操作"的卖家入口(本轮)
|
||||
|
||||
批次 I 为了兜住"客服手工入库的现货没有提报单"这种情况,给卖家动作额外开了两个按库存号的入口
|
||||
|
||||
Reference in New Issue
Block a user