React native Axios Django — сбой Csrf проверка реферера не удалась нет реферера

#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 он не установлен. поэтому мы должны установить его вручную.

  1. По этой ссылке я установил заголовок реферера в 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});
};
  
  1. В Django settings.py я прокомментировал CSRF middleware
  2. В Django settings.py я добавил только TokenAuthentication класс для удаления SessionAuthentication .
 REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.TokenAuthentication',
    ]
}
  

Примечание — Пожалуйста, выполните шаги 2 и 3 на свой страх и риск, правильно ознакомившись с вашими требованиями. Я удалил промежуточное ПО CSRF, потому что мой API полностью зависел от токена для аутентификации. Мне ни в коем случае не нужен был CSRF.