v2.10.0: 邮件链路 401 修复 + 一账号一 token + 重装 Worker 按钮——workerAuth 同名脚本撞车时按候选逐一验签确定归属(修 itekmedia 收不到件);凭据 token(credential id)烤进 Worker 脚本、Console 按 token 精确鉴权(脚本名仅作旧版兼容);账号详情新增「重新安装 Worker 脚本」

This commit is contained in:
bigcode
2026-10-05 02:04:13 +08:00
parent 1c7dba025b
commit 2dede46509
19 changed files with 242 additions and 68 deletions
+4
View File
@@ -157,6 +157,10 @@ export const rotateAccount = (id: string) =>
export const getAccountWorkerSecret = (id: string) =>
api<{ worker_id: string; secret: string }>(`/api/accounts/${id}/worker-secret`);
/** 重新安装 Worker 脚本:不轮换凭据,用当前模板(Console 地址 + 凭据 token + secret)重渲染上传 */
export const reinstallAccountWorker = (id: string) =>
api<{ ok: boolean; worker_id: string }>(`/api/accounts/${id}/reinstall-worker`, "POST");
/* ---- OAuth ---- */
/** OAuth 是否已配置(cloudflare = 可用;unconfigured = 缺少 client id/secret) */
+18
View File
@@ -24,6 +24,7 @@ import {
getAccount,
listAccounts,
oauthStart,
reinstallAccountWorker,
rotateAccount,
updateAccount,
type AccountDetail,
@@ -428,6 +429,23 @@ function AccountDetailDrawer({
Email Worker 以该凭据直连 Console(/internal/email/authorize 与 /ingest);轮换后已配置的域名会自动重新部署。
</Typography.Text>
<Space wrap>
<Button
icon={<ReloadOutlined />}
onClick={() => {
modal.confirm({
title: `重新安装 ${detail.account.name} 的 Worker 脚本?`,
content: "用当前版本模板重新渲染并上传(凭据不变,已配置域名立即生效);Console 升级后建议执行一次。",
okText: "重新安装",
onOk: async () => {
const res = await reinstallAccountWorker(detail.account.id);
message.success(`Worker 脚本已重新安装(${res.worker_id})`);
onReload();
},
});
}}
>
重新安装 Worker 脚本
</Button>
<Button
onClick={async () => {
const res = await rotateAccount(detail.account.id);
+1
View File
@@ -28,6 +28,7 @@ const ACTION_LABEL: Record<string, string> = {
"account.delete": "删除账号",
"account.batch_delete": "批量删除账号",
"account.rotate": "轮换 Worker 凭据",
"account.reinstall_worker": "重新安装 Worker 脚本",
"domain.setup": "配置 Email Workers",
"domain.delete": "删除域名",
"domain.batch_delete": "批量删除域名",