django allauth设置EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL无效

3

我想修改用户在确认电子邮件地址后通过单击确认电子邮件中的链接重定向到的位置。

我正在使用Django 2.0.10与allauth、rest-auth和rest-framework。对于电子邮件验证,我使用默认的allauth视图。

在我的settings.py中,我设置了以下内容:

INSTALLED_APPS = [
    'api',
    'dynamic_rest',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'rest_framework.authtoken',
    'django.contrib.sites',
    'allauth.account',
    'allauth.socialaccount',
    'rest_auth.registration',
    'users',
    'lists',
    'rest_auth',
    'allauth', # needs to be at the end so custom templates are found first
]
EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL = '/'
print('EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL')
print(EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL)

urls.py

from allauth.account.views import confirm_email

urlpatterns = [
    re_path(r'^rest-auth/registration/account-confirm-email/(?P<key>[-:\w]+)/$', confirm_email,
     name='account_confirm_email'),
...
]

我的设置'/'确实在控制台中打印出来,所以我认为应用程序已经获取了它。但是,当我按照电子邮件中的链接访问页面http://localhost:8000/api/v1/rest-auth/registration/account-confirm-email/MTQ:1gpYgM:_KpNYl-nd2iiG0qLIRRdVrmF8SM/,然后单击“确认”按钮时,我被重定向到默认页面/accounts/profile,而不是由EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL指定的首页。
此设置似乎也没有任何效果:
ACCOUNT_LOGIN_ON_EMAIL_CONFIRMATION = False 我想禁用它,因为登录无法正常工作——令牌无效。也许allauth和rest-auth的登录方式不同?如果用户在验证电子邮件地址后需要重新登录,我不介意,但目前的行为是用户看起来已登录,但其实未登录,这是不可接受的。
我做错了什么?如何自定义在确认电子邮件地址后将用户重定向到哪里?感谢您的帮助!
1个回答

4
经过一番尝试,我认为allauth的设置不符合我的预期,也许并不像它们的名称所描述的那样工作,而且可能并没有按照预期工作。ACCOUNT_EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL 不意味着“用户登录后重定向”。代码检测 user.is_authenticated(site-packages/allauth / account / adapter.py),在这种情况下似乎意味着“确认链接是否有效?”。
使用令牌身份验证时,ACCOUNT_LOGIN_ON_EMAIL_CONFIRMATION似乎根本不起作用,并且无论如何都已知在会话发生更改时无法正常工作。因此,我认为它必须设为False。
ACCOUNT_LOGIN_ON_EMAIL_CONFIRMATION = False 有时被接受,但并不总是如此,我还没有找到原因...
查看 email_confirm.html 模板的构建方式,我认为成功将始终重定向到 ACCOUNT_EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL,而失败将使您停留在页面上,并提供一个无法工作的链接来请求新的确认电子邮件。
我找不到 ACCOUNT_EMAIL_CONFIRMATION_ANONYMOUS_REDIRECT_URL 何时被使用,但已将其设置为首页。
也许我误解了这个问题,但是我最终得到了一个基本可行的设置。这非常笨拙,一定有更好的方法来做到这一点,但现在我会采取任何能让我继续的东西。我最终使用了几个allauth模板来进行帐户管理,因为我无法通过rest-auth实现此功能。
仍然存在一个失败的链接问题:大多数情况下,我看到模板页面及其有用的消息,但有时只会显示主页。但至少这不是主要流程,对用户也不会造成灾难。
settings.py: 请注意所有auth的模板DIRS条目,否则不会使用我的自定义模板。
TEMPLATES = [
    {
...
        'DIRS': [os.path.join(BASE_DIR, 'templates'),
        os.path.join(BASE_DIR, 'assets'),
        os.path.join(BASE_DIR, 'templates', 'allauth')],
...
]

ACCOUNT_LOGIN_ON_EMAIL_CONFIRMATION = False
ACCOUNT_EMAIL_CONFIRMATION_ANONYMOUS_REDIRECT_URL = '/'
ACCOUNT_EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL = '/verified'

'verified'是我的前端路由,用于显示确认信息和登录链接。

urls.py

from django.views.generic import TemplateView

urlpatterns = [
...
    re_path(r'^rest-auth/registration/account-confirm-email/(?P<key>[-:\w]+)/$', confirm_email,
 name='account_confirm_email'),
]

修改templates/account/email_confirm.html,使其在失败时提供可用的链接。

{% extends "account/base.html" %}

{% load i18n %}
{% load account %}

{% block head_title %}{% trans "Confirm E-mail Address" %}{% endblock %}


{% block content %}
<h1>{% trans "Confirm E-mail Address" %}</h1>

{% if confirmation %}

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

<p>{% blocktrans with confirmation.email_address.email as email %}Please confirm that <a href="mailto:{{ email }}">{{ email }}</a> is an e-mail address for user {{ user_display }}.{% endblocktrans %}</p>

<form method="post" action="{% url 'account_confirm_email' confirmation.key %}">
{% csrf_token %}
    <button type="submit">{% trans 'Confirm' %}</button>
</form>

{% else %}

{% url 'account_email' as email_url %}

<p>{% blocktrans %}The email confirmation link expired or is invalid. Please <a href="/login/">login</a> and request a new confirmation email from your user account.{% endblocktrans %}</p>

{% endif %}

{% endblock %}

请问您能分享一下如何处理过期的电子邮件吗?我已经为此苦战了几周。 - Opeyemi Odedeyi
请问您能分享一下如何处理过期的电子邮件吗?我已经为此苦战了几周。 - Opeyemi Odedeyi
你的意思是如果用户第二次点击邮件,那么它就不起作用了吗?页面会显示错误,用户可以请求发送新链接的新电子邮件。 - Little Brain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接