diff --git a/docs/superpowers/specs/2026-05-22-sms-register-design.md b/docs/superpowers/specs/2026-05-22-sms-register-design.md index 562674d..20e2b1d 100644 --- a/docs/superpowers/specs/2026-05-22-sms-register-design.md +++ b/docs/superpowers/specs/2026-05-22-sms-register-design.md @@ -59,8 +59,14 @@ register.vue setNickname.vue ### 2.3 后端流程 ``` -用户输入手机号 → 发送验证码请求 → 后端生成6位随机码 → 存入Redis(60秒有效期) → 调用阿里云SMS API → 返回前端 -用户输入验证码 → 验证请求 → 后端从Redis取出比对 → 一致则标记验证成功 → 继续注册流程 +发送验证码流程: +用户输入手机号 → 发送验证码请求 → 后端生成6位随机码 → 存入Redis(Hash结构,60秒TTL) → 调用阿里云SMS API → 返回前端 + +验证验证码流程: +用户输入验证码 → 验证请求 → 检查Redis中验证码是否存在 → 比对code字段 → 失败则递增attempts,≥3次则删除Key → 验证成功则删除验证码Key并创建verify:register:{mobile}记录(300秒TTL) → 返回verify_token + +注册流程(需携带verify_token): +前端提交注册信息 → 后端检查verify:register:{mobile}是否存在且匹配 → 不匹配则拒绝 → 匹配则处理注册(创建用户、粉丝档案) → 删除verify:register记录 → 返回注册成功 ``` --- @@ -206,8 +212,10 @@ TTL: 60 秒 ### 7.3 防暴力破解策略 - **失败计数**:每次验证失败递增 attempts 字段,≥ 3 次后删除 Key,要求用户重新获取 -- **发送频率限制**:记录 `sms:limit:{mobile}:hour`,每小时最多发送 10 次,超限返回 429 -- **IP 维度限流**(可选):记录 `sms:limit:{ip}:hour`,每 IP 每小时最多请求 30 次 +- **发送频率限制**:每小时最多发送 10 次,超限返回 429 + - 使用独立 Key `sms:limit:register:{mobile}` 计数(String 类型,TTL=3600 秒) +- **IP 维度限流**(可选):每 IP 每小时最多请求 30 次 + - 使用独立 Key `sms:limit:ip:{ip}` 计数(String 类型,TTL=3600 秒) ### 7.4 验证后处理 @@ -317,20 +325,15 @@ Content-Type: application/json ## 10. 部署说明 1. 在阿里云短信服务控制台创建签名和模板,获取 `SignName` 和 `TemplateCode` -2. 在 `deploy/envs/user.env` 中配置阿里云 AccessKey: +2. 在 `deploy/envs/user.env` 中配置阿里云短信 AccessKey: ```bash -# 阿里云短信配置 +# 阿里云短信配置(直接使用 AccessKey,非 STS) SMS_ACCESS_KEY_ID=your_access_key_id SMS_ACCESS_KEY_SECRET=your_access_key_secret SMS_SIGN_NAME=TopFans SMS_TEMPLATE_CODE=SMS_xxxxxxx SMS_REGION=cn-hangzhou - -# 阿里云 OSS 配置(复用同一套凭证) -OSS_ACCESS_KEY_ID=your_access_key_id -OSS_ACCESS_KEY_SECRET=your_access_key_secret -OSS_STS_ROLE_ARN=acs:ram::1387642798143585:role/top-fans-oss-user ``` 3. 重启 userService 服务