如何在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
相关产品推荐
相关产品推荐

