Django возвращает идентификатор сессии, но не аутентифицирует пользователя

У меня есть следующий код, который отправляет запросы для проверки JWT-токена, затем авторизует пользователя и возвращает авторизованную сессию с токеном доступа, токеном обновления и идентификатором сессии.

@csrf_exempt
def new_login_view(request, *args, **kwargs):
    def convert_data(req):
        data = {
            "email": req.data['username'],
            "password": req.data['password'],
        }
        try:
            data["language"] = request.LANGUAGE_CODE
        except:
            data["language"] = request.POST.get('language', 'en')
        return data

    if request.user.is_authenticated and not request.META.get('HTTP_X_AVOID_COOKIES'):
        return HttpResponseRedirect(request.GET.get(KEY_NEXT, '/'))

    if request.method == 'POST':
        request_data = convert_data(request)

        # request to Accounts API to check if user exists
        response = send_service_request(EnumAuthUrls.sign_in.value,
                                        json_data=request_data,
                                        original_response=True)

        if isinstance(response, dict):
            return JsonResponse(response)

        if response.status_code == 200:
            tok_ac = response.headers.get(HEADER_ACCESS_KEY)
            tok_ref = response.headers.get(HEADER_REFRESH_KEY)

            # checking JWT token
            user = ApiAuthenticationBackend().authenticate(request, tok_ac)

            # creates session
            data = login_session(request, response, user)

            data['user_id'] = request.user.id
            data['account_id'] = request.user.profile.account_id
            data['balance'] = request.user.balance
            if request.META.get('HTTP_X_AVOID_COOKIES'):
                return JsonResponse(data)

            response = AuthResponse(
                data=data,
                ssid=request.session.session_key,
                access_token=tok_ac,
                refresh_token=tok_ref,
            )

            return response

        else:
            return ErrorApiResponse(response.json())

    service = urllib.parse.quote_plus(request.build_absolute_uri())
    return HttpResponseRedirect(settings.ACCOUNTS_URL + f'login/?service={service}')

Вот код login_session фукнции:

def login_session(request: HttpRequest, response: HttpResponse, user):
    request.user = user
    request.session.create()
    base_data = response.json().get(KEY_DATA)
    return request.user.serialize(request, base_data, token=True)

А вот класс AuthResponse , который в конечном итоге основан на HttpResponse:

class AuthResponse(SuccessResponse):
    def __init__(self, data={}, ssid='', access_token: str = '', refresh_token: str = '', **kwargs):
        super().__init__(data, **kwargs)
        if ssid:
            logger.debug(f'Setting {settings.SESSION_COOKIE_NAME}: {ssid}')
            self.set_cookie(key=settings.SESSION_COOKIE_NAME,
                            value=ssid)
        if access_token:
            self.set_cookie(key=settings.ACCESS_KEY_COOKIE_NAME,
                            value=access_token)
        if refresh_token:
            self.set_cookie(key=settings.REFRESH_KEY_COOKIE_NAME,
                            value=refresh_token)

Проблема в том, что со стороны браузера все выглядит хорошо, я получаю все необходимые cookies (токен доступа, токен обновления и идентификатор сессии), однако после попытки входа в систему я получаю перенаправление на главную страницу.

В начале была проблема с установкой cookies, но потом я выяснил, что не следует использовать SESSION_COOKIE_DOMAIN, если он локальный. Таким образом, все cookies заработали без проблем, но это не решило ситуацию с авторизацией.

При установке cookies с помощью self.set_cookie() я пытался использовать secure=True, samesite='Lax', httponly=True и все остальные параметры, но это не помогло.

Кто-нибудь знает, что еще я могу попробовать, чтобы исправить это?

Ну, я нашел, что было не так!

Имелось промежуточное ПО, которое должно было проверять токен от другого сервиса. Однако оно проверяло старый токен, а не новый.

Как только я изменил его и начал проверять новый токен - он работал просто отлично.

Итак, если нет других решений, убедитесь, что вы проверили промежуточное ПО или другой код, где это может повлиять на всю систему.

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