ReactJS 和 Django:如何以正确的方式使用 axios 发送 csrf 令牌?

Posted

技术标签:

【中文标题】ReactJS 和 Django:如何以正确的方式使用 axios 发送 csrf 令牌?【英文标题】:ReactJS & Django : How can I send csrf token with axios in a proper way? 【发布时间】:2018-10-16 11:34:31 【问题描述】:

我对在 Django 中使用 ReactJS 还是很陌生。

我想要的很简单。我想发送创建帐户的请求。 前端服务器和后端服务器完全分开。它们只与 AJAX 通信,仅此而已,它们甚至不在同一个服务器中。

我尝试了多种方法来发送创建帐户的请求,但均未奏效。

这是我在 javascript 中尝试过的:

    在 axios 上添加一个名为 withCredentials:true 的选项。这会在标头上添加 cookie,但 django 说“csrftoken 不正确或未设置。”

    设置如下:

    axios.defaults.xsrfHeaderName = "X-CSRFToken";
    axios.defaults.xsrfCookieName = 'csrftoken';
    

-> 这不会产生任何影响。

    设置如下:

    axios.defaults.headers.common = 
      'X-Requested-With': 'XMLHttpRequest',
      'X-CSRF-TOKEN' : (document.cookie).replace("csrftoken=", "")
    ;
    

-> 这使得 axios 只发出“选项”方法请求。但我不知道为什么,当然,这不起作用。

这是我在 Django 的 settings.py 中所做的更改:

CSRF_COOKIE_NAME = "X-CSRFToken"
CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_CREDENTIALS = True
CORS_EXPOSE_HEADERS = (
    'Access-Control-Allow-Origin: *',
)

当然,我在执行一些注册操作的视图上方添加了@ensure_csrf_cookie。

有没有办法解决这个问题?我为此花费了很多时间。我真的需要你的帮助。谢谢。

【问题讨论】:

你试过npmjs.com/package/django-react-csrftoken吗? 致 Arpit,是的,我也试过了。我为我的视图设置了一些注册的东西 CSRF with Django, React+Redux using Axios的可能重复 给 Kiara,是的,我也试过了。 【参考方案1】:

您可以通过 npm(或其他适合您的方法)链接 here 安装 js-cookie

js-cookie 中调用 Cookie,如下所示: import Cookies from 'js-cookie';

然后通过执行以下操作获取 cookie:Cookies.get()

Cookies.get() 给你一个包含csrftoken 的对象。所以你可以整体做这样的事情:

const cookies = Cookies.get()

然后在您的 axios 请求的标头中,您可以添加以下内容:

headers: new Headers("Content-Type": "application/json", 'X-CSRFToken': cookies.csrftoken)

【讨论】:

以上是关于ReactJS 和 Django:如何以正确的方式使用 axios 发送 csrf 令牌?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Reactjs 的组件状态下使用 OOP?

reactjs和django如何结合或集成

ReactJS:如何以编程方式将用户重定向到另一个页面?

如何使用reactjs使用conatct类正确获取记录列表

如何修复 Reactjs、Django、Django Rest Frame 工作项目中的“net::ERR_CONNECTION_REFUSED 和错误:网络错误”错误

如何解决“未捕获的类型错误:无法读取未定义的属性'参数'”reactjs + django