我通过 Android 应用程序发送 POST 请求来创建用户,该请求包含用户名、密码和电子邮件 ID。现在在我的应用程序中,有两种用户,即教师和学生。现在,为了在注册过程中区分教师和学生,我想向教师发送一封包含随机生成的 token 的验证电子邮件。现在我希望老师在注册过程中输入这个 token ,以验证实际上是一位老师正在注册,而不是某个只想惹恼大家的顽皮学生。 我能够发送包含 token 的电子邮件,但无法理解当教师在注册时在应用程序上输入 token 与发送到电子邮件 ID 的 token 相匹配时,我将如何验证它。
下面是我的序列化器的代码,用于发送包含 token 的电子邮件
class UserSerializer(serializers.ModelSerializer):
token = serializers.CharField(max_length=100, null=True, blank=True)
class Meta:
model = User
fields = ('id', 'username', 'password', 'email', 'token')
def create(self, validated_data):
user = User(username=validated_data['username'],
email=validated_data['email'])
user.set_password(validated_data['password'])
user.save()
subject = "Email verification for django"
message = account_activation_token.make_token(user)
send_mail(subject, message, settings.EMAIL_HOST_USER,
[user.email])
return user
正如您所看到的,在上面的代码中,我生成一个随机 token ,并在收到创建新用户的 POST 请求时发送电子邮件。现在,我的用户将在应用程序中输入电子邮件中的 token 并发送 POST 请求。现在我想检查用户输入的 token 是否与上面代码中生成的 token 相同,以便我可以验证用户并继续填写注册表单。
PS:我的用户模型不包含 token 字段,因为我正在使用 Django 提供的内置用户模型并将其连接到教师 使用一对一字段的模型
PPS:还有其他方法可以用来实现上述功能吗?
最佳答案
您需要将 token 保存在您这边(数据库),以将其与老师在表单中输入的 token 相匹配。所以先做一个模型。
class Token(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
token = models.CharField(max_length=255)
生成 token 的行在创建用户之后出现,因此您可以仅使用用户实例并将 token 保存到您刚刚创建的模型中:
def create(self, validated_data):
...
message = account_activation_token.make_token(user)
Token.objects.create(user=user, token=message)
send_mail(subject, message, settings.EMAIL_HOST_USER,
...
接下来,您在 View 中使用以下代码来检查用户是否输入了正确的 token :
...
token_obj = Token.objects.get(user=user)
user_token = token_obj.token
if form.data['token'] == user_token:
# code to accept the user
token_obj.delete() # this deletes the row since you will not use it anymore
else:
# code to reject the user
注意:请不要复制粘贴这些代码。进行相应调整。
关于django - 使用 Django Rest 框架进行注册电子邮件验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48610016/