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 не работает по той же причине.