如何在Django RESTful API和React中使用csrf_token?

时间:2018-06-07 04:09:05

标签: python django reactjs django-rest-framework

我之前有过Django的经历。如果在{csrf_token}模板中添加行Django,则Django会处理csrf_token的功能。但是当我尝试使用Django REST Framework开发API时,我就陷入了困境。如何在csrf_token(后端,使用API开发)和Django REST Framework(前端)之类的Django模板中添加和处理React Native/React JS等功能?

3 个答案:

答案 0 :(得分:3)

第一步是获取可以从Django csrftoken cookie中检索的CSRF令牌。

现在从Django docs您可以了解如何使用这个简单的JavaScript函数从cookie中获取csrf令牌:

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;
}

现在,您可以通过调用getCookie('csrftoken')函数

来检索CSRF令牌
var csrftoken = getCookie('csrftoken');

接下来,您可以在使用fetch()发送请求时使用此csrf标记,方法是将检索到的标记分配给X-CSRFToken标头。

  fetch(url, {
    credentials: 'include',
    method: 'POST',
    mode: 'same-origin',
    headers: {
      'Accept': 'application/json',
      'Content-Type': 'application/json',
      'X-CSRFToken': csrftoken
    },
    body: {}
   })
  }

以React Forms呈现CSRF令牌:

如果使用React渲染表单而不是Django模板,则还需要渲染csrf标记,因为Django标记{ % csrf_token % }在客户端不可用,因此您需要创建一个更高阶的组件来检索使用getCookie()函数的令牌并以任何形式呈现它。

让我们在csrftoken.js文件中添加一些行。

import React from 'react';

var csrftoken = getCookie('csrftoken');

const CSRFToken = () => {
    return (
        <input type="hidden" name="csrfmiddlewaretoken" value={csrftoken} />
    );
};
export default CSRFToken;

然后你可以简单地导入它并在你的表单中调用它

import React, { Component , PropTypes} from 'react';

import CSRFToken from './csrftoken';


class aForm extends Component {
    render() {

        return (
                 <form action="/endpoint" method="post">
                        <CSRFToken />
                        <button type="submit">Send</button>
                 </form>
        );
    }
}

export default aForm;

Django CSRF Coo​​kie

React动态呈现组件,这就是为什么如果使用React渲染表单,Django可能无法设置CSRF令牌cookie。这就是Django docs关于这一点的说法:

  

如果您的视图未呈现包含csrftoken的模板   模板标签,Django可能不会设置CSRF令牌cookie。这是   在表单动态添加到页面的情况下很常见。至   解决这种情况,Django提供了一个强制的视图装饰器   设置cookie:ensurecsrf_cookie()。

要解决此问题,Django会提供您需要添加到视图功能的ensurecsrfcookie装饰器。例如:

from django.views.decorators.csrf import ensure_csrf_cookie

@ensure_csrf_cookie
def myview(request):

答案 1 :(得分:0)

CSRF是浏览器上下文中的跨站点请求伪造攻击,如果为多客户端提供api,则没有必要。一般来说Restful api POST请求体是json,你不能在其中添加csrf_token。

但是如果你使用urlencode Post请求体,你可以为所有post请求添加一个intecepto来将csrf_token注入请求体。我使用此方法将api auth令牌添加到请求标头

我的英语不太好,抱歉。

答案 2 :(得分:0)

我在反应中使用了jquery for ajax,所以在这种情况下这是一个解决方案:

cordova