Django - request.user возвращает AnonymousUser с пользовательским пользователем

У меня возникли некоторые проблемы с аутентификацией для моего приложения Django, использующего CustomUser. Логика следующая: Мне нужно отправить учетные данные (email/пароль) на внешний API, из которого я получаю токен доступа, который будет использоваться в последующих запросах. Во время этого процесса я также создаю (или обновляю, если он уже существует) CustomUser в моей локальной базе данных с теми же учетными данными, что и во внешней базе. Затем я пытаюсь аутентифицировать пользователя в моем приложении с теми же учетными данными

Ниже приведены соответствующие части кода:

models.py:

class CustomUser(AbstractUser):
   email = models.EmailField("Email", max_length=255, unique=True, null=True)
   custom_user_id = models.IntegerField("Custom user id", unique=True, null=True)
   name = models.CharField("Name", max_length=255, null=True)
   initials = models.CharField("Initials", max_length=255, null=True)

views.py

from django.contrib.auth import login as auth_login

@api_view(['POST'])
@never_cache
def user_login(request):
    ''' User login '''
    if request.method == 'POST':
            url = "THE EXTERNAL API"
            payload = {
                    'email':request.data['email'],
                    'password':request.data['password']
                    }
            headers = {
                  'Origin': 'REDACTED',
                  'Content-Type': 'text/plain'
                }
            email = request.data['email']
            username = email
            password = request.data['password']
            payload = '{"email":"' + email + ',"password":"' + password + '}'            
            r = requests.post(url, data = payload, headers=headers)
            if r.status_code == 200:
                data = r.json()
                # Get user // create one if it doesn't exist yet
                user, created = CustomUser.objects.update_or_create(
                    custom_user_id = data['data']['uid'],
                    defaults = {
                        'username': username,
                        'initials': data['data']['initials'],
                        'email': data['data']['email'],
                        'name': data['data']['name']
                    })

                #trying to login user
                auth_login(request, user)

                request.session['access_token'] = data['data']['access_token']

Прежде всего, этот код прекрасно работает, когда я запускаю приложение в локальном режиме - на самом деле я вижу, что request.user правильно сохраняет зарегистрированного пользователя внутри любого другого представления, а декоратор @login_required работает так, как ожидалось.

Проблемы возникают, когда я запускаю то же приложение на моей развернутой версии (aws ec2 с nginx). В этом случае 'request.user' содержит правильного пользователя only внутри этого представления login. Но если я печатаю request.user в любом другом представлении, оно фактически возвращает AnonymousUser, как будто функция auth_login действительно потерпела неудачу.

В результате декоратор @login_required больше не работает должным образом (потому что request.user не содержит аутентифицированного пользователя). Странно, но его аналог для представления на основе класса (LoginRequiredMixin) работает отлично (не уверен, что они смотрят на разные вещи?), однако в моем приложении есть смесь представлений на основе функций и классов, и я не могу преобразовать все в представление на основе класса (также я хотел бы решить проблему в корне).

Другая странность заключается в том, что несмотря на то, что request.user содержит AnonymousUser, request.session содержит правильные учетные данные пользователя (например, я могу получить ID зарегистрированного пользователя с помощью request.session['_auth_user_id']). Если аутентификация не прошла, то почему request.session правильно содержит информацию о зарегистрированном пользователе?

Я также попробовал следующее, основываясь на ответе на аналогичный вопрос на SO:

from django.contrib.auth import authenticate

user = authenticate(username=username, password=password)

Однако это ничего не решило.

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