我正在尝试通过AJAX从POST
向abc.com
(这是一个Django应用程序)发出xyz.com
请求。
我通过GET
对xyz.com
上的网址发出OPTIONS
请求来获取CSRF令牌,但在预检请求中向xyz.com
发出OPTIONS
请求时,令牌会更改。< / p>
有没有办法在预检请求中获得{{1}}请求的响应?
注意:
我遵循以下来源的指示:
答案 0 :(得分:3)
Django CSRF保护将允许OPTIONS请求,因此第一阶段没有问题:
https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#how-it-works
如果我理解正确,那么您希望允许下一个请求(例如跨域POST)。为了使其工作并超越Django的CSRF保护,请求必须发送CSRF令牌(在POST数据或AJAX的头文件中)和匹配的CSRF cookie。
现在,跨域限制使得abc.com无法为xyz.com设置或读取cookie,无论是来自javascript还是来自服务器端响应。因此,这种方法是不可能的。
相反,您必须将@csrf_exempt
应用于视图。这将允许任何网站发布到它。因此,您需要为视图构建一些其他保护。当然,您可以自行检查保护的安全性。请记住,“Referer”和“Origin”标题可以很容易地用像curl这样基本的东西伪造。
答案 1 :(得分:1)
请参阅django-cors-headers
,您可能会发现它更适合解决您的问题:
https://github.com/ottoyiu/django-cors-headers/
Django-rest-framework recommends http://www.django-rest-framework.org/topics/ajax-csrf-cors