django 完成邮件验证

Posted

技术标签:

【中文标题】django 完成邮件验证【英文标题】:django complete email verification 【发布时间】:2021-07-24 11:37:42 【问题描述】:

在将这个问题标记为可能重复之前,我想解决一些问题。

我想确保用户有一个名为 email 的电子邮件字段。他们还有一个is_verified 字段来指示电子邮件是否已经过验证。

大多数电子邮件验证实施都存在一些缺陷。 假设用户创建了一个帐户并拥有未经验证的电子邮件。不过,假设用户实际上并不拥有电子邮件。

现在,电子邮件的实际所有者进入了网站。但是,由于电子邮件已经保存在数据库中,我们会收到一个完整性错误 - 电子邮件已在使用中。

因此,任何诈骗者都可以输入随机电子邮件并认领它。 这会降低用户体验。如何避免这种情况,从而提供完整的电子邮件验证系统? (实际所有者可以声明其电子邮件的一种)

那么,当一个用户注册了一个已经被另一个用户拥有但未经验证的电子邮件时,是否应该删除现有用户?或者我们应该显示完整性错误消息?什么是正确的做法?

非常感谢!

【问题讨论】:

您使用的是自定义用户模型吗?内置模型对电子邮件地址没有唯一约束 是的,我正在使用自定义用户模型 您能否允许重复的电子邮件,但添加一个限制,即每封电子邮件只允许一个活动帐户? 您不会向用户发送电子邮件以验证他们的电子邮件地址吗?这样用户可能会知道有人试图使用他们的电子邮件地址,如果他们真的想创建一个帐户,可以尝试重置他们的密码。 @IainShelvington 是的,我可以这样做,但是如果一个用户要求重新发送激活电子邮件,那么每个拥有该电子邮件已验证或未验证的用户都会收到它,对吧? 【参考方案1】:

是的,在注册过程中添加验证步骤非常重要。

所以首先创建一个电子邮件模板并发送一封独特的电子邮件 注册时向用户发送代码。实施免费电子邮件服务 从 Django 开始:

在这里查看我的答案: How to send email via Django?

比在寄存器函数中每次生成一个随机字符串 查看通过邮件发送验证码。例如。

verifyCode = random.choice( ["a", "b", "c", "d", "x", "y", "z"]) + str(random.randint(100000, 1000000))

创建一个临时表来存储未经验证的用户数据并 邮件验证完成后将其删除,然后将其存储在主 用户表。

根据您的最后一个问题,如果用户使用未经验证的电子邮件进行注册,则不应将其存储在主用户表中。不要使用该电子邮件和用户名登录(授予访问权限)该用户到您的站点。

希望这是你想要的。

【讨论】:

感谢您的回复!我想这就是我想要的。【参考方案2】:

如果你没有使用邮箱进行身份验证(所以 username_field 不是邮箱),你可以将 email 字段设置为 not unique 字段,然后在 注册视图中注册用户时 或在 customUserManager 中,您可以验证其是否仅对已验证电子邮件的用户唯一(因此,如果电子邮件存在且已验证,则不要创建新用户)。

当然会有人创建两个帐户(在验证其中任何一个之前)然后尝试同时验证其中两个帐户的情况,在这种情况下,当您第一次激活电子邮件时,请删除所有其他帐户使用相同的电子邮件(未验证的电子邮件)。

【讨论】:

以上是关于django 完成邮件验证的主要内容,如果未能解决你的问题,请参考以下文章

Django 自定义用户电子邮件帐户验证

Django中电子邮件验证的实现

验证 Django 中是不是存在电子邮件 [重复]

在 django 中生成用于通过电子邮件验证用户的验证 URL

Django - 身份验证,使用电子邮件确认注册

Django 1.11-如何使用仅支持NTLM身份验证的邮件服务器发送邮件