Skip to content

Commit 19b977a

Browse files
committed
✨ main 同时支持 Cloudflare Workers
1 parent 42735ab commit 19b977a

18 files changed

Lines changed: 5664 additions & 0 deletions

.dockerignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,4 @@ Dockerfile
2020
.dockerignore
2121
README.md
2222
uv.lock
23+
cloudflare/
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
name: Cloudflare checks
2+
3+
on:
4+
push:
5+
branches: [main]
6+
paths:
7+
- "cloudflare/**"
8+
- ".github/workflows/cloudflare-check.yml"
9+
pull_request:
10+
branches: [main]
11+
paths:
12+
- "cloudflare/**"
13+
- ".github/workflows/cloudflare-check.yml"
14+
15+
permissions:
16+
contents: read
17+
18+
jobs:
19+
check:
20+
runs-on: ubuntu-latest
21+
timeout-minutes: 10
22+
defaults:
23+
run:
24+
working-directory: cloudflare
25+
steps:
26+
- uses: actions/checkout@v5
27+
- uses: actions/setup-node@v5
28+
with:
29+
node-version: 24
30+
cache: npm
31+
cache-dependency-path: cloudflare/package-lock.json
32+
- run: npm ci
33+
- run: npm run check

.gitignore

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,10 @@ dist/
2929

3030
logs/
3131
*.log
32+
33+
# Cloudflare Workers 子项目
34+
node_modules/
35+
.wrangler/
36+
coverage/
37+
.dev.vars
38+
.dev.vars.*

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
NTEUID 外置登录服务。支持塔吉多与完美世界短信登录,让 bot 端无需对外暴露端口。
44

5+
仓库根目录是 Python 自部署版;Cloudflare Workers 版位于 [`cloudflare/`](cloudflare/README.md),两者可以从同一个 `main` 分支独立部署。
6+
57
## 启动
68

79
```sh

cloudflare/README.md

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
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

Comments
 (0)