簡體   English   中英

反應原生 Axios Django - Csrf 失敗引用檢查失敗沒有引用

[英]React native Axios Django - Csrf failed referer checking failed no referer

我正在使用 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 ,與 React.js 不同,未設置Referer標頭

卷曲- 工作正常

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. 從此鏈接中,我在 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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM