Django, X-CSRFToken неправильно устанавливается в заголовке запроса
В основном, я получил это, чтобы фактически отправить токен csrf на фронтенд и установить его там в разделе cookie на вкладке приложения в окне dev в браузере:
@method_decorator(ensure_csrf_cookie)
def get(self, request, format=None):
return JsonResponse({'csrftoken':get_token(request)})
на стороне реакции:
useEffect(()=>{
axios.get('http://127.0.0.1:8000/csrf/').then((res)=>{
console.log(res.data)
Cookies.set('csrftoken',res.data.csrftoken)
})
},[])
let handleSubmit = (e) => {
e.preventDefault();
axios
.post("http://127.0.0.1:8000/signup/", signup, {
withCredentials: true,
headers: { "X-CSRFToken": Cookies.get("csrftoken") },
})
.then((res) => {
setDisabled(true)
setIsUp(true)
setTimeout(()=>{setIsUp(false)
redirect('/')},3000)
})
.catch((e) => {
console.log(e.response.data)
let err = e.response.data
setError(err);
});
};
на моей локальной машине (на локальных хостах):
я получаю эти значения для соответствия:
Как вы можете видеть, оба Cookie
и X-CSRFToken
совпадают в заголовке запроса, однако, в продакшене:
и самое странное, что в заголовке запроса имя ключа на локальном хосте Cookie
, а в продакшене cookie
(разница между c и C)
и, конечно же, я получаю ошибку, когда делаю post запрос на рабочем сервере:
<p>CSRF verification failed. Request aborted.</p>
</div>
<div id="info">
<h2>Help</h2>
<p>Reason given for failure:</p>
<pre> CSRF token from the 'X-Csrftoken' HTTP header incorrect.
</pre>
<p>In general, this can occur when there is a genuine Cross Site Request Forgery, or when
<a href="https://docs.djangoproject.com/en/4.0/ref/csrf/">Django’s
помогите мне понять проблему, и ПОЖАЛУЙСТА помогите мне понять правильный способ получения токена csrf в случае, если он отсутствует на вкладке application
в консоли dev в браузере
Я думаю, вы что-то путаете, CSRF всегда присутствует по умолчанию, что означает, что вам не нужно генерировать csrf-token
.
Для Axios
просто используйте его следующим образом:
axios.defaults.xsrfCookieName = 'csrftoken'
axios.defaults.xsrfHeaderName = "X-CSRFTOKEN"
axios.post("/url",{
key: value
})
.then(function (response) {
//your code....
})
.catch(function (error) {
//error handling
});