fix(alist): 网关鉴权头改为 X-Gateway-Token

- 依据 2026-09-28 实测:旧头对新网关 4/4 源返回 401,X-Gateway-Token 返回 200
- 取件通道 scripts/artifact_fetch.py 两处头名同步;镜像内生效需重建 worker
- 修正过期结论:下载直链 /p/<path>?sign=… 为签名鉴权,请求头不影响(无头亦 206)
- 同步文档与回归断言表述(重定向隔离测试仍 PASS)
This commit is contained in:
姚章浩
2026-09-28 18:03:56 +08:00
parent ea6e56b304
commit e53b98f37d
2 changed files with 6 additions and 6 deletions
@@ -28,7 +28,7 @@ API只返回两个范围是否启用,不把目标知识库ID交给浏览器。
真实验收:
- 钉钉公司级技术支持知识库:浏览器捕获会话有效;扫描1080个文件夹;新快照4524节点、1079目录、3444文件;原快照3468文件,证明读取的是实时来源变化;新快照原子激活,旧快照保留。
- PP:当前凭据文件可读取且网络可达,但登录返回无Token;网页显示“PP登录失败,请在来源链接更新凭据;旧快照仍然保留”。
- AList直连:保留各来源原地址,仅向`POST /api/fs/list`添加`x-api-token`;拒绝所有重定向,不依赖钉钉SSO Cookie。2026-09-10 实测四个来源均完成只读全量快照并原子激活:国内工业1718目录/4942文件、海外工业1486目录/4463文件、国内教育3566目录/9067文件、海外教育1742目录/5015文件。
- AList直连:保留各来源原地址,仅向`POST /api/fs/list`添加`X-Gateway-Token`(2026-09-28 网关鉴权头由`x-api-token`改名,旧头已401失效;下载直链`/p/<path>?sign=…`为签名鉴权,不受请求头影响);拒绝所有重定向,不依赖钉钉SSO Cookie。2026-09-10 实测四个来源均完成只读全量快照并原子激活:国内工业1718目录/4942文件、海外工业1486目录/4463文件、国内教育3566目录/9067文件、海外教育1742目录/5015文件。
Worker只读挂载源脚本和来源目录;DingTalk/PP/AList凭据副本位于治理`secrets/`、权限0600,仅普通Worker挂载,API/Web/Release Worker不挂载。AList直连令牌从`secrets/alist_api_token`读取,不进入来源地址表、任务载荷、数据库或日志。
+5 -5
View File
@@ -190,7 +190,7 @@ def alist_download(manifest, max_bytes):
path = "/" + manifest["relative_path"].lstrip("/")
payload = json.dumps({"path": path, "password": ""}).encode("utf-8")
request = urllib.request.Request(base_url + "/api/fs/get", data=payload, method="POST", headers={
"x-api-token": token, "Content-Type": "application/json", "Accept": "application/json",
"X-Gateway-Token": token, "Content-Type": "application/json", "Accept": "application/json",
"User-Agent": "governance-artifact-fetch/1.0",
})
try:
@@ -209,11 +209,11 @@ def alist_download(manifest, max_bytes):
if manifest.get("size_bytes") in (None, 0) and data.get("size"):
manifest["size_bytes"] = int(data["size"])
download_url = urllib.parse.urljoin(base_url + "/", raw_url.lstrip("/"))
# This AList deployment gates the download route with x-api-token (the
# Authorization header is NOT recognized there): wrong auth yields a 302
# to the DingTalk login page instead of bytes.
# 2026-09-28 实测:该网关的下载直链 /p/<path>?sign=... 由签名鉴权,请求头带
# 什么都不影响(无头也是 206);真正需要凭证的是 /api/fs/* 路由。这里仍带上
# 网关头,Authorization 兜底保留用于旧网关形态。
try:
return http_get(download_url, {"x-api-token": token}, 180, max_bytes)
return http_get(download_url, {"X-Gateway-Token": token}, 180, max_bytes)
except FetchError as error:
if error.code == "source_auth_required":
try: