django - 使用 Django Rest 框架进行注册电子邮件验证

标签 django authentication django-rest-framework django-authentication django-rest-auth

我通过 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/

相关文章:

android - Google Identity Signin API 始终返回带有服务器客户端 ID 的 NULL

django - 为什么 Django REST Framework 提供不同的身份验证机制

python - Django rest framework/simplejson 错误 __init__() 得到了一个意外的关键字参数

python - 使用 SelectDateWidget 的 Django 表单字段

python - django get_or_create 取决于自定义管理器方法的结果

python - 即使用户已经登录,也会显示登录页面

python - 如何在 django rest 框架中获取外键字段名称而不是 id

javascript - 在django中长时间处理时显示加载gif?

python - 一般如何创建仅测试 Django 模型(特别是使用 pytest-django)

mongodb - 如何在 mongodb 配置文件中设置授权?