【问题标题】:React native Axios Django - Csrf failed referer checking failed no refererReact native Axios Django - Csrf failed referer checks failed no referer
【发布时间】:2021-01-18 15:13:56
【问题描述】:

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

对于登录 api 的 api,我在逻辑中使用 Django Knox 包。

React.js - 我正在调用 axios.request(method, url, data) 并且 api 调用工作正常。 当我转到Developer tools>Network 时,我可以看到Referer 标头在请求标头中设置为 React.js 网站,而没有其他与 csrf 相关的标头。在响应标头中,我可以看到两个 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),但同样的错误仍然存​​在。

【问题讨论】:

    标签: reactjs django react-native axios django-csrf


    【解决方案1】:

    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。

    【讨论】:

      猜你喜欢
      • 2015-09-26
      • 1970-01-01
      • 2022-11-07
      • 1970-01-01
      • 2021-12-20
      • 2021-08-07
      • 2022-07-18
      • 2019-08-04
      • 1970-01-01
      相关资源
      最近更新 更多