Django Allauth电子邮件验证(注册后无效)..工程后第一次登录

3phpmpom  于 2023-02-14  发布在  Go
关注(0)|答案(2)|浏览(112)

我在Django项目中使用allauth,它被配置为使用电子邮件进行身份验证。

  • ###allauth配置 *
ACCOUNT_AUTHENTICATION_METHOD = 'email'
    ACCOUNT_EMAIL_REQUIRED = True
    ACCOUNT_UNIQUE_EMAIL = True
    ACCOUNT_USERNAME_REQUIRED = False
    ACCOUNT_PASSWORD_MIN_LENGTH = 8
    ACCOUNT_EMAIL_VERIFICATION = 'mandatory'
    SOCIALACCOUNT_EMAIL_REQUIRED  = True
    • 问题是:**
  • 注册后,我直接到主页没有确认电子邮件。
  • 如果它尝试注销并再次登录,它会将我引导到(accounts/confirm-email/),现在需要确认我的电子邮件。

用户被覆盖

x一个一个一个一个x一个一个二个x
我认为注册后,用户不应该能够登录之前,确认他的电子邮件。

vd8tlhqk

vd8tlhqk1#

您需要设置的TL;DR

LOGIN_REDIRECT_URL
SIGNUP_REDIRECT_URL
LOGOUT_REDIRECT_URL

allauth docs中的电子邮件验证显示
发送指向allauth.account.views.ConfirmEmailView视图的验证电子邮件
在该视图中

def get_redirect_url(self):
        return get_adapter(self.request).get_email_confirmation_redirect_url(
            self.request
        )

以及该函数的内容

def get_login_redirect_url(self, request):
        """
        Returns the default URL to redirect to after logging in.  Note
        that URLs passed explicitly (e.g. by passing along a `next`
        GET parameter) take precedence over the value returned here.
        """
        assert request.user.is_authenticated
        url = getattr(settings, "LOGIN_REDIRECT_URLNAME", None)
        if url:
            warnings.warn(
                "LOGIN_REDIRECT_URLNAME is deprecated, simply"
                " use LOGIN_REDIRECT_URL with a URL name",
                DeprecationWarning,
            )
        else:
            url = settings.LOGIN_REDIRECT_URL
        return resolve_url(url)

它从设置为LOGIN_REDIRECT_URL或任何你给它起的名字中获得重定向URL,比如SIGNUP_REDIRECT_URL将与注册等一起工作。

goqiplq2

goqiplq22#

这种行为可能是由于Django AllAuth在项目中的配置方式造成的。要解决这个问题,您需要确保邮件验证过程是强制性的,并且必须在用户登录之前完成。
您可以通过创建一个自定义身份验证后端来实现这一点,该后端在允许用户登录之前检查用户的电子邮件是否经过验证。
下面是执行此操作的自定义身份验证后端的示例:

from allauth.account.models import EmailAddress
from django.contrib.auth import get_user_model

User = get_user_model()

class EmailVerificationBackend:
    def authenticate(self, request, email=None, password=None, **kwargs):
        try:
            user = User.objects.get(email=email)
        except User.DoesNotExist:
            return None

        if user.check_password(password):
            email_address = EmailAddress.objects.get(user=user)
            if email_address.verified:
                return user
        return None

    def get_user(self, user_id):
        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None

在settings.py文件中,将自定义身份验证后端添加到AUTHENTICATION_BACKENDS设置:

AUTHENTICATION_BACKENDS = ['path.to.EmailVerificationBackend']

这样,用户只有在确认了其电子邮件地址后才能登录。

相关问题