Django Alluth电子邮件验证自动拒绝

hjqgdpho  于 2023-08-08  发布在  Go
关注(0)|答案(1)|浏览(147)

我一直在尝试在我的项目中实现django-allauth。我正在使用EMAIL_BACKEND向新注册用户发送电子邮件,他们需要在使用应用程序之前进行确认。但是,每个用户的验证电子邮件都会返回一个带有以下文本的视图:
“确认电子邮件地址
无法确认,因为它已被其他帐户确认。”
这是出乎意料的,因为文档和其他指南显示他们没有遇到这个问题。
我的设置遵循allauth文档(添加模板上下文处理器,站点ID,后端,应用程序和正确的URL)。可选设置如下:

EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
    ACCOUNT_AUTHENTICATION_METHOD = 'username_email'
    LOGIN_URL = 'login/'
    LOGIN_REDIRECT_URL = 'portfolio/'
    
    ACCOUNT_EMAIL_REQUIRED ='True'
    ACCOUNT_EMAIL_VERIFICATION ='mandatory'
    ACCOUNT_EMAIL_CONFIRMATION_ANONYMOUS_REDIRECT_URL = 'login/'
    ACCOUNT_LOGOUT_ON_GET = True
    ACCOUNT_SIGNUP_EMAIL_ENTER_TWICE = True

字符串

我尝试了什么我检查了我的数据库中是否有用户在不知不觉中与新用户冲突。我删除了除了超级用户之外的所有用户,并重新安装了allauth几次。我还尝试手动创建电子邮件验证,并通过django shell验证新用户,效果很好。

我还创建了自定义视图来尝试调试手头的问题,例如:

class CustomConfirmEmailView(ConfirmEmailView):
        def post(self, *args, **kwargs):
            print("POST method called")
            self.object = confirmation = self.get_object()
            result = confirmation.confirm(self.request)
            print('Confirmation result: ', result)
            return super().post(*args, **kwargs)

        def get(self, *args, **kwargs):
            print('ConfirmEmailView get method called')
            response = super().get(*args, **kwargs)
            confirmation = self.get_object()
            email_address = confirmation.email_address
            print('Is email verified after confirmation: ', email_address.verified)
            print("Confirmation key:", self.kwargs['key'])  # print the confirmation key
            return response

        def get_context_data(self, **kwargs):
            ctx = super().get_context_data(**kwargs)
            # Print the email_address object
            print('Email address: ', self.object.email_address)
            print('Is email verified: ', self.object.email_address.verified)
    
            return ctx

        def get_object(self, queryset=None):
            key = self.kwargs["key"]
            emailconfirmation = EmailConfirmationHMAC.from_key(key)
            print(f"Key: {key}, Email confirmation: {emailconfirmation}")
            if not emailconfirmation:
                if queryset is None:
                    queryset = self.get_queryset()
                try:
                    emailconfirmation = queryset.get(key=key.lower())
                except EmailConfirmation.DoesNotExist:
                    raise Http404()
            return emailconfirmation


在测试时,我确保用这些自定义视图覆盖accounts视图。(请注意,自定义视图和源代码视图仍然存在此问题)。
在调试时,我将问题追溯到源HTML模板中的can_confirm布尔值。

{% if confirmation %}
    
    {% user_display confirmation.email_address.user as user_display %}
    
    {% if can_confirm %}


该表单从不输入,因此can_confirm始终为false。我认为这是由于allauth的get_context_data总是将“can_confirm”设置为false

def get_context_data(self, **kwargs):
        ctx = kwargs
        site = get_current_site(self.request)
        ctx.update(
            {
            "site": site,
            "confirmation": self.object,
            "can_confirm": self.object.email_address.can_set_verified(),
            "email": self.object.email_address.email,
            }
        )
        return ctx


我错过了什么明显的东西吗?

vdzxcuhz

vdzxcuhz1#

我通过GitHub找到了解决方案。我的Allauth版本是0.54.0,这与GitHub上主分支中显示的代码不一样。
要解决此问题,请执行以下操作:
1.检查您的Allauth版本(pip show django-allauth
1.转到Allauth的GitHub,按下分支概述,然后切换到“标签”选项卡。这将使您对相关代码有一个概述。
1.切换到您的版本并复制模板。这里的问题是can_confirm的代码没有在pip版本中发布,所以can_confirm永远不会是True

相关问题