CSRF Origin check failed Django/Vue.JS

В настоящее время я делаю веб-приложение, которое использует Vue.JS для фронтенда и Django для бэкенда. Я использую django-rest-framework для связи между клиентом и сервером.

Я хотел бы уточнить, что все работает нормально при использовании Postman для тестирования моих запросов

При попытке войти или зарегистрироваться (это только две функции, которые я уже реализовал) сервер посылает следующий ответ:

"CSRF Failed: Проверка происхождения не удалась - http://localhost:8080 не соответствует ни одному доверенному происхождению." Статус: 403

Куки csrftoken есть, и я убедился, что они отправлены

Вот некоторые детали моей установки

Запросы отправляются с помощью Axios. В main.js я отменил следующие axios.defaults

axios.defaults.baseURL = 'http://localhost:8000';
axios.defaults.xsrfCookieName = 'csrftoken';
axios.defaults.xsrfHeaderName = 'X-CSRFToken';
axios.defaults.withCredentials = true;

В этом методе запрос на вход отправляется в хранилище пользователей Pinia:

async login(email, password)
{
    try
    {
        let response = await axios.post('authentication/login/', {email: email, password:  
        password});
        this.setUserData(response.data.id, response.data.email);
    }
    catch(error)
    {
        console.log(error);
    }
            
},

Сторона сервера:

Мое представление пользователя написано следующим образом:

def UserAuthenticationView(APIView):
    serializer_class = UserSerializer

    def get(self, request):
        #retrieve currently logged-in user
        pass

    def post(self, request):
        #register new user in database
        pass

    @api_view(['POST])
    def login(request):
        # decode request sent as json
        body = json.loads(request.body)

        # make sure all fields are present
        try:
            email = body['email']
            password = body['password']
        except KeyError:
            return Response("Email or password are missing", status=400)

        # validateEmail() and validatePassword() are custom functions that check the format of both 
        # fields
        if (not validateEmail(email) or not validatePassword(password)):
            return Response("Email or password are missing", status=400)

        user = authenticate(email=email, password=password)

        # check if authentication worked        
        if user is None:
            return Response("Failed to authenticate user", status=400)
        else:
            # log user on session and return it
            login(request, user)
            return Response(UserAuthenticationView.serializer_class(user).data)

Внутри settings.py я добавил следующую строку

CSRF_TRUSTED_ORIGINS = ["http://localhost:8080"]

Но поскольку моему представлению входа в систему требуется доступ к телу запроса, я получаю внутреннюю ошибку сервера. Насколько я понимаю, CSRF Middleware сначала читает тело запроса, и я должен использовать csrf_exempt() для предотвращения такого поведения

Итак, в urls.py я безуспешно пытался сделать следующее:

urlpatterns = [
    path('', views.UserAuthenticationView.as_view()),
    path('login/', csrf_exempt(views.UserAuthenticationView.login)),

Я также не понимаю, что APIView должен автоматически csrf_exempt все представления внутри него, но мое представление register, которое соответствует post() методу UserAuthenticationView не работает по той же причине.

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