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)