带有 React 的 Django DRF:如何获取 CSRF cookie?

Posted

技术标签:

【中文标题】带有 React 的 Django DRF:如何获取 CSRF cookie?【英文标题】:Django DRF with React: How to obtain CSRF cookie? 【发布时间】:2020-08-17 00:14:14 【问题描述】:

我有一个在 frontend.example.com 运行的 React 前端和一个在 backend.example.com 运行 DRF 的 Django 后端。我正在使用 Django 会话身份验证,我想正确实现 CSRF protection。

以 React 登录页面 frontend.example.com/login 为例。这是用户第一次访问该页面。有一个带有用户名和密码的表单,在提交时会向 Django 后端创建一个新的 POST 请求。据我所知,CSRF 令牌 cookie 应该已经包含在此请求中,对吧?

如何从 Django 后端获取 CSRF 令牌?我正在考虑在加载登录页面时向 Django 后端发出 GET 请求以获取该 CSRF 令牌 cookie。这是这样做的方法还是有其他最佳做法?

【问题讨论】:

【参考方案1】:

Django 有一个 AJAX 请求和如何处理 CSRF 的部分:AJAX

使用此方法,您应该为每个发布请求反复发送令牌。另一种方法是使用 CORS。在此方法中,您仅响应已列入白名单的域,并且标头也已列入白名单。因此,您无需获取和传递 CSRF 令牌,而是检查请求是否来自正确的域,然后您可以对其进行响应。并结合令牌系统进行用户身份验证,您应该会很好。

如果你使用 DRF,你可以使用这个包来处理 CORS:django-cors-headers

使用速率限制还可以帮助您避免垃圾邮件和机器人造成明显的危害。

【讨论】:

感谢您的回答!我阅读了您链接到的 AJAX 请求 CSRF 部分,但我不明白如何在不执行任何请求的情况下最初接收我的表单的 CSRF 令牌。我已经在使用 CORS,所以对我的后端的任何请求都来自 frontend.example.com 如果您使用内置模板引擎,Django 会将令牌添加到 cookie 中,但如果您通常使用 react 动态呈现表单,则它可能不可用。此外,您使用不能与 csrf 令牌一起使用的 JSON 发布数据。如果您使用 django 渲染表单,则 csrf 在用户 cookie 上可用,否则,您不需要它,CORS 就足够了。 你可以在这里找到例子:***.com/questions/50732815/… 为什么我不能在我的 POST JSON 数据中添加 CSRF cookie 或在请求标头中发送 CSRF 令牌? 查看此处了解更多详细信息以及如果您真的需要如何操作:security.stackexchange.com/questions/170477/…

以上是关于带有 React 的 Django DRF:如何获取 CSRF cookie?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 AWS Elastic Beanstalk 上使用 Nginx、React、Webpack、Gunicorn、PostgreSQL、Django 和 DRF 部署应用程序?如何使用此应用程序处

带有 DRF 的 Django-filter - 如何在使用相同查找应用多个值时执行“和”?

如何在 Django Rest Framework 中检索外部 JSON 文件以用于 React?

Django(DRF)和React - 禁止(未设置CSRF cookie)

如何在 DRF + django-rest-auth 中使用自定义用户模型保存注册时的额外字段

使用 React 和 Django REST Framework 构建你的网站