无法从登录页面进一步移动[django-otp]

问题描述 投票:3回答:2

问题:

在提供用户名和密码后,我将通过以下错误消息重定向回登录页面

“”请输入正确的电子邮件和密码。请注意,两个字段都区分大小写。“

详细信息:

我已遵循Django Two-Factor Authentication的文档。我必须错过配置中的某些内容,但不完全了解。下面是我代码中的细节。

settings.py

# in middle ware classes
    ...
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django_otp.middleware.OTPMiddleware',
    ...

# in installed apps
    ...
    'django_otp',
    'django_otp.plugins.otp_totp',
    'django_otp.plugins.otp_hotp',
    'django_otp.plugins.otp_static',
    'two_factor',
    'otp_yubikey',
    ...

LOGIN_URL = reverse_lazy('two_factor:login')

TWO_FACTOR_PATCH_ADMIN = True
TWO_FACTOR_CALL_GATEWAY = 'two_factor.gateways.fake.fake'
TWO_FACTOR_SMS_GATEWAY = 'two_factor.gateways.fake.Fake'
TWO_FACTOR_QR_FACTORY = 'qrcode.image.pil.PilImage'
LOGIN_REDIRECT_URL = reverse_lazy('two_factor:profile')
AUTHENTICATION_BACKENDS = ('myapp.backends.EmailAuthBackend',)
AUTH_USER_MODEL = 'users.User'
OTP_LOGIN_URL = LOGIN_URL

记录仪也看起来不错

urls.py

url(r'', include(tf_urls + tf_twilio_urls, 'two_factor')),

以及views.py

@otp_required()
def home(request):
    # some logic with HTTP response

[NOTE:我在我的应用程序中有自定义用户模型,并在admin.py中注册了他们,除了这个问题,我也粘贴了该文件以便清楚。

admin.py

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.forms import UserChangeForm, UserCreationForm
from apps.users.models import User
from django import forms


class MyUserChangeForm(UserChangeForm):
    class Meta(UserChangeForm.Meta):
        model = User


class MyUserCreationForm(UserCreationForm):
    class Meta(UserCreationForm.Meta):
        model = User

    def clean_username(self):
        username = self.cleaned_data['username']
        try:
            User.objects.get(username=username)
        except User.DoesNotExist:
            return username
        raise forms.ValidationError(self.error_messages['duplicate_username'])


class MyUserAdmin(UserAdmin):
    form = MyUserChangeForm
    add_form = MyUserCreationForm
    # fieldsets = UserAdmin.fieldsets + (
    #     (None, {'fields': ('extra_field1', 'extra_field2',)}),
    # )

admin.site.register(User, MyUserAdmin)

请建议我要去哪里错了。如果我不太清楚,请告诉我。谢谢!

python django python-2.7 two-factor-authentication one-time-password
2个回答
1
投票
好吧,我的观点是:由于您使用从用户模型继承,因此需要使用AUTH_USER_MODEL作为身份验证路由。这意味着,您已经有两种身份验证方式。也许您应该检查两个表:otp_device和auth_users。我的意思是,当您将日志/密码放入表单时,它正在使用auth_users表进行检查。但是在设备表中您没有请求用户。因此,otp auth系统无法与None记录匹配,并无法在登录页面上重定向您。

如果我有类似的情况,我决定尝试两种解决方案:

    创建信号以同步用户和设备表;
  1. 使用旧版本的用户自定义(具有用户模型的OneToOneField)。
  • 我认为这对于身份验证来说太复杂了:三个应用程序(two_factor,otp和默认身份验证)正在使用类似的身份验证技术。

  • 0
    投票
    正如我在文档中所看到的:“请确保删除任何其他登录路径,否则可能会绕过两因素身份验证。管理界面应自动打补丁以使用新的登录方法。”

    尝试找出使用AUTH_USER_MODEL ='users.User'的原因

    © www.soinside.com 2019 - 2024. All rights reserved.