You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django应用中实现通过SMS短信重置密码功能

Django 短信重置密码实现方案

1. 扩展用户模型支持手机号字段

首先需要让你的用户体系支持手机号存储,推荐直接扩展Django默认的AbstractUser:

from django.contrib.auth.models import AbstractUser
from django.db import models

class CustomUser(AbstractUser):
    # 可根据你的需求调整长度,大陆手机号11位足够
    phone_number = models.CharField(max_length=11, unique=True, verbose_name="绑定手机号")

配置项目settings.py指定自定义用户模型:

AUTH_USER_MODEL = "你的应用名称.CustomUser"

2. 封装短信发送工具

自行对接你选择的短信服务商SDK,封装成通用的发送函数即可,无需额外引入第三方Django包:

# 示例工具函数,替换为对应服务商的实际发送逻辑
def send_reset_sms(phone: str, code: str) -> bool:
    # 调用短信服务商API发送包含验证码的短信
    # 返回布尔值标识发送结果
    return True

3. 实现验证码存储与校验逻辑

推荐用Django缓存(如Redis)存储验证码,天然支持过期时间配置:

  • 缓存key规则可设为reset_pwd:手机号,value存储验证码和生成时间,过期时间统一设为300秒(5分钟)
  • 发送验证码前先校验手机号是否在用户表中存在,不存在直接返回错误,避免无意义的短信消耗
  • 增加频率限制:同一手机号1分钟内仅允许请求1次验证码,单日请求上限设为10次,防止短信轰炸

4. 自定义密码重置流程

无需复用Django自带的邮箱重置逻辑,自己写对应业务视图即可,流程如下:

  • 第一步:用户提交手机号,后端校验手机号合法且存在后,生成6位随机验证码,存入缓存,调用短信接口发送
  • 第二步:用户提交手机号+验证码,后端和缓存内容比对,校验通过后允许用户输入新密码
  • 第三步:用户提交新密码,后端加密后更新对应用户的password字段,同时清空对应缓存的验证码,避免重复使用

安全优化建议

  • 验证码连续输错5次后,冻结该手机号的重置请求1小时,防止暴力破解
  • 密码重置成功后,调用user.auth_session_set.all().delete()清空该用户所有历史登录态,避免账号风险

内容的提问来源于stack exchange,提问作者Josphat Gitogo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 22:09:03