Djoser 帐户验证系统是如何真正运作的?

How does Djoser account verification system really works under the hood?

所以我目前正在尝试制作自己的帐户验证系统,并且我正在使用 Djoser 的某些部分作为参考。让我试着引导你回答我的问题

假设您要在 Djoser 应用程序中创建一个新帐户

  1. 您输入了您即将创建的帐户的信息,包括电子邮件

  2. 提交表单到后台

  3. 向您之前输入的任何电子邮件帐户发送一封电子邮件以验证您的帐户

  4. 点击电子邮件中的 link

  5. 进入验证账户页面

现在在此页面中有一个提交 UID 和令牌的按钮,这两个信息都位于 URL。

我的问题是:

  1. 那些标记是什么?是智威汤逊吗?
  2. 它们是如何工作的?
  3. 如何在没有 djoser 的情况下在我自己的项目中实现它?

你的问题的答案都沉浸在djoser自己的代码中。 您可以查看 djoser.email 文件,在 classes 中,它们有几种方法 get_context_data().

def get_context_data(self):
    context = super().get_context_data()
    user = context.get("user")
    context["uid"] = utils.encode_uid(user.pk)
    context["token"] = default_token_generator.make_token(user)
    context["url"] = settings.ACTIVATION_URL.format(**context)
    return context

因此在实例所在的 class 中获取上下文,并在此上下文中添加 'uid'(这基本上是 str(pk) 并以 base64 编码,检查 encode_uid()),'token'(只是一个随机字符串,使用 Django 函数从您的密钥创建;您可以使用 PASSWORD_RESET_TIMEOUT 设置更改该函数的算法和此令牌的持续时间)以使用临时 links,最后 URL 根据执行的操作(在本例中为电子邮件激活)。

要考虑的另一点是每个 classes 都分配了模板,您可以覆盖它。

现在,在视图中,特别是在 UserViewSet 及其操作 perform_create()perform_update()resend_activation() 中,如果 Djoser 设置 SEND_ACTIVATION_EMAILTrue,调用 ActivationEmail 向用户地址发送电子邮件。

 def perform_create(self, serializer):
        user = serializer.save()
        signals.user_registered.send(
            sender=self.__class__, user=user, request=self.request
        )

        context = {"user": user}
        to = [get_user_email(user)]
        if settings.SEND_ACTIVATION_EMAIL:
            settings.EMAIL.activation(self.request, context).send(to)
        ...

邮件已发送,当用户点击link时,token是否仍然有效且uid匹配(djoser.UidAndTokenSerializer),同一个View的actionactivation()是执行。将用户标记 'is_active' 更改为 True,它可能会发送另一封电子邮件来确认激活。

如果您想编写自己的版本,如您所见,您只需创建一个随机令牌,生成一些 uid 以您喜欢的方式识别用户。编写一对 views,发送带有允许激活的模板的电子邮件。