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. 成本控制
    • 阿里云短信认证按成功发送计费
    • 建议设置每日发送上限
    • 监控短信费用支出
相关推荐
biter down2 小时前
从 0 到 1 搭建 Python 接口自动化测试框架(博客系统实战)
开发语言·python
肖永威3 小时前
Python多业务并行计算框架插件化演进:从硬编码到动态注册
python·插件化·并行计算·动态注册
yz_aiks3 小时前
Linux Jar包配置Systemd自启动实战:从排查到配置全流程
linux·python·jar·自启动·systemd
不知名的老吴4 小时前
线程的生命周期之线程“插队“
java·开发语言·python
xsc6996755 小时前
从零搭建大模型与智能体平台 - 完整技术详解
python
ZHW_AI课题组5 小时前
调用阿里云实现文本翻译功能
阿里云·云计算
无风听海6 小时前
多租户系统中的 OIDC:Discovery 端点与联合登录的深度实践
后端·python·flask
CTA终结者6 小时前
期货量化主力换月程序怎么移仓:天勤 underlying_symbol 与任务切换
python·区块链
马士兵教育7 小时前
Java还有前景吗?Java+AI大模型学习路线及项目?
java·人工智能·python·学习·机器学习
KaMeidebaby7 小时前
卡梅德生物技术快报|纯化重组蛋白实操详解
人工智能·python·tcp/ip·算法·机器学习