Django не могу войти с действительными учетными данными - PullRequest
1 голос
/ 22 января 2020

Django не входит в систему, мой пользователь. Я использую Django вызов REST для этого:

class UserLogin(APIView):

permission_classes = []

def post(self, request, *args, **kwargs):

    if request.method == 'POST':
        user = authenticate(
            username=request.data.get('email'),
            password=request.data.get('password')
        )
        print("User de Authenticate -> %s" % user)
        if user is not None:
            login(request, user, backend='apps.core.api.backends.EmailAuthBackend')

            return HttpResponse("Valid")
        else:
            return HttpResponse("Invalid")

С моим пользовательским бэкэндом:

class EmailAuthBackend(object):
def authenticate(self, request, username=None, password=None):
    """ Authenticate a user based on email address as the user name. """
    try:
        user = User.objects.get(email=username)
        if bcrypt.checkpw(password.encode('utf-8'), user.password.encode('utf-8')):
            return user
    except User.DoesNotExist:
        try:
            user = User.objects.get(username=username)
            if user.check_password(password):
                return user
        except User.DoesNotExist:
            return None

def get_user(self, user_id):
    try:
        return User.objects.get(pk=user_id)
    except User.DoesNotExist:
        return None

Дело в том, что аутентификация возвращает мне пользователя, если учетные данные действительно, так что проблема не в этом. Функция входа в систему возвращает мне None! Я делаю небольшую отладку входа в систему с отпечатками, поэтому вот функция входа django:

def login(request, user, backend=None):
"""
Persist a user id and a backend in the request. This way a user doesn't
have to reauthenticate on every request. Note that data set during
the anonymous session is retained when the user logs in.
"""
session_auth_hash = ''
print("1")
if user is None:
    user = request.user
if hasattr(user, 'get_session_auth_hash'):
    print("2")
    session_auth_hash = user.get_session_auth_hash()

if SESSION_KEY in request.session:
    print("3")
    if _get_user_session_key(request) != user.pk or (
            session_auth_hash and
            not constant_time_compare(request.session.get(HASH_SESSION_KEY, ''), session_auth_hash)):
        # To avoid reusing another user's session, create a new, empty
        # session if the existing session corresponds to a different
        # authenticated user.
        print("4")
        request.session.flush()
else:
    print("5")
    request.session.cycle_key()

try:
    print("6")
    backend = backend or user.backend
except AttributeError:
    print("7")
    backends = _get_backends(return_tuples=True)
    print("LOS BACKENDS -> %s" % backends)
    if len(backends) == 1:
        print("8")
        _, backend = backends[0]
    else:
        print("9")
        raise ValueError(
            'You have multiple authentication backends configured and '
            'therefore must provide the `backend` argument or set the '
            '`backend` attribute on the user.'
        )
else:
    print("10")
    if not isinstance(backend, str):
        print("11")
        raise TypeError('backend must be a dotted import path string (got %r).' % backend)

print("12")
request.session[SESSION_KEY] = user._meta.pk.value_to_string(user)
request.session[BACKEND_SESSION_KEY] = backend
request.session[HASH_SESSION_KEY] = session_auth_hash
print(request.session[SESSION_KEY])
if hasattr(request, 'user'):
    print("13")
    request.user = user
rotate_token(request)
user_logged_in.send(sender=user.__class__, request=request, user=user)

И отладка отпечатков: 1
2 5 6 10 12 9 13

Я вижу, что это вызывает ошибку значения бэкэндов, но я передаю бэкэнд при входящем вызове и импортирую его также в settings.py. Не знаю, почему django не может войти в систему моего пользователя. У кого-нибудь есть решение? РЕДАКТИРОВАТЬ, для получения дополнительной информации: мой пользователь ->

class User(AbstractUser):

name = models.CharField(max_length=30, null=False, blank=False)
surnames = models.CharField(max_length=30, null=False, blank=False)
email = models.EmailField(max_length=60)
password = models.CharField(max_length=100, null=False, blank=False)
country = CountryField()
phonenumber = PhoneNumberField()
postalCode = models.CharField(max_length=5)

def __str__(self):
    return self.email

Реализовано с AUTH_USER_MODEL = 'core.User'. И мой метод создания пользователя, у меня есть sh пароль вручную:

  def post(self, request, *args, **kwargs):
    request.data["password"] = 
    bcrypt.hashpw(request.data["password"].encode(), bcrypt.gensalt()).decode()
    request.data["username"] = request.data["name"]
    print(request.data["username"])
    print(request.data["password"])
    return self.create(request, *args, **kwargs)

Ответы [ 2 ]

0 голосов
/ 23 января 2020

Очевидно, что вы не можете войти с помощью метода Django REST, поэтому я изменил код входа на обычный метод Django, и с тем же кодом я смог войти.

0 голосов
/ 22 января 2020

исправьте отступ

def post(self, request, *args, **kwargs):
    if request.method == 'POST':
        user = authenticate(
            username=request.data.get('email'),
            password=request.data.get('password')
        )
        print("User de Authenticate -> %s" % user)
        if user is not None:
            login(request, user, backend='apps.core.api.backends.EmailAuthBackend')
            return HttpResponse("Valid")
   else:
       return HttpResponse("Invalid")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...