feat(client): 短信登录、JWT、Redis 与 Spug 短信及流式 Chat

- 新增客户端认证:短信发送/登录、access/refresh JWT、Guard/Strategy\n- Redis 存验证码;可配置 SMS_CODE_TTL_SECONDS;失败时回滚与明确错误\n- 短信改为 Spug 推送助手(code/targets/number/name),移除 UniSMS\n- Chat SSE 接口与 DTO;AppModule 挂载 RedisModule\n- 更新 README 与 project-solution 环境变量说明

Made-with: Cursor
This commit is contained in:
2026-04-21 06:30:50 +08:00
parent 61ac181b83
commit 6cc89062e1
15 changed files with 750 additions and 8 deletions

View File

@@ -95,6 +95,18 @@ yarn install
| `VOLC_API_KEY` | 火山引擎 API Key |
| `VOLC_BASE_URL` | 可选,默认 `https://ark.cn-beijing.volces.com/api/v3` |
### Spug 推送助手(短信验证码)
在 [Spug 推送助手](https://push.spug.cc) 创建「短信验证码」类消息模板复制模板编号URL 路径中的 ID。模板中可使用变量 **`number`**(有效期,单位:**分钟**);服务端会根据 `SMS_CODE_TTL_SECONDS` 换算后传入(向上取整,至少为 1与 Redis 中验证码 TTL 一致。
| 变量 | 说明 |
|------|------|
| `SPUG_PUSH_SMS_TEMPLATE_ID` | 消息模板编号(必填,非 mock 时) |
| `SPUG_PUSH_BASE_URL` | 可选,默认 `https://push.spug.cc` |
| `SPUG_SMS_NAME` | 可选,模板若要求 `name` 变量则配置(与官方示例一致) |
| `SMS_MOCK` | 可选,`true` 时跳过真实短信发送(本地联调用) |
| `SMS_CODE_TTL_SECONDS` | 可选,短信验证码 Redis TTL默认 `300` |
> 说明:当前各 Provider 对上游采用 **非流式** `chat/completions` 调用,由网关将完整回复 **切片** 后以 SSE 推给客户端。后续可升级为上游真流式。
---
@@ -135,6 +147,21 @@ yarn start
浏览器打开:`http://localhost:3000/docs`
### 客户端认证MVP
- `POST /api/client/v1/auth/sms/send`
- 入参:`{ "phone": "13800000000", "scene": "login" }`
- 返回:`requestId``expireIn``provider`
- 说明:已接入 Spug 推送助手;非生产环境会额外返回 `testCode` 便于联调
- `POST /api/client/v1/auth/sms/login`
- 入参:`{ "phone": "13800000000", "code": "xxxxxx" }`
- 返回:`accessToken``refreshToken``user`
- `POST /api/client/v1/auth/refresh`
- 入参:`{ "refreshToken": "..." }`
- 返回:新的 `accessToken``refreshToken`
> 验证码当前已接入 Redis 存储key: `chatone:client:sms:code:{phone}:{scene}`TTL 300 秒)。
### 统一 SSE Chat用户端
- **路径**`POST /api/client/v1/chat/completions/stream`
@@ -168,8 +195,19 @@ yarn start
#### curl 示例(流式)
先获取 token
```bash
curl -s -H "Content-Type: application/json" -X POST \
-d '{"phone":"13800000000","code":"123456"}' \
http://localhost:3000/api/client/v1/auth/sms/login
```
再带 `Authorization` 调用 chat
```bash
curl -N \
-H "Authorization: Bearer 你的accessToken" \
-H "Content-Type: application/json" \
-X POST \
-d '{"platform":"qwen","model":"qwen-plus","messages":[{"role":"user","content":"你是谁"}]}' \