Проблема с аутентификацией в django с помощью имени пользователя и лица

До сих пор я могу выполнять двухфакторную аутентификацию (имя пользователя + пароль + лицо)
. Я хочу знать, как изменить аутентификацию, используя только имя пользователя и лицо.

view.py

def face_login(request):
    if request.method == 'POST':
        form = AuthenticationForm(request, request.POST)

        if form.is_valid():
            username = form.cleaned_data ['username']
            password = form.cleaned_data['password']
            face_image = prepare_image(form.cleaned_data['image'])

            face_id = FaceIdAuthBackend() 
            user = face_id.authenticate(username=username,password=password,face_id=face_image)
            if user is not None:
                login(request, user)
                return redirect('home')
            else:
                messages.info(request, "Username, password or face id didn't match.")
                return redirect('facelogin')
    else:
        form = AuthenticationForm()

    context = {'form': form}
    return render(request, 'django_two_factor_face_auth/facelogin.html', context)
    enter code here

model.py

class UserFaceImage(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    image = models.ImageField(upload_to=content_file_name, blank=False)

authenticate.py

class FaceIdAuthBackend(ModelBackend):

    def authenticate(self, username=None, password=None, face_id=None, **kwargs):
        try: 
            user = User.objects.get(username=username)
            if  self.check_face_id(face_id=user.userfaceimage.image, uploaded_face_id=face_id):
                return user
        except User.DoesNotExist:
            User().set_password(password)
  def check_face_id(self, face_id=None, uploaded_face_id=None):
        confirmed_image = face_recognition.load_image_file(face_id)
        uploaded_image = face_recognition.load_image_file(uploaded_face_id)

        face_locations = face_recognition.face_locations(uploaded_image)
        if len(face_locations) == 0:
            return False

        confirmed_encoding = face_recognition.face_encodings(confirmed_image)[0]
        unknown_encoding = face_recognition.face_encodings(uploaded_image)[0]

        results = face_recognition.compare_faces([confirmed_encoding], unknown_encoding)

        if results[0] == True:
            return True

        return False
Вернуться на верх