#reactjs #django #react-native #axios #django-csrf
#reactjs #django #react-native #axios #django-csrf
Вопрос:
Я вызываю Django
внутренний API из React
интерфейса, используя axios.
Для этого api, который является login api, я использую пакет Django Knox в логике.
React.js — Я звоню axios.request(method, url, data)
, и вызов api работает правильно. Когда я перешел в Developer tools
> Network
, я вижу Referer
, что заголовок установлен на React.js веб-сайт в заголовке запроса и никакого другого заголовка, связанного с csrf. В заголовках ответа я вижу два set-cookie
заголовка csrftoken
и sessionid.
React Native — так же, как я вызываю api, но api возвращает ошибку csrf failed referer checking failed - no referer
. Когда я проверял response.config
, Referer
заголовок не установлен в отличие от React.js
Curl — работает нормально
httpie — работает нормально
Как я могу избавиться от этой ошибки.
Примечание 1 — Мой серверный сервер Django основан на логике токенов api, а не на csrf в любом случае.
Примечание 2 — React.js и Django размещены на разных доменах. Я столкнулся с ошибкой в React Native, которая находится в режиме отладки.
Обновление 1 — После отключения промежуточного ПО CSRF в Django settings.py , теперь я получаю только один заголовок setCookie (csrftoken больше не получен), но та же ошибка все еще сохраняется.
Ответ №1:
Django Rest api нужен заголовок реферера.
В случае React.js он устанавливается автоматически (возможно, с помощью браузера), и его значением является текущий веб-сайт.
Но в случае React Native он не установлен. поэтому мы должны установить его вручную.
- По этой ссылке я установил заголовок реферера в axios. смотрите код ниже
export const axiosAPICall = (method,url,data,headers) => {
let request = {
method: method,
url: url,
};
if (data) {
request['data'] = data;
}
if (headers) {
request['headers'] = headers;
}
// Referer is auto-set in react.js as same website value.
// for react-native we have to set it manually to target api:port
request['headers'] = {
...request['headers'],
Referer: url
}
return axios.request(request)
.then(res => res.data)
.catch(error => {throw error});
};
- В Django
settings.py
я прокомментировалCSRF middleware
- В Django
settings.py
я добавил толькоTokenAuthentication
класс для удаленияSessionAuthentication
.
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.TokenAuthentication',
]
}
Примечание — Пожалуйста, выполните шаги 2 и 3 на свой страх и риск, правильно ознакомившись с вашими требованиями. Я удалил промежуточное ПО CSRF, потому что мой API полностью зависел от токена для аутентификации. Мне ни в коем случае не нужен был CSRF.