3.0 KiB
3.0 KiB
Axum 手机验证码登录最小闭环设计
日期:2026-04-21
1. 文档目的
这份文档用于冻结 Rust api-server + module-auth 当前阶段手机号验证码登录的最小实现边界,避免在接入真实阿里云短信 adapter 前,把接口 contract、mock 行为和后续 SpacetimeDB 数据模型混在一起。
2. 当前阶段范围
本阶段只落以下内容:
POST /api/auth/phone/send-codePOST /api/auth/phone/login- 进程内 mock 验证码存储与校验
- 登录成功后签发 access token 与 refresh cookie
本阶段明确不包含:
- 真实阿里云短信发送
- 图形验证码
- 风控封禁
- 手机号换绑
- 微信补绑手机号
3. 固定 mock 规则
当前阶段统一使用以下 mock 约束:
- 固定验证码:
123456 - 验证码 TTL:
5分钟 - 冷却秒数:
60 - 手机号必须按中国大陆手机号规则校验
4. 接口 contract
4.1 POST /api/auth/phone/send-code
请求体:
{
"phone": "13800138000",
"scene": "login"
}
当前允许的 scene:
loginbind_phonechange_phone
成功响应:
{
"ok": true,
"cooldownSeconds": 60,
"expiresInSeconds": 300,
"providerRequestId": null
}
4.2 POST /api/auth/phone/login
请求体:
{
"phone": "13800138000",
"code": "123456"
}
成功响应:
{
"token": "access-token",
"user": {
"id": "user_00000001",
"username": "phone_00000002",
"displayName": "138****8000",
"phoneNumberMasked": "138****8000",
"loginMethod": "phone",
"bindingStatus": "active",
"wechatBound": false
}
}
同时必须写回 refresh cookie。
5. 用户创建与复用规则
- 手机号首次登录时自动建号
- 同一手机号再次登录时复用同一系统用户
- access token 的
provider固定为phone - 用户快照中的
loginMethod固定为phone
6. 错误语义
当前阶段统一约束为:
- 手机号格式错误:
400 - 场景非法:
400 - 验证码不存在、错误或过期:
400 - 服务内部存储或签发失败:
500
7. crate 边界
7.1 module-auth
负责:
- 手机号规范化
- mock 验证码写入与校验
- 手机号用户创建与复用
7.2 api-server
负责:
- HTTP 请求解析
- 场景字符串映射
- 登录成功后创建会话、签发 JWT、写回 refresh cookie
7.3 platform-auth
负责:
- 签发 access token
- 生成 refresh cookie
8. 测试要求
至少覆盖:
send-code成功返回 mock 冷却与过期秒数- 默认错误场景返回
400 - 首次手机号登录会自动建号并写 refresh cookie
- 同一手机号重复登录复用同一用户
9. 完成定义
满足以下条件时,本任务视为完成:
- Rust 侧已提供
send-code与phone/login - mock 验证码链路可跑通
- 手机号登录成功后能拿到 access token 与 refresh cookie
- 文档、任务清单与测试已同步更新