|
| 1 | +# nte-login(Cloudflare Workers 版) |
| 2 | + |
| 3 | +NTEUID 外置登录服务,支持塔吉多与完美世界短信登录。本目录运行在 Cloudflare Workers,使用 SQLite-backed Durable Objects 保存登录会话;仓库根目录保留 Python 自部署版,EdgeOne Pages 版在 `edgeone` 分支。 |
| 4 | + |
| 5 | +当前只实现 `http_poll`,API 路径和凭据结构与 NTEUID 现有外置登录协议兼容。 |
| 6 | + |
| 7 | +## 架构 |
| 8 | + |
| 9 | +- 入口 Worker 解析 `/nte/*` 请求,并根据 `auth` 路由到固定 Durable Object。 |
| 10 | +- 每个 `auth` 对应一个 Durable Object;同一会话的写入、状态消费和页面读取串行执行。 |
| 11 | +- 会话写入 Durable Object 的强一致 SQLite storage,不依赖最终一致的 Workers KV。 |
| 12 | +- Durable Object Alarm 在固定 TTL 到期后删除 Cookie、角色和登录凭据。 |
| 13 | +- `success` / `failed` 终态在 `/nte/status/{auth}` 首次读取后立即删除,只能消费一次。 |
| 14 | + |
| 15 | +## 准备 |
| 16 | + |
| 17 | +- Node.js 22 或更高版本 |
| 18 | +- Cloudflare 账号 |
| 19 | +- 已安装并登录 Wrangler:`npx wrangler login` |
| 20 | + |
| 21 | +```sh |
| 22 | +cd cloudflare |
| 23 | +npm install |
| 24 | +``` |
| 25 | + |
| 26 | +## 配置 |
| 27 | + |
| 28 | +先设置与 NTEUID 后台一致的共享密钥。Cloudflare 版不接受空密钥;密钥只进入 Cloudflare Secret,不要写进 `wrangler.jsonc`。 |
| 29 | + |
| 30 | +首次从本地部署时,通过进程环境将密钥交给部署脚本;脚本只会创建权限为 `0600` 的临时 JSON 文件,并在 Wrangler 退出后删除: |
| 31 | + |
| 32 | +```sh |
| 33 | +SHARED_SECRET='和_NTELoginSecret_一致' npm run deploy |
| 34 | +``` |
| 35 | + |
| 36 | +Worker 已存在且远端 Secret 已配置后,后续可以直接运行 `npm run deploy`,Wrangler 会继承现有 Secret。 |
| 37 | + |
| 38 | +`wrangler.jsonc` 内还有三个非敏感配置: |
| 39 | + |
| 40 | +| 变量 | 默认值 | 说明 | |
| 41 | +| ---------------- | -----: | ------------------------------------------- | |
| 42 | +| `SESSION_TTL_S` | `600` | 登录会话有效期,允许 60–3600 秒 | |
| 43 | +| `SIG_TTL_S` | `300` | HMAC 请求签名有效期 | |
| 44 | +| `SMS_COOLDOWN_S` | `60` | 同一会话服务端短信发送冷却;设为 `0` 可关闭 | |
| 45 | + |
| 46 | +本地开发可新建不会提交的 `.dev.vars`: |
| 47 | + |
| 48 | +```dotenv |
| 49 | +SHARED_SECRET=和_NTELoginSecret_一致 |
| 50 | +``` |
| 51 | + |
| 52 | +## 本地验证 |
| 53 | + |
| 54 | +```sh |
| 55 | +npm run check |
| 56 | +npm run dev |
| 57 | +``` |
| 58 | + |
| 59 | +`npm run check` 会依次执行严格 TypeScript 检查、Workers/Miniflare 集成测试和 Wrangler dry-run 打包。 |
| 60 | + |
| 61 | +## 部署 |
| 62 | + |
| 63 | +### Cloudflare Workers Builds |
| 64 | + |
| 65 | +在 Cloudflare 连接本仓库时使用以下配置: |
| 66 | + |
| 67 | +| 字段 | 值 | |
| 68 | +| -------------- | ---------------- | |
| 69 | +| 生产分支 | `main` | |
| 70 | +| 根目录 | `/cloudflare` | |
| 71 | +| 构建命令 | `npm run check` | |
| 72 | +| 部署命令 | `npm run deploy` | |
| 73 | +| 非生产分支构建 | 关闭 | |
| 74 | + |
| 75 | +新增一个加密的构建 Secret: |
| 76 | + |
| 77 | +| 变量 | 值 | |
| 78 | +| --------------- | ------------------------------- | |
| 79 | +| `SHARED_SECRET` | 与 NTEUID `NTELoginSecret` 相同 | |
| 80 | + |
| 81 | +`npm run deploy` 会在首次部署时把该构建 Secret 作为 Worker 运行时 Secret 上传。API 令牌应让 Cloudflare 自动新建,不要复用其他项目的受限令牌。 |
| 82 | + |
| 83 | +### Wrangler |
| 84 | + |
| 85 | +```sh |
| 86 | +npm run deploy |
| 87 | +``` |
| 88 | + |
| 89 | +首次部署会按 `wrangler.jsonc` 中的 `v1` migration 创建 `LoginSessionDurableObject` SQLite namespace。不要删除或复用已经发布的 migration tag。 |
| 90 | + |
| 91 | +正式使用建议给 Worker 绑定自定义域名,并从真实用户网络验证: |
| 92 | + |
| 93 | +1. 登录页面和完美世界验证码脚本可加载。 |
| 94 | +2. Worker 能访问 `user.laohu.com`、`id.wanmei.com` 和 `kf.wanmei.com`。 |
| 95 | +3. 塔吉多与完美世界都能完成“发短信 → 登录 → NTEUID 消费凭据”闭环。 |
| 96 | + |
| 97 | +Cloudflare 全球网络在中国大陆的延迟和连通性不能由本地 Miniflare 证明,发布前必须做大陆网络实测。 |
| 98 | + |
| 99 | +## NTEUID 后台对应 |
| 100 | + |
| 101 | +| 字段 | 值 | |
| 102 | +| ------------------- | ----------------------------- | |
| 103 | +| `NTELoginTransport` | `http_poll` | |
| 104 | +| `NTELoginUrl` | Worker 自定义域名或部署 URL | |
| 105 | +| `NTELoginSecret` | 同 Cloudflare `SHARED_SECRET` | |
| 106 | +| `NTELoginTTL` | 建议与 `SESSION_TTL_S` 一致 | |
| 107 | + |
| 108 | +## API |
| 109 | + |
| 110 | +保持以下现有路径: |
| 111 | + |
| 112 | +- `POST /nte/start` |
| 113 | +- `GET /nte/i/{auth}` |
| 114 | +- `POST /nte/sendSmsCode` |
| 115 | +- `POST /nte/login` |
| 116 | +- `POST /nte/wanmei/prepare` |
| 117 | +- `POST /nte/wanmei/sendSmsCode` |
| 118 | +- `POST /nte/wanmei/login` |
| 119 | +- `POST /nte/wanmei/selectRole` |
| 120 | +- `GET /nte/status/{auth}` |
| 121 | +- `GET /nte/done` |
| 122 | + |
| 123 | +SSE 和 WebSocket 暂未实现。 |
0 commit comments