电子邮件过期后,allauth未经验证的电子邮件将保持未经验证的状态

时间:2020-02-14 00:32:06

标签: django django-rest-framework django-allauth django-rest-auth

我有一个自定义的用户模型。并且我使用Django rest auth来处理用户的身份验证。 问题是注册后发送电子邮件后的问题。如果用户没有在电子邮件过期之前对其进行验证,则似乎该电子邮件将无限期地停留在该状态。我期望从文档中的ACCOUNT_EMAIL_VERIFICATION = "mandatory"开始在我的设置中再次发送验证电子邮件,该文档默认情况下应重新发送验证消息,但这没有发生。我不知道该怎么办,而且似乎找不到任何有用的资源。

下面是我的模特

models.py

class User(AbstractBaseUser, PermissionsMixin):
    username = None
    email = models.EmailField(max_length=254, unique=True)
    name = models.CharField(max_length=250)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    last_login = models.DateTimeField(null=True, blank=True)
    date_joined = models.DateTimeField(auto_now_add=True)
    slug = models.SlugField(max_length=255, unique=True, blank=True)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['name']

在我的 settings.py 中,用户的有效期为2天

ACCOUNT_AUTHENTICATED_LOGIN_REDIRECTS = True
ACCOUNT_AUTHENTICATION_METHOD = "email"
ACCOUNT_CONFIRM_EMAIL_ON_GET = True
ACCOUNT_EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL = None #or "api/authenticated/"
ACCOUNT_EMAIL_CONFIRMATION_EXPIRE_DAYS = 1
ACCOUNT_EMAIL_CONFIRMATION_HMAC = False
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_USERNAME_REQUIRED = False
ACCOUNT_USER_MODEL_USERNAME_FIELD = None
ACCOUNT_EMAIL_VERIFICATION = "mandatory"
EMAIL_VERIFICATION = "mandatory"
ACCOUNT_DEFAULT_HTTP_PROTOCOL = "http"
ACCOUNT_EMAIL_CONFIRMATION_COOLDOWN = 3600
ACCOUNT_LOGIN_ATTEMPTS_LIMIT = 5
ACCOUNT_LOGIN_ATTEMPTS_TIMEOUT = 180
ACCOUNT_LOGIN_ON_EMAIL_CONFIRMATION = False
ACCOUNT_LOGOUT_ON_GET = True
ACCOUNT_LOGOUT_ON_PASSWORD_CHANGE = True
ACCOUNT_LOGIN_ON_PASSWORD_RESET = False
ACCOUNT_LOGOUT_REDIRECT_URL = "api/login/"
ACCOUNT_SESSION_REMEMBER = True
ACCOUNT_SIGNUP_EMAIL_ENTER_TWICE = False
ACCOUNT_UNIQUE_EMAIL = True
ACCOUNT_USER_MODEL_EMAIL_FIELD = "email"

2 个答案:

答案 0 :(得分:2)

最终,我能够以不同的方式解决此问题,我创建了一个视图和URL来请求用户电子邮件,然后在未验证用户的情况下向他们发送链接。

views.py

41.201.181.27 - [2019-04-06 18:22:02] "GET /images/stands/photo_mois.jpg HTTP/1.1" 304 - "http://example.com/popup.php?choix=mois" "Mozilla/4.0" "-"

urls.py

cut -f4 -d\" < logfile | sort -u

答案 1 :(得分:1)

首先,您提到您正在使用django-rest-auth,但事实并非如此,您可能正在使用django-allauth

根据django-allauth的文档:

ACCOUNT_EMAIL_VERIFICATION

设置为“强制”时,用户将无法登录,直到验证电子邮件地址为止。选择“可选”或“无”以允许使用未经验证的电子邮件地址登录。如果为“可选”,则仍发送电子邮件验证邮件,而如果为“无”,则不发送电子邮件验证邮件。

因此,如果第一封电子邮件过期,则没有提及重新发送验证电子邮件。要完成您想要的工作,您应该运行job脚本并检查expired验证令牌,然后手动重新发送验证电子邮件。

您应该创建一个类似于以下内容的脚本:

from time import sleep
from django.utils import timezone
from django_allauth.account.models import EmailConfirmation

while True:
    def_expired = timezone.now() - datetime.timedelta(days=app_settings.EMAIL_CONFIRMATION_EXPIRE_DAYS)
    expired_tokens = EmailConfirmation.objects.filter(sent__lte=def_expired)
    for token in expired_tokens:
        token.send()
    sleep(2)

并使用您喜欢的任何调度程序(supervisorpm2cronjob等)使该脚本运行。

底线django-allauth不具有/不具有所需的功能。这项工作需要手动完成。