如何验证输入邮箱是否已存在于数据库?Django OTP登录问题求助
邮箱存在性校验实现方案
1 修复基础参数获取错误
当前前端AJAX发送的是POST请求,但你在send_otp视图中使用request.GET获取邮箱参数,会无法拿到正确的邮箱值,首先修正该问题:
# 原代码 email = request.GET.get("email") # 修改为 email = request.POST.get("email")
2 添加邮箱存在性校验逻辑
假设你使用Django默认的User用户模型,在校验前先查询数据库中是否存在对应该邮箱的已注册用户:
# 首先在views.py顶部导入用户模型 from django.contrib.auth.models import User from django.http import JsonResponse # 改造后的send_otp视图 def send_otp(request): email = request.POST.get("email") # 校验邮箱是否存在 if not User.objects.filter(email=email).exists(): # 不存在则返回错误状态和提示 return JsonResponse({"msg": "该邮箱未注册"}, status=400) o = generateOTP() # 此处保留你原有发送邮件的逻辑 print(o) # 注意:直接返回OTP到前端存在严重安全风险,优化建议见后文 return HttpResponse(o)
如果你使用的是自定义用户模型,把上面导入的User替换为你自定义的用户类即可。
3 调整前端逻辑适配校验结果
当前前端只要请求状态成功就直接显示OTP输入框,需要新增错误场景的处理:
function ajax_send_otp(){ email = document.getElementById("email"); $.post("/send_otp", { "email":email.value, "csrfmiddlewaretoken":"{{csrf_token}}" }, function(data, status){ if(status=="success"){ otp_from_back = data; document.getElementById("email_div").style.display='none'; document.getElementById("otp_div").style.display='block'; } } ).fail(function(res){ // 处理邮箱不存在的错误 document.getElementById("verify_text_div").style.color="red"; document.getElementById("verify_text_div").innerHTML= res.responseJSON.msg; document.getElementById("email_div").style.display='block'; }); }
安全优化建议
- 现有方案把OTP明文返回给前端、由前端做校验的逻辑风险极高,恶意用户可以直接抓包获取OTP值跳过邮件校验。建议将生成的OTP存储在服务端
session中(request.session['otp'] = o,同时设置过期时间),OTP校验接口在后端比对用户输入的值和session中存储的OTP,不要把OTP暴露到前端。 - 建议添加OTP发送频率限制,避免接口被恶意调用发送垃圾邮件。
- OTP需要设置有效期,超过5分钟未校验自动失效。
内容的提问来源于stack exchange,提问作者Eternity
相关产品推荐
相关产品推荐

