📱 手机号功能全流程分析
🔄 业务流程分析
1. 手机号注册流程
PlainText
前端(register.vue) → 后端(auth.py) → 阿里云短信服务 → 数据库
详细步骤:
- 用户输入:用户名 + 手机号(11位) + 密码 + 确认密码
- 点击"获取验证码" → 调用 sendSmsCode API
- 后端生成6位随机验证码 → 调用阿里云API发送短信
- 验证码存储到内存 sms_codes['register:手机号']
- 用户收到短信 → 输入验证码 → 点击"注册"
- 后端校验验证码 → 校验用户名/手机号唯一性 → 写入数据库
2. 手机号登录流程
PlainText
前端(login.vue) → 后端(auth.py) → 数据库验证 → JWT Token
详细步骤:
- 用户切换到"验证码登录"标签页
- 输入手机号(11位) → 点击"获取验证码"
- 后端发送短信 → 存储验证码 sms_codes['login:手机号']
- 用户输入验证码 → 点击"登录"
- 后端校验验证码 → 查询数据库验证手机号是否已注册
- 生成JWT Token → 返回前端 → 跳转首页
3. 手机号找回密码流程
PlainText
前端(forget.vue) → 后端(auth.py) → 阿里云短信 → 数据库更新
详细步骤:
- 用户输入已注册的手机号
- 点击"获取验证码" → 后端发送短信 sms_codes['forget:手机号']
- 用户输入验证码 + 新密码 + 确认新密码
- 后端校验验证码 → 验证手机号存在性 → 更新密码哈希值
- 提示成功 → 跳转登录页
📦 使用的第三方库
后端依赖 (requirements.txt)
| 库名称 | 版本 | 用途 |
|---|---|---|
| Flask | 2.0.1 | Web框架 |
| Flask-JWT-Extended | 4.3.1 | JWT认证 |
| Flask-SQLAlchemy | 2.5.1 | ORM数据库操作 |
| Flask-CORS | 3.0.10 | 跨域支持 |
| Werkzeug | 2.0.1 | 密码哈希加密 |
| alibabacloud_dypnsapi20170525 | 2.0.0 | 阿里云短信认证SDK |
| alibabacloud_tea_openapi | >=0.3.16 | 阿里云API基础库 |
| alibabacloud_tea_util | >=0.3.14 | 阿里云工具库 |
前端依赖 (uniapp/package.json)
| 库名称 | 用途 |
|---|---|
| Vue 3 | 前端框架 |
| Pinia | 状态管理 |
| uni-app | 跨平台框架 |
| axios | HTTP请求 |
| fontawesome | 图标库 |
🔑 配置项详解
后端配置 (backend/config/config.py)
Python
# 阿里云短信认证配置
ALIBABA_CLOUD_ACCESS_KEY_ID = os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID') or ''
ALIBABA_CLOUD_ACCESS_KEY_SECRET = os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET') or ''
# 短信签名和模板
SMS_SIGN_NAME = os.environ.get('SMS_SIGN_NAME') or '速通互联验证码'
SMS_LOGIN_REGISTER_TEMPLATE = os.environ.get('SMS_LOGIN_REGISTER_TEMPLATE') or '100001' # 登录/注册模板
SMS_RESET_PASSWORD_TEMPLATE = os.environ.get('SMS_RESET_PASSWORD_TEMPLATE') or '100003' # 重置密码模板
# 短信参数
SMS_INTERVAL = int(os.environ.get('SMS_INTERVAL') or '60') # 发送间隔(秒)
SMS_VALID_TIME = int(os.environ.get('SMS_VALID_TIME') or '300') # 验证码有效期(秒)

阿里云模板参数

☁️ 需要开通的阿里云服务
1. 号码认证服务 - 短信认证
开通路径:
阿里云控制台 → 号码认证服务 → 短信认证 → 开通服务
服务特点:
- ✅ 个人开发者可用(无需企业资质)
- ✅ 预置签名和模板(无需申请)
- ✅ 失败不计费
- ✅ 支持多端(App/Web/H5/小程序)
2. RAM访问控制(必须)
配置步骤:
- 创建RAM子用户(或使用主账号)
- 获取 AccessKey ID 和 AccessKey Secret
- 授予权限策略:
- AliyunDypnsFullAccess(推荐)
- 或自定义策略包含:
- dypns:SendSmsVerifyCode - 发送验证码
- dypns:CheckSmsVerifyCode - 校验验证码
3. 短信签名配置
在号码认证服务控制台配置短信签名(个人开发者可使用预置签名)
🔐 安全机制
后端安全控制
-
发送频率限制
Python# 60秒内同一场景同一手机号只能发送一次 if current_time - last_send_time < config['interval']: return jsonify({"msg": f"请{remaining}秒后再试"}), 400 -
验证码有效期
Python# 5分钟(300秒)后验证码过期 if current_time - sms_info['time'] > config['valid_time']: return jsonify({"msg": "验证码已过期"}), 400 -
一次性使用
Python# 验证码使用后立即失效 if sms_info['used']: return jsonify({"msg": "验证码已使用"}), 400 sms_info['used'] = True -
密码加密存储
Pythonfrom werkzeug.security import generate_password_hash hashed_password = generate_password_hash(password) # BCrypt加密 -
JWT Token认证
Pythonfrom flask_jwt_extended import create_access_token access_token = create_access_token(identity=str(user.id))
前端安全控制
-
表单验证
- 手机号长度 >= 11位
- 验证码必须6位
- 密码长度 >= 6位
- 两次密码输入一致
-
倒计时防刷
JavaScriptcountdown.value = 60; // 60秒倒计时
📊 数据存储
内存存储(开发环境)
Python
# 验证码存储结构
sms_codes = {
'register:13800138000': {
'code': '123456',
'time': 1234567890.0,
'used': False
}
}
# 发送时间记录(防刷)
sms_send_times = {
'register:13800138000': 1234567890.0
}
⚠️ 生产环境建议: 使用Redis替代内存存储,支持分布式部署
数据库存储(MySQL/SQLite)
Python
# User模型
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
password_hash = db.Column(db.String(128), nullable=False)
phone = db.Column(db.String(20), default='') # 存储格式: 13800138000
email = db.Column(db.String(120))
avatar = db.Column(db.String(255))
🎯 关键API接口
| 接口路径 | 方法 | 功能 | 认证 |
|---|---|---|---|
| /send-sms-code | POST | 发送短信验证码 | 无需 |
| /verify-sms-code | POST | 校验短信验证码 | 无需 |
| /login | POST | 用户登录 | 无需 |
| /register | POST | 用户注册 | 无需 |
| /forgot-password | POST | 重置密码 | 无需 |
| /user/info | GET | 获取用户信息 | JWT |
| /user/password | PUT | 修改密码 | JWT |
⚠️ 注意事项
- 环境变量配置
- 必须在 .env 文件或系统环境变量中配置阿里云AccessKey
- 不要将密钥提交到代码仓库
- 生产环境优化
- 使用Redis存储验证码(支持分布式)
- 添加IP限流防刷
- 日志记录所有短信发送记录
- 监控短信发送失败率
- 合规要求
- 短信内容需符合运营商规范
- 不得发送营销类短信
- 验证码仅用于身份验证
- 成本控制
- 阿里云短信认证按成功发送计费
- 建议设置每日发送上限
- 监控短信费用支出