14 KiB
14 KiB
短信验证码功能实施总结
概述
本文档总结了短信验证码功能的完整实施情况,包括后端API、Android客户端、测试和部署等所有方面。
实施日期
2024-01-27
实施内容
一、后端实施 (FastAPI)
1. 数据库模型
新增表:sms_verification_codes
| 字段 | 类型 | 说明 |
|---|---|---|
| id | VARCHAR | 主键ID |
| phone | VARCHAR | 手机号 |
| code | VARCHAR | 6位验证码 |
| purpose | VARCHAR | 用途(register/login/reset_password/change_phone) |
| is_used | BOOLEAN | 是否已使用 |
| is_expired | BOOLEAN | 是否已过期 |
| expires_at | TIMESTAMP | 过期时间(5分钟) |
| created_at | TIMESTAMP | 创建时间 |
| verified_at | TIMESTAMP | 验证时间 |
| ip_address | VARCHAR | 请求IP地址 |
扩展表:refresh_tokens
- 新增字段:
device_info(VARCHAR) - 设备信息,用于全设备登出
索引:
idx_sms_phone- 手机号索引idx_sms_created_at- 创建时间索引idx_sms_purpose- 用途索引idx_sms_phone_purpose- 复合索引
2. 短信服务 (api/services/sms_service.py)
核心功能:
- ✅ 发送验证码(集成腾讯云SMS SDK)
- ✅ 验证验证码
- ✅ 频率限制(60秒内同一手机号只能发送一次)
- ✅ 验证码过期检查(5分钟)
- ✅ 验证码使用后标记
3. 认证路由扩展 (api/routers/auth.py)
新增API端点:
| 端点 | 方法 | 说明 |
|---|---|---|
/api/auth/sms/send |
POST | 发送验证码 |
/api/auth/login/sms |
POST | 验证码登录 |
/api/auth/register/sms |
POST | 验证码注册 |
/api/auth/password/reset |
POST | 重置密码 |
/api/auth/password/change |
POST | 修改密码(已登录) |
/api/auth/phone/change |
POST | 修改手机号 |
/api/auth/logout/all |
POST | 登出所有设备 |
4. 依赖配置
新增依赖:
tencentcloud-sdk-python>=3.0.1000
环境变量:
TENCENT_SMS_SECRET_ID=your_secret_id
TENCENT_SMS_SECRET_KEY=your_secret_key
TENCENT_SMS_SDK_APP_ID=your_app_id
TENCENT_SMS_SIGN_NAME=your_sign_name
# 统一使用一个短信模板ID(所有场景共用)
TENCENT_SMS_TEMPLATE_ID=your_template_id
二、Android端实施
1. 网络层扩展 (AuthService.kt)
新增方法:
- ✅
sendVerificationCode()- 发送验证码 - ✅
loginWithSms()- 验证码登录 - ✅
registerWithSms()- 验证码注册 - ✅
resetPassword()- 重置密码 - ✅
changePassword()- 修改密码 - ✅
changePhone()- 修改手机号 - ✅
logoutAll()- 登出所有设备
2. ViewModel扩展 (AuthViewModel.kt)
新增状态:
- ✅
smsCountdown- 验证码倒计时(60秒)
新增方法:
- ✅
sendVerificationCode()- 发送验证码 - ✅
loginWithSms()- 验证码登录 - ✅
registerWithSms()- 验证码注册 - ✅
resetPassword()- 重置密码 - ✅
changePassword()- 修改密码 - ✅
changePhone()- 修改手机号 - ✅
logoutAll()- 登出所有设备 - ✅
startCountdown()- 启动倒计时
3. UI组件
可复用组件:
- ✅
SmsCodeInput.kt- 验证码输入框(6位数字,自动聚焦) - ✅
SendSmsButton.kt- 发送验证码按钮(带倒计时) - ✅
CompactSendSmsButton.kt- 紧凑版发送按钮 - ✅
PasswordStrengthIndicator.kt- 密码强度指示器 - ✅
PasswordRequirements.kt- 密码要求提示
4. 新增页面
密码重置页面 (ResetPasswordScreen.kt)
- ✅ 手机号输入
- ✅ 发送验证码(带倒计时)
- ✅ 验证码输入
- ✅ 新密码输入
- ✅ 确认密码输入
- ✅ 密码强度指示
- ✅ 表单验证
- ✅ 成功后跳转登录
账户管理页面 (AccountManagementScreen.kt)
- ✅ 账户信息展示
- ✅ 修改密码对话框
- ✅ 修改手机号对话框
- ✅ 登出当前设备
- ✅ 登出所有设备(带二次确认)
5. 页面修改
注册页面 (RegisterScreen.kt)
- ✅ 已在之前的实施中完成
- ✅ 手机号输入框后添加"发送验证码"按钮
- ✅ 验证码输入框
- ✅ 倒计时显示
登录页面 (LoginScreen.kt)
- ✅ 添加"忘记密码"链接
- ✅ 跳转到密码重置页面
个人页面 (ProfileScreen.kt)
- ✅ 移除原有的"登出"按钮
- ✅ 在"设置"区域添加"账户管理"入口
- ✅ 仅在已登录时显示
6. 导航配置 (AppNavigation.kt)
新增路由:
- ✅
Screen.ResetPassword- 密码重置页面 - ✅
Screen.AccountManagement- 账户管理页面
路由配置:
- ✅ 密码重置成功后跳转到登录页面
- ✅ 登出成功后清空导航栈并跳转到登录页面
- ✅ 登录页面添加忘记密码回调
7. 图标扩展 (AppIcons.kt)
新增图标:
- ✅
ManageAccounts- 账户管理 - ✅
Lock- 锁(密码) - ✅
Phone- 手机 - ✅
ExitToApp- 登出 - ✅
DevicesOther- 多设备
三、测试
1. 后端测试脚本 (api/test_sms_verification.py)
测试模式:
- ✅ 交互式测试(需要真实短信验证码)
- ✅ 自动化测试(需要测试验证码支持)
- ✅ API连接测试
测试用例:
- ✅ 发送验证码
- ✅ 频率限制
- ✅ 验证码注册
- ✅ 验证码登录
- ✅ 密码重置
- ✅ 修改密码
- ✅ 修改手机号
- ✅ 登出所有设备
2. 测试文档
文档:
- ✅
api/docs/短信验证码测试指南.md- 完整的测试指南 - ✅ 包含手动测试步骤
- ✅ 包含常见问题解答
- ✅ 包含测试检查清单
四、部署
1. 数据库迁移
迁移脚本: api/migrations/add_sms_verification.sql
- ✅ 创建
sms_verification_codes表 - ✅ 创建索引
- ✅ 扩展
refresh_tokens表 - ✅ 添加表和字段注释
2. 部署文档
文档: api/docs/部署指南.md
- ✅ 腾讯云短信服务配置步骤
- ✅ 环境变量配置说明
- ✅ 数据库迁移步骤
- ✅ Docker部署配置
- ✅ Systemd部署配置
- ✅ GitHub Actions配置
- ✅ 监控与告警配置
- ✅ 安全加固建议
- ✅ 备份与恢复步骤
- ✅ 故障排查指南
- ✅ 性能优化建议
3. 部署脚本
脚本: api/deploy.sh
- ✅ 自动检查前置条件
- ✅ 验证环境变量
- ✅ 安装依赖
- ✅ 执行数据库迁移
- ✅ 验证部署
- ✅ 测试服务连接
4. GitHub Actions配置文档
文档: github-actions-secrets.md
- ✅ 列出所有需要配置的Secrets
- ✅ 配置步骤说明
功能特性
安全性
- ✅ 验证码采用6位随机数字
- ✅ 5分钟过期时间
- ✅ 60秒发送频率限制
- ✅ 验证码使用后立即标记
- ✅ 密码修改需验证旧密码
- ✅ 手机号修改需验证码验证
- ✅ 敏感操作记录IP地址
- ✅ 密码强度验证
用户体验
- ✅ 倒计时显示(60秒)
- ✅ 自动聚焦验证码输入框
- ✅ 实时表单验证
- ✅ 友好的错误提示
- ✅ 加载状态指示
- ✅ 成功后自动跳转
- ✅ 密码强度可视化
- ✅ 二次确认(危险操作)
性能优化
- ✅ 验证码查询使用索引
- ✅ 数据库连接池
- ✅ 异步操作
- ✅ 错误重试机制
文件清单
后端文件
api/
├── services/
│ └── sms_service.py # 短信服务(新增)
├── migrations/
│ └── add_sms_verification.sql # 数据库迁移脚本(新增)
├── docs/
│ ├── 短信验证码测试指南.md # 测试指南(新增)
│ └── 部署指南.md # 部署指南(新增)
├── test_sms_verification.py # 测试脚本(新增)
├── deploy.sh # 部署脚本(新增)
├── requirements.txt # 更新依赖
├── .env.production # 更新环境变量
└── routers/auth.py # 扩展认证路由
Android文件
app-android/app/src/main/java/com/huaga/life_echo/
├── ui/
│ ├── screens/
│ │ ├── ResetPasswordScreen.kt # 密码重置页面(新增)
│ │ ├── AccountManagementScreen.kt # 账户管理页面(新增)
│ │ ├── RegisterScreen.kt # 修改(已在之前完成)
│ │ ├── LoginScreen.kt # 修改
│ │ └── ProfileScreen.kt # 修改
│ ├── components/auth/
│ │ ├── SmsCodeInput.kt # 验证码输入框(已存在)
│ │ ├── SendSmsButton.kt # 发送验证码按钮(已存在)
│ │ └── PasswordStrengthIndicator.kt # 密码强度指示器(已存在)
│ └── icons/
│ └── AppIcons.kt # 扩展图标
├── viewmodel/
│ └── AuthViewModel.kt # 扩展(已在之前完成)
├── network/
│ ├── AuthService.kt # 扩展(已在之前完成)
│ └── models/
│ └── AuthModels.kt # 扩展(已在之前完成)
└── navigation/
└── AppNavigation.kt # 扩展
文档文件
├── SMS_VERIFICATION_IMPLEMENTATION_STATUS.md # 实施状态(已存在)
├── SMS_VERIFICATION_IMPLEMENTATION_SUMMARY.md # 实施总结(本文档)
└── github-actions-secrets.md # GitHub Actions配置(已存在)
API文档
发送验证码
POST /api/auth/sms/send
Content-Type: application/json
{
"phone": "13800138000",
"purpose": "register" // register/login/reset_password/change_phone
}
Response 200:
{
"message": "验证码已发送",
"expires_in": 300
}
Response 429:
{
"detail": "发送过于频繁,请60秒后再试"
}
验证码登录
POST /api/auth/login/sms
Content-Type: application/json
{
"phone": "13800138000",
"code": "123456"
}
Response 200:
{
"access_token": "eyJ...",
"refresh_token": "eyJ...",
"token_type": "bearer"
}
验证码注册
POST /api/auth/register/sms
Content-Type: application/json
{
"phone": "13800138000",
"code": "123456",
"password": "password123",
"nickname": "用户昵称",
"email": "optional@email.com"
}
Response 201:
{
"access_token": "eyJ...",
"refresh_token": "eyJ...",
"token_type": "bearer"
}
重置密码
POST /api/auth/password/reset
Content-Type: application/json
{
"phone": "13800138000",
"code": "123456",
"new_password": "newpassword123"
}
Response 200:
{
"message": "密码重置成功"
}
修改密码(已登录)
POST /api/auth/password/change
Authorization: Bearer <access_token>
Content-Type: application/json
{
"old_password": "oldpassword123",
"new_password": "newpassword123"
}
Response 200:
{
"message": "密码修改成功"
}
修改手机号
POST /api/auth/phone/change
Authorization: Bearer <access_token>
Content-Type: application/json
{
"new_phone": "13900139000",
"code": "123456"
}
Response 200:
{
"id": "user_id",
"phone": "13900139000",
"nickname": "用户昵称",
...
}
登出所有设备
POST /api/auth/logout/all
Authorization: Bearer <access_token>
Response 200:
{
"message": "已登出所有设备"
}
使用说明
开发环境测试
- 启动后端服务:
cd api
python main.py
- 运行测试脚本:
cd api
python test_sms_verification.py
- 运行Android应用并测试各个功能
生产环境部署
-
配置腾讯云短信服务(参考部署指南)
-
配置环境变量:
cd api
cp .env.production.example .env.production
# 编辑 .env.production,填入实际配置
- 运行部署脚本:
cd api
./deploy.sh
- 或使用Docker部署:
cd api
docker-compose up -d
注意事项
安全
-
保护API密钥
- 不要将腾讯云API密钥提交到Git仓库
- 使用环境变量或密钥管理服务
- 定期轮换密钥
-
验证码安全
- 验证码仅5分钟有效
- 使用后立即失效
- 60秒频率限制防止暴力破解
-
密码安全
- 强制最小长度(6位)
- 建议包含大小写字母、数字和特殊字符
- 密码加密存储
性能
-
数据库优化
- 使用索引加速查询
- 定期清理过期验证码
- 监控数据库性能
-
短信发送
- 异步发送避免阻塞
- 监控发送成功率
- 设置合理的超时时间
-
缓存
- 使用Redis缓存频率限制状态
- 缓存用户会话信息
监控
-
关键指标
- 短信发送成功率
- 验证码验证成功率
- API响应时间
- 错误率
-
日志
- 记录所有短信发送操作
- 记录验证失败原因
- 记录异常情况
-
告警
- 发送失败率过高
- API响应时间过长
- 数据库连接失败
后续优化建议
功能增强
-
验证码类型
- 支持语音验证码
- 支持邮箱验证码
- 支持图形验证码(防机器人)
-
安全增强
- 设备指纹识别
- 异常登录检测
- 多因素认证(MFA)
-
用户体验
- 验证码自动填充(Android SMS Retriever API)
- 记住设备(免验证码登录)
- 生物识别登录
性能优化
-
缓存优化
- 缓存用户信息
- 缓存验证码状态
- 使用CDN加速
-
数据库优化
- 分表分库
- 读写分离
- 使用时序数据库存储验证码记录
-
服务优化
- 使用消息队列处理短信发送
- 负载均衡
- 服务降级和熔断
相关文档
联系方式
如有问题或建议,请联系开发团队。
更新日志
- 2024-01-27: 完成短信验证码功能实施
- 后端API实现
- Android客户端实现
- 测试脚本和文档
- 部署脚本和文档
实施完成日期: 2024-01-27
实施人员: AI Assistant
状态: ✅ 已完成