Django 基于UserCreationForm实现用户修改邮箱及新邮箱激活验证
邮箱修改功能的流程改造方案
现有实现的核心缺陷是表单提交后直接覆盖User模型的正式邮箱字段,跳过了新邮箱所有权的验证环节。完整的改造逻辑完全围绕「暂存待验证新邮箱→发送带签名的激活链接→激活校验通过后正式更新绑定关系」的流程搭建,不需要推翻已写好的表单、视图、路由基础代码。
核心流程逻辑
- 表单校验通过后,不直接将新邮箱写入User模型的
email字段,而是将待验证的新邮箱与用户身份绑定存入可靠的临时存储 - 生成带签名的一次性激活链接,发送至用户提交的新邮箱
- 激活视图先校验签名有效性、链接有效期、新邮箱占用状态,全部通过后再将新邮箱正式写入User模型,清除对应的临时记录
分步改造细节
1. 补充临时存储结构
为避免直接修改正式User表数据造成的安全风险,新增与User关联的临时存储表,存储待验证的邮箱内容:
对应模型
PendingEmailChange核心字段:
- 关联当前登录用户的外键字段,绑定到内置User模型
new_email字段,存储待验证的新邮箱地址created_at字段,用于计算链接有效期
每次用户提交修改邮箱申请时,先删除对应用户之前的全部待验证记录,避免生成多份可激活的旧链接
2. 改造现有EmailChangeForm
- 调整表单的绑定关系,从「直接更新User模型的email字段」改为「创建/更新PendingEmailChange的临时记录」
- 保留已实现的重复邮箱校验逻辑:校验提交的新邮箱没有被其他正式注册账号占用
- 重写
save()方法,不要触发User模型的直接更新,仅返回待创建的临时记录实例即可
3. 改造现有EmailChange视图
由于原视图继承自UpdateView,默认逻辑是表单校验通过后直接更新绑定的模型对象,需要重写form_valid方法替换原有逻辑:
def form_valid(self, form): # 清理该用户历史待验证记录 PendingEmailChange.objects.filter(user=self.request.user).delete() # 保存新的待验证临时记录 pending_record = form.save(commit=False) pending_record.user = self.request.user pending_record.save() # 生成带时间戳的签名,内置校验篡改和过期逻辑 signer = TimestampSigner() signed_token = signer.sign(f"{self.request.user.id}:{pending_record.new_email}") # 拼接激活路由的完整地址 activate_link = reverse("accounts:activate-email-change") + f"?token={signed_token}" # 调用项目已配置的邮件发送工具,将激活链接发送至pending_record.new_email # 渲染提示页面,告知用户验证邮件已发送至新邮箱,激活后才会完成绑定 return render(self.request, "email_change_sent.html", {})
- 前端表单提交后,不会直接更新用户的绑定邮箱,仅生成待验证记录和对应激活邮件
4. 完善激活路由的视图逻辑
之前已经配置好激活路由,只需要补充对应的视图逻辑:
- 接收URL中传入的签名token,使用
TimestampSigner完成三层校验:- 校验签名是否被篡改,通过异常捕获判断签名有效性
- 通过
max_age参数判断链接是否超过预设的24小时有效期 - 解析签名内的用户ID、新邮箱内容,判断对应用户是否存在
- 全部校验通过后,做兜底的重复邮箱检查:确认当前待绑定的新邮箱没有被其他正式账号占用
- 校验通过后,执行用户模型的邮箱更新:直接修改对应用户的
email字段并调用save()方法 - 同步删除对应用户的全部PendingEmailChange临时记录,避免用户重复点击旧链接触发异常
- 渲染成功提示页面,告知用户邮箱绑定已正式生效
常见注意事项
- 不要将待验证的新邮箱存储在用户会话中:用户需要跨设备登录新邮箱查看邮件,本地会话的存储内容无法被跨设备的激活流程读取
- 不要使用无签名的明文参数拼接激活链接:直接在URL中传输
user_id、new_email等明文参数极易被篡改,可能造成恶意用户修改他人账号的绑定邮箱 - 签名的内容不要携带用户的密码、旧邮箱地址等敏感信息,仅需包含身份校验必需的字段即可
- 邮件发送失败时,要给用户明确的提示,不要静默失败
内容的提问来源于stack exchange,提问作者Kok Hyvv
相关产品推荐
相关产品推荐

