uniapp+vue3+python对接阿里云短信认证服务alibabacloud_dypnsapi20170525

📱 手机号功能全流程分析

🔄 业务流程分析

1. 手机号注册流程

PlainText 复制代码
前端(register.vue) → 后端(auth.py) → 阿里云短信服务 → 数据库

详细步骤:

  1. 用户输入:用户名 + 手机号(11位) + 密码 + 确认密码
  2. 点击"获取验证码" → 调用 sendSmsCode API
  3. 后端生成6位随机验证码 → 调用阿里云API发送短信
  4. 验证码存储到内存 sms_codes['register:手机号']
  5. 用户收到短信 → 输入验证码 → 点击"注册"
  6. 后端校验验证码 → 校验用户名/手机号唯一性 → 写入数据库

2. 手机号登录流程

PlainText 复制代码
前端(login.vue) → 后端(auth.py) → 数据库验证 → JWT Token

详细步骤:

  1. 用户切换到"验证码登录"标签页
  2. 输入手机号(11位) → 点击"获取验证码"
  3. 后端发送短信 → 存储验证码 sms_codes['login:手机号']
  4. 用户输入验证码 → 点击"登录"
  5. 后端校验验证码 → 查询数据库验证手机号是否已注册
  6. 生成JWT Token → 返回前端 → 跳转首页

3. 手机号找回密码流程

PlainText 复制代码
前端(forget.vue) → 后端(auth.py) → 阿里云短信 → 数据库更新

详细步骤:

  1. 用户输入已注册的手机号
  2. 点击"获取验证码" → 后端发送短信 sms_codes['forget:手机号']
  3. 用户输入验证码 + 新密码 + 确认新密码
  4. 后端校验验证码 → 验证手机号存在性 → 更新密码哈希值
  5. 提示成功 → 跳转登录页

📦 使用的第三方库

后端依赖 (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访问控制(必须)

配置步骤:

  1. 创建RAM子用户(或使用主账号)
  2. 获取 AccessKey ID 和 AccessKey Secret
  3. 授予权限策略:
    • AliyunDypnsFullAccess(推荐)
    • 或自定义策略包含:
      • dypns:SendSmsVerifyCode - 发送验证码
      • dypns:CheckSmsVerifyCode - 校验验证码

3. 短信签名配置

在号码认证服务控制台配置短信签名(个人开发者可使用预置签名)


🔐 安全机制

后端安全控制

  1. 发送频率限制

    Python 复制代码
    # 60秒内同一场景同一手机号只能发送一次
    if current_time - last_send_time < config['interval']:
        return jsonify({"msg": f"请{remaining}秒后再试"}), 400
  2. 验证码有效期

    Python 复制代码
    # 5分钟(300秒)后验证码过期
    if current_time - sms_info['time'] > config['valid_time']:
        return jsonify({"msg": "验证码已过期"}), 400
  3. 一次性使用

    Python 复制代码
    # 验证码使用后立即失效
    if sms_info['used']:
        return jsonify({"msg": "验证码已使用"}), 400
    sms_info['used'] = True
  4. 密码加密存储

    Python 复制代码
    from werkzeug.security import generate_password_hash
    hashed_password = generate_password_hash(password)  # BCrypt加密
  5. JWT Token认证

    Python 复制代码
    from flask_jwt_extended import create_access_token
    access_token = create_access_token(identity=str(user.id))

前端安全控制

  1. 表单验证

    • 手机号长度 >= 11位
    • 验证码必须6位
    • 密码长度 >= 6位
    • 两次密码输入一致
  2. 倒计时防刷

    JavaScript 复制代码
    countdown.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

⚠️ 注意事项

  1. 环境变量配置
    • 必须在 .env 文件或系统环境变量中配置阿里云AccessKey
    • 不要将密钥提交到代码仓库
  2. 生产环境优化
    • 使用Redis存储验证码(支持分布式)
    • 添加IP限流防刷
    • 日志记录所有短信发送记录
    • 监控短信发送失败率
  3. 合规要求
    • 短信内容需符合运营商规范
    • 不得发送营销类短信
    • 验证码仅用于身份验证
  4. 成本控制
    • 阿里云短信认证按成功发送计费
    • 建议设置每日发送上限
    • 监控短信费用支出
相关推荐
chushiyunen1 小时前
pygame实现射击游戏
python·游戏·pygame
sinat_383437361 小时前
如何在 Laravel 中筛选并格式化匹配预定义列表的产品数据
jvm·数据库·python
2401_846339561 小时前
mysql如何用执行流程思维写好SQL_SQL优化方法总结
jvm·数据库·python
forEverPlume1 小时前
SQL如何统计分组内不重复值的数量_COUNT与DISTINCT结合应用
jvm·数据库·python
chaofan9802 小时前
突破大模型落地瓶颈:Claude 4.7 与 GPT-5.5 长上下文工程实测
数据库·人工智能·python·gpt·自动化·php·api
2501_901200532 小时前
PHP源码部署需要多大硬盘空间_PHP项目存储空间估算方法【方法】
jvm·数据库·python
豆瓣鸡2 小时前
Agent实战练习
java·python·学习
2401_832365522 小时前
mysql如何优化mysql在多核CPU下的性能_调整线程并发数
jvm·数据库·python
m0_736439302 小时前
JavaScript中显式创建包装对象的后果与性能损耗
jvm·数据库·python