csrf 令牌缺少 axios 到 django rest 框架

IT技术 reactjs django django-rest-framework axios
2021-05-28 09:21:38

我试图发出发布请求并面临错误代码 403,csrf 令牌丢失.. 尝试了很多方法,但最后没有工作,最后在 settings.py 上禁用了 csrf 令牌并工作,所以发现问题出在 csrf 令牌中

class Axios extends React.Component{

constructor(){
    super()
    this.state = {
        persons: []
    }
}



post(){
    axios.post('http://127.0.0.1:8000/api/create', {
        title: 'titan',
        body: 'this is working',
      })
    
      .then(function (response) {
        console.log(response);
    })
}

get(){
    axios.get('http://127.0.0.1:8000/api').then(Response=>{
        console.log(Response.data)
    })
}
componentDidMount(){

    this.post();
    this.get();
    
}



render(){
    return(
        <div>
            <h1>fetch</h1>
        </div>
    )
}
}

export default Axios;

这是我的代码,请告诉我一种将 csrf 令牌放入此以及导入语句的方法...

目前正在使用 axios 谢谢

1个回答

有三种方式。您可以在每个 axios 调用的标头中手动包含令牌,您可以xsrfHeaderName在每个调用中设置 axios ,或者您设置一个默认的xsrfHeaderName.

1.手动添加

假设您已将令牌的值存储在名为 的变量中csrfToken在 axios 调用中设置标题:

// ...
method: 'post',
url: '/api/data',
data: {...},
headers: {"X-CSRFToken": csrfToken},
// ...

2.xsrfHeaderName通话设置

添加这个:

// ...
method: 'post',
url: '/api/data',
data: {...},
xsrfHeaderName: "X-CSRFToken",
// ...

然后在您的settings.py文件中,添加以下行:

CSRF_COOKIE_NAME = "XSRF-TOKEN"

3. 设置默认标题

您可以为 axios 设置默认标头,而不是在每次调用中定义标头。

在您导入 axios 以进行调用的文件中,在您的导入下方添加以下内容:

axios.defaults.xsrfHeaderName = "X-CSRFToken";

然后在您的settings.py文件中,添加以下行:

CSRF_COOKIE_NAME = "XSRF-TOKEN"

检查这个答案

这是如何手动添加它的示例:

class Axios extends React.Component{    

constructor(){
    super()
    this.state = {
        persons: []
    }
}
function getCookie(name) {
    var cookieValue = null;
    if (document.cookie && document.cookie !== '') {
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length; i++) {
            var cookie = jQuery.trim(cookies[i]);
            if (cookie.substring(0, name.length + 1) === (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}

var CSRF_TOKEN=getCookie('csrftoken');
post(){
    axios.post('http://127.0.0.1:8000/api/create', {
        title: 'titan',
        body: 'this is working',
    headers:{
                    'X-CSRFToken':CSRF_TOKEN,
                    'Accept': 'application/json',
                    'Content-Type': 'application/json',
                },
          })
        
      .then(function (response) {
        console.log(response);
    })
}

get(){
    axios.get('http://127.0.0.1:8000/api').then(Response=>{
        console.log(Response.data)
    })
}
componentDidMount(){

    this.post();
    this.get();
    
}    
render(){
    return(
        <div>
            <h1>fetch</h1>
        </div>
    )
}
}
export default Axios;