- 两阶段接收:POST /internal/email/authorize(accept/reject/temporary_error)+ POST /internal/email/ingest(raw MIME 直传) - Worker-Console 协议:Authorization: WmailHub-Worker + timestamp/nonce/body-hash/HMAC,nonce 防重放,凭据撤销即时生效 - 数据模型:nodes/node_credentials -> cloudflare_accounts/worker_credentials(迁移 0003),emails/domains 归属 account_id - 接入流程 Connect Cloudflare Account:OAuth 自动同步域名 + 部署账号级 Email Worker + 签发 Worker 凭据;rotate 自动重部署 - 动态邮箱:创建/删除/禁用下一封邮件立即生效;拒绝码 DOMAIN_*/MAILBOX_*;超时/5xx 不伪装成邮箱不存在 - 删除 node/ 目录、旧 /api/internal/nodes 协议、ingress/enrollment 概念;dev.ts 简化为 console + email worker 双进程 - 前端:账号页 Email Worker/凭据管理,设置窗口移除默认 Ingress,仪表盘/文案同步;版本 2.0.0 - 测试 62 项全过(新增 authorize 决策矩阵 + Worker 两阶段临时错误语义);本机虚拟 E2E 12 场景全通 - docs 00-10 同步改写;README 更新
1.3 KiB
1.3 KiB
Email Worker <-> Console 内部协议(docs/11 §8,协议版本 1)
/internal/email/authorize 与 /internal/email/ingest 都是内部 API,不能匿名访问。
每个请求必须满足:HTTPS + Worker ID + timestamp + nonce + body SHA256 + HMAC-SHA256。
请求头
Authorization: WmailHub-Worker <worker_id>
X-WmailHub-Timestamp: <unix_seconds>
X-WmailHub-Nonce: <random>
X-WmailHub-Body-SHA256: <hex>
X-WmailHub-Signature: <hex>
X-WmailHub-Protocol: 1
签名
body_hash = SHA256(raw_body)
canonical = METHOD + "\n" + PATH + "\n" + TIMESTAMP + "\n" + NONCE + "\n" + body_hash
signature = HMAC-SHA256(worker_credential_secret, canonical)
Console 必须校验
- Worker ID(存在且 credential active);
- timestamp(默认窗口 5 分钟);
- nonce 不重复(唯一索引入库,主键冲突即 replay);
- body hash;
- HMAC;
- credential 状态(撤销立即生效);
- Worker 所属 Cloudflare 账号与收件域名一致。
API
POST /internal/email/authorize { "recipient": "...", "sender": "...", "message_id": "..." }
POST /internal/email/ingest raw MIME(message/rfc822),收件人经 X-WmailHub-Recipient/Sender 头传递
Console 收到 401/403 的 Worker 应视为凭据失效,不得无限重试。协议必须版本化。