【发布时间】:2018-08-20 18:14:06
【问题描述】:
我们正在将前端移动到一个单独的项目中(从 Django 中移出)。这是一个 Javascript 单页应用程序。
其中一个原因是为了让我们的前端开发人员更轻松地完成他们的工作,而不必在本地运行整个项目(包括 API)。相反,我们希望他们能够与我们设置的测试 API 进行通信。
在此过程中,我们已经设法解决了大部分 CORS/CSRF 问题。但是现在我们遇到了一些我无法在任何地方找到解决方案的问题,尽管阅读了大量文档和 SO 答案。
前端和 API 来自不同的域(在开发期间 localhost 和 test-api.example.com)。到目前为止,虽然从同一个域提供服务,但前端已经能够从 API (Django) 设置的 csrftoken cookie 中获取 CSRF 令牌。但是当从不同的域提供服务时,前端 (localhost) 无法访问 API (api-test.example.com) 的 cookie。
我正在尝试找出解决此问题的方法,以某种方式将 CSRF 令牌传递到前端。 The Django docs recommend to set a custom X-CSRFToken header 用于 AJAX 请求。如果我们在每个响应中类似地将 CSRF 令牌作为标头提供并且(通过Access-Control-Expose-Headers)允许前端读取此标头,我们会损害 CSRF 保护吗?
鉴于我们已经为 API 正确设置了 CORS(即只允许某些域对 API 进行跨源请求),第 3 方站点上的 JS 应该无法读取此响应标头,因此无法在我们的用户背后发出妥协的 AJAX 请求,对吗?还是我错过了一些重要的事情?
或者还有其他更好的方法来实现我们想要的吗?
【问题讨论】:
标签: javascript django django-rest-framework cors csrf