【问题标题】:How to get and include the CSRF token in the header when working with REST API使用 REST API 时如何在标头中获取和包含 CSRF 令牌
【发布时间】:2017-06-03 11:05:43
【问题描述】:

我正在使用 python Django 来创建 REST API。客户端是在 react 中开发的,并且是作为独立应用程序制作的。我正在使用 axios 来触发 http 请求。我需要在每个 post 请求中传递 CSRF 令牌,但无法从浏览器获取CSRF令牌。

【问题讨论】:

  • CSRF 令牌可作为 cookie 使用。究竟是什么问题?如何使用 React 从浏览器获取它?
  • csrf 令牌没有在我的浏览器中保存为 cookie
  • 如果CSRF_COOKIE_SECURE = True 出现在您的settings.py 中并且您以非安全方式访问该站点(例如从本地主机),则会发生这种情况。
  • 是的..它有效,现在我可以在浏览器控制台中看到 cookie。但无法使用 document.cookie 获取它
  • 你检查过 django 文档吗? & 用于检索 cookie 的 Javascript 代码 docs.djangoproject.com/en/1.11/ref/csrf/…

标签: django rest reactjs axios


【解决方案1】:

在进行 Ajax 请求时如何传递你的 CSRF?

首先,确保您的设置文件的中间件列表中有 django.middleware.csrf.CsrfViewMiddleware。此中间件在 cookie 中设置 CSRF_TOKEN,以便您可以为您的 ajax 请求检索它。

其次,Django 现在可以将 CSRF 存储在会话中。但是,在您的特定情况下,您不希望会话中出现 CSRF_TOKEN 。确保您有 CSRF_USE_SESSIONS = False(这是默认值)以在 cookie 中包含 CSRF。

如果您检查 cookie,您现在应该在其中有一个 CSRF_TOKEN。如果您使用带有以下代码的 jquery,则可以将其动态添加到您的 ajax 请求中。

https://docs.djangoproject.com/en/1.11/ref/csrf/#setting-the-token-on-the-ajax-request

我是说如果你使用 Jquery 是因为你使用的是 React,它不需要 Jquery 来执行 Ajax 请求,这取决于你如何处理它们。

【讨论】:

  • 我在这里可能是错的,但是,当设置CSRF_USE_SESSIONS = False 时,你不是基本上将秘密存储在cookie 中,而它通常会在会话中?我尝试过使用 cookie,但我所有的变异 http 请求都被拒绝了。我以为我正确地发送了令牌,但我现在假设这是因为 cookie 实际上是 CSRF 机密,而不是令牌。此外,如果 CSRF cookie 确实是一个令牌,那么如果我得到的唯一 cookie 是会话 ID,我如何将它与会话一起使用?
猜你喜欢
  • 1970-01-01
  • 2017-01-15
  • 2015-07-20
  • 2015-02-11
  • 2019-10-08
  • 2017-01-18
  • 2021-05-04
  • 2020-05-27
  • 1970-01-01
相关资源
最近更新 更多