2014-10-28 2 views
3

문제 :로그인 페이지에서 더 이동 실패, [장고-OTP]

"올바른을 입력하십시오 사용자 이름과 암호를 제공 한 후 다음과 같은 오류 메시지가 페이지를 로그인 다시 리디렉션하고

이메일과 비밀번호를 입력하십시오. 두 필드 모두 대소 문자를 구분할 수 있습니다. "

상세 :

나는 Django Two-Factor Authentication의 문서를 따랐다. 구성에서 뭔가를 놓쳐 버렸지 만 정확하게 알지 못합니다. Bellow는 내 코드의 세부 사항입니다.

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 

참고 : 나는 내 응용 프로그램에서 사용자 정의 사용자 모델을 가지고 그리고 난 분명히 너무 해당 파일을 붙여 넣기하고이 질문에 추가 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

문서에서 볼 수 있듯이 "다른 로그인 경로는 제거해야합니다. 그렇지 않으면 이중 인증이 우회 될 수 있습니다 .Administrator 인터페이스를 자동으로 패치하여 새 로그인 방법을 사용해야합니다."

에 한번 사용하는 이유를 알아낼 AUTH_USER_MODEL = 'users.User'

+0

감사합니다. LOGIN_URL은 문서에 따라 두 요소로 라우팅됩니다. 다른 로그인 경로는 없습니다. 사용자 정의 사용자 모델이 있고 django-auth를 사용하지 않습니다. 그래서 내가 이것을 가지고있다 AUTH_USER_MODEL = 'users.User' 나는 이것이 좋은 생각이 아니라는 것을 알고 있지만 나는 사용자 정의 모델을 사용하도록되어있다. – Fakhir

+0

좋아, 이해했다. django 버전과 사용자 정의 사용자 모델 작성 방법을 알려주십시오. – NONAMA

+0

예, 장고 버전은 1.5.1입니다. 사용자 모델은 AbstractBaseUser에서 상속됩니다. 이 모델에 대한 사용자 정의 관리자도 정의했습니다. admin.py는 질문의 세부 사항입니다. AUTH_USER_MODEL은 settings.py에 정의되어 있습니다. – Fakhir

1

좋아, 내 요점은 : 당신이 사용자 모델에서 상속 사용하기 때문에, 당신은 정식 경로로 AUTH_USER_MODEL를 사용해야합니다. 즉, 이미 두 가지 인증 방법이 있습니다. otp_device와 auth_users라는 두 테이블을 점검해야 할 것입니다. 내 말은 당신이 당신의 로그/패스를 폼에 넣었을 때 auth_users 테이블로 검사한다는 뜻입니다. 그러나 장치 테이블에는 요청 사용자가 없습니다. 그래서 otp 인증 시스템은 None 레코드와 일치 할 수 없으며 로그인 페이지에서 사용자를 리디렉션합니다. 내가 비슷한 상황이 있다면

, 나는이 개 솔루션을 사용하기로 결정했습니다 :

  1. 사용자 및 장치 테이블을 동기화 신호를 생성하는 단계;
  2. 이전 버전의 사용자 지정 (OneToOneField 및 User 모델 사용)을 사용하십시오.

나는 3 가지 앱 (two_factor, otp 및 기본 인증)이 유사한 인증 기술을 사용하고있어 인증 방법이 너무 복잡하다고 생각합니다.

+0

좋은 .... 이것은 또한 내 사용자 지정 사용자의 OneToOneField를 갖는 인증 사용자를 사용하는 방법이기도합니다. 필요한 경우 몇 가지 질문을하겠습니다. 나는 당신의 관심에 감사드립니다. 감사! – Fakhir

+0

물론 이죠, 환영합니다! – NONAMA