Django 是否可以使用dj rest auth缩短电子邮件确认密钥?

Django 是否可以使用dj rest auth缩短电子邮件确认密钥?,django,django-rest-framework,django-rest-auth,Django,Django Rest Framework,Django Rest Auth,我正在为移动应用程序制作一个RESTAPI。我正在使用dj rest auth包进行整个身份验证过程。总体身份验证功能工作正常,但我想修改的一件事是缩短电子邮件确认键 用户将收到这样的电子邮件 Please use this key to confirm your email. MjE:1l7ZhR:f6U2RWlx2kEJY2jXzFuAuKpKclNyc3MpaKmeiEFGp3Y 在我的电子邮件验证api中,用户需要输入整个密钥进行验证 有没有办法缩短这个键,以便从用户的角度来看它是好

我正在为移动应用程序制作一个RESTAPI。我正在使用
dj rest auth
包进行整个身份验证过程。总体身份验证功能工作正常,但我想修改的一件事是缩短电子邮件确认键

用户将收到这样的电子邮件

Please use this key to confirm your email.

MjE:1l7ZhR:f6U2RWlx2kEJY2jXzFuAuKpKclNyc3MpaKmeiEFGp3Y
在我的电子邮件验证api中,用户需要输入整个密钥进行验证

有没有办法缩短这个键,以便从用户的角度来看它是好的(我想)

我在这里定制了适配器

class MyAdapter(DefaultAccountAdapter):
    def send_confirmation_mail(self, request, emailconfirmation, signup):
        current_site = get_current_site(request)
        activate_url = self.get_email_confirmation_url(
            request,
            emailconfirmation)
        ctx = {
            "user": emailconfirmation.email_address.user,
            "activate_url": activate_url,
            "current_site": current_site,
            "key": emailconfirmation.key,

        }

看看你的代码,我猜你在使用django allauth

在本例中,我假设用户经过身份验证,验证代码不必是唯一的。

如果您想创建一个较短的密钥并将其存储在db中,您应该创建自定义模型,其中
密钥
适合您的需要(本例中为4位-我假设您的用户手动输入):

我们可以在用户创建后生成密钥(覆盖save()或使用signal或在发送电子邮件之前创建)。正如您所指出的,您可以覆盖
send\u confirmation\u mail
,因此为了简单起见,在本例中我使用它:

class MyAdapter(DefaultAccountAdapter):
    def send_confirmation_mail(self, request, emailconfirmation, signup):
        current_site = get_current_site(request)
        ctx = {
            "user": emailconfirmation.email_address.user,
            "activate_url": reverse("account_confirm_key"),  # depends on you - if you need it at all
            "current_site": current_site,
            "key": ActivationKey.objects.create(user=user) # create key
        }
        if signup:
            email_template = "account/email/email_confirmation_signup"
        else:
            email_template = "account/email/email_confirmation"
        self.send_mail(email_template, emailconfirmation.email_address.email, ctx)
接下来,您应该为确认代码创建自定义端点并激活用户:

 class VerifyUserView(APIView):
    permission_classes = [permissions.IsAuthenticated]

    def post(self, request):  # or change to get if more proper to you
        key = request.data.get("key")
        if not key:
            return Response({"error": _("Key is missing")}, status=status.HTTP_400_BAD_REQUEST)
        if not ActivationCode.objects.filter(user=request.user, key=key).exists():
           return Response({"error": _("Wrong activation key")}, status=status.HTTP_400_BAD_REQUEST)

        get_adapter(request).confirm_email(request, user.email)  # confirm method from adapter
        return Response({"status": "ok"})
记住关于设置:
ACCOUNT\u ADAPTER=MyAdapter

关于django allauth:

电子邮件验证的默认配置()为
ACCOUNT\u email\u CONFIRMATION\u HMAC=True
,这意味着django将生成HMAC()密钥。 如果您将选项更改为
False
密钥将生成并存储在
EmailConfirmation
模型中:但对您来说可能太长了-64个字符


另一个选项是为用户创建短链接(例如bit.ly),而不做任何更改。或者,如果这是针对移动应用程序,您可以创建deeplink,因此在单击确认链接(甚至很长)后,用户将重定向到移动应用程序,然后移动应用程序将请求发送到后端?

感谢您提供的详细答案+1.我试试看。我发布了一个新问题,你能看一下吗?当然,我会马上看的
 class VerifyUserView(APIView):
    permission_classes = [permissions.IsAuthenticated]

    def post(self, request):  # or change to get if more proper to you
        key = request.data.get("key")
        if not key:
            return Response({"error": _("Key is missing")}, status=status.HTTP_400_BAD_REQUEST)
        if not ActivationCode.objects.filter(user=request.user, key=key).exists():
           return Response({"error": _("Wrong activation key")}, status=status.HTTP_400_BAD_REQUEST)

        get_adapter(request).confirm_email(request, user.email)  # confirm method from adapter
        return Response({"status": "ok"})