Cookies не отправляются с помощью Axios
У меня есть форма, построенная на Nuxt/vuejs. На стороне бэкенда на django включена CSRF защита, которая теперь ожидает две вещи в вызове Api X-CSRFToken как заголовок и csrftoken как Cookie, я протестировал Api, вызвав Api через Postman, который работает нормально, но в случае Vue он не отправляет Cookies с post запросом позвольте мне показать вам мой код
Запрос на пост в Axios
const headers = {
"X-CSRFToken": "some token",
"Cookie": "csrftoken=some token",
}
await axios.post(`onboarding/first-name-last-name-email/`, {
"first_name": "uneeb2",
"last_name": "sad",
"email": "asdsa@asd.colm"
}, {
headers: headers
}, {
withCredentials: true
})
Я также попробовал Fetch у него та же проблема
fetch(
'https://staging.goqube.io/api/onboarding/first-name-last-name-email/',
{ credentials: 'include' ,method: "POST",headers:headers} // could also try ''
).then(res => {
if (res.ok) return res.json()
// not hit since no 401
})
Важно упомянуть, что CORS включен сервером, поэтому я не делаю ничего конкретного для этого.
Я также попробовал установить cookie как родной по
document.cookie = "csrftoken=some token; Path=/; Expires=Mon, 16 Feb 2023 08:02:50 GMT;";
через это я вижу, что Cookie устанавливается в браузере, но это все еще не отправляет Cookie с пост-запросом
Как вы видите, я также попробовал withCredentials: true, что было одним из распространенных предложенных решений, но в моем случае это не сработало.
Что касается конфигурации сервера, сервер Django является отдельным удаленным сервером, то же самое относится и к Nuxt App.
Я борюсь с этим уже довольно долго, может ли кто-нибудь указать мне, в чем может быть проблема?
У меня была такая же проблема, вот как я ее решил
Для того, чтобы axios отправил cookies withCredentials
должно быть true
, и пока withCredentials
будет true
, бэкенд должен отправить заголовок Access-Control-Allow-Credentials
, иначе вы получите ошибку cors missing allow credentials и куки не будут установлены в браузере ( проблема сейчас в том, что axios не может отправить куки, поскольку они даже не были установлены в браузере для начала).
Вы сказали, что у вас включена функция CORS
, поэтому я предполагаю, что у вас есть corsheaders
в INSTALLED_APPS
и вы добавили url вашего vue front end в список CORS_ALLOWED_ORIGINS
в settings.py
. Вы также должны добавить CORS_ALLOW_CREDENTIALS = True
в settings.py
.
Теперь в вашем приложении vue задайте имена cookie и заголовков csrf, как показано ниже, таким образом вам не нужно будет вручную получать значение cookie и устанавливать его в заголовок X-CSRFToken
, axios сделает это сам.
axios.defaults.xsrfCookieName = 'csrftoken'
axios.defaults.xsrfHeaderName = "X-CSRFToken"
затем установите withCredentials
на true
во время выполнения запроса или вы можете установить его по умолчанию, как показано ниже
axios.defaults.withCredentials = true;
Вы можете обратиться к этой записи в блоге