2014-10-28 1 views
3

Проблема:перестает двигаться дальше от страницы входа [Джанго-OTP]

Я перенаправлять обратно на странице входа со следующим сообщением об ошибке после предоставления имени пользователя и пароля

«Пожалуйста, введите правильную электронной почты и пароля. Обратите внимание, что оба поля могут быть чувствительны к регистру ».

деталь:

Я следовал документацию 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 

Logger также ищет FINE

urls.py

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

и в views.py

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

Примечание: У меня есть модели пользовательских пользователей в моем приложении, и зарегистрировали их в 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) 

Пожалуйста, укажите, где я буду неправильно. И дайте мне знать, если я не очень ясен. Благодаря!

ответ

0

Как я могу видеть в документации: «Обязательно удалите любые другие маршруты входа, в противном случае можно обойти двухфакторную аутентификацию. Интерфейс администратора должен быть автоматически исправлен, чтобы использовать новый метод входа».

Постарайтесь выяснить причину, чтобы использовать AUTH_USER_MODEL = «users.User»

+0

спасибо за ваше время. LOGIN_URL направляется в двухфакторный режим согласно документации. Нет другого логина входа. У меня есть пользовательские модели и не используется django-auth. Вот почему у меня есть это AUTH_USER_MODEL = 'users.User' Я знаю, что это не очень хорошая идея, но я обязан использовать пользовательские модели. – Fakhir

+0

Хорошо, я понял. Не могли бы вы рассказать о своей версии django и о том, как вы создали пользовательскую модель? – NONAMA

+0

Да, версия Django - 1.5.1. Пользовательские модели наследуются от AbstractBaseUser. Я также определил пользовательский менеджер для этой модели. admin.py находится под вопросом. AUTH_USER_MODEL также определяется в settings.py. Пожалуйста, дайте мне знать, если вам нужно что-то еще. – Fakhir

1

Хорошо, моя точка: так как вы используете унаследовав от модели пользователя, вам нужно использовать AUTH_USER_MODEL как маршрут AUTH. Это означает, что у вас уже есть два способа auth. Возможно, вы должны проверить две таблицы: otp_device и auth_users. Я имею в виду, когда вы помещаете свой бланк/пароль в форму, он проверяет таблицу auth_users. Но в таблице устройств у вас нет пользователя запроса. Таким образом, система otp auth не может сопоставляться с записью «Нет» и перенаправлять вас на страницу входа.

Если у меня была похожая ситуация, я решил попробовать два решения:

  1. Создать сигнал для синхронизации пользователей и таблицу устройств;
  2. Используйте старую версию пользовательской настройки (OneToOneField с моделью пользователя).

Я думаю, что это слишком сложный способ для auth: три приложения (two_factor, otp и default auth) используют аналогичную технологию auth.

+0

Отличный .... это также способ использования пользователя auth с OneToOneField моего пользовательского пользователя. При необходимости я задам несколько вопросов. Я ценю ваш интерес. Благодаря! – Fakhir

+0

Конечно, приветствую! – NONAMA