React Native Axios Django-Csrf引用检查失败,没有引用

问题描述

我正在使用axios从Django前端调用React后端api。

对于该登录API,我在逻辑上使用Django Knox包。

React.js -我正在调用axios.request(method,url,data),并且api调用正常工作。 当我去Developer tools> Network时,我可以在请求标头中看到Referer标头设置为React.js网站,而没有其他与csrf相关的标头。在Response标头中,我可以看到两个set-cookie标头csrftokensessionid.

React Native -我调用api的方式相同,但api返回错误csrf Failed referer checking Failed - no referer。当我检查response.config时,没有设置Referer头,这与React.js不同

卷曲-效果很好

httpie -工作正常

如何摆脱这个错误

注释1 -我的Django后端基于api令牌逻辑,而不以任何方式都不是csrf。

注释2 -React.js和Django托管在不同的域中。我在处于调试模式的React Native中遇到错误

更新1 -在Django settings.py中禁用CSRF中间件后,现在我只得到一个setCookie标头(不再获得csrftoken),但仍然存在相同的错误

解决方法

Django Rest API需要一个Referer标头。

对于React.js,它是自动设置的(可能是通过浏览器设置的),其值为当前网站。

但是在React Native的情况下,它没有设置。所以我们必须手动设置它。

  1. 从此link,我在axios中设置Referer标头。参见下面的代码
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。