fix: validate S3 browser download CORS

This commit is contained in:
237899745
2026-07-25 16:53:15 +08:00
parent 9716fc2115
commit 091a0cee75
4 changed files with 80 additions and 1 deletions

View File

@@ -96,6 +96,8 @@ Worker 每 5 分钟按 `expires_at` 精确删除对象,删除成功后才删
Access Key 和 Secret Key 使用项目现有 AES-256-GCM 机制加密入库,页面只显示掩码。保存后先执行“全链路测试”,再点“验证并启用”。后端激活前会再次执行 `HeadBucket + 内部 PutObject/GetObject + 公网预签名 GET + 内部 DeleteObject`。编辑现有端点时先对候选配置执行同等测试,并抽查历史对象是否仍可访问;测试通过后才保存,活动状态不变。删除采用软删除,立即停止新写入并隐藏端点,但保留历史对象所需的加密配置;历史关联清空 30 天后再彻底移除。若删除活动端点,新文件自动回退应用服务器本地,直到启用其他 S3。
浏览器通过公网预签名地址直接读取对象,因此 Bucket 必须允许应用站点跨域 GET/HEAD。将 `docker/storage/cors.json` 中的站点域名改成实际应用域名后,通过兼容 S3 的管理工具执行 `PutBucketCors`。后台全链路测试会携带 `PUBLIC_BASE_URL` 的 Origin并拒绝缺失或不匹配的 `Access-Control-Allow-Origin`,避免对象存在但浏览器无法下载。
## 7. 后续部署顺序(本次不执行)
1. 为下载域名添加 DNS确认 119 的 80/443 可用,并建立 WireGuard。
@@ -118,12 +120,17 @@ aws --endpoint-url http://127.0.0.1:3900 \
s3api put-bucket-lifecycle-configuration \
--bucket imageforge-results \
--lifecycle-configuration file://lifecycle.json
aws --endpoint-url http://127.0.0.1:3900 \
s3api put-bucket-cors \
--bucket imageforge-results \
--cors-configuration file://cors.json
```
## 8. 上线验收
- 管理端测试必须完成读、写、删Bucket 内不能残留健康检查对象。
- 普通下载接口先返回 `307``Location` 指向下载域名且有效期约 300 秒。
- 携带应用站点 `Origin` 请求预签名地址时返回匹配的 `Access-Control-Allow-Origin`,浏览器可读取完整对象。
- 未授权用户无法取得签名 URL任务过期后应用下载接口返回 404。
- 单文件与批任务数据库均记录正确的 `storage_endpoint_id` 和对象键。
- 切换到第二端点后,新对象进入第二端点,第一端点历史对象仍可下载。