【问题标题】:CSRF Failed: CSRF token missing or incorrect after upgrading to django 1.10 from 1.8CSRF 失败:从 1.8 升级到 django 1.10 后 CSRF 令牌丢失或不正确
【发布时间】:2017-01-11 15:58:28
【问题描述】:

我通过 AJAX 向 api 发送一个 post 请求(当前页面和 api 都在同一主机下)。我收到csrf failed: csrf token missing or incorrect error。这发生在我从 1.8 升级到 django 1.10 时。我也检查了 django 1.9 并且在 1.9 上仍然存在错误。这是详细卷曲:

curl 'https://tru-staging.com/pagemaker/api/v1/carousel/slide/' -H 'Pragma: no-cache' -H 'Origin: https://tru-staging.com' -H 'Accept-Encoding: gzip, deflate, br' -H 'Accept-Language: en-US,en;q=0.8,ar;q=0.6' -H 'Authorization: Token undefined' -H 'Content-Type: application/json;charset=UTF-8' -H 'Accept: application/json, text/plain, */*' -H 'Cache-Control: no-cache' -H 'X-CSRFToken: UMQPAIb1OTl7MyiQLJttdKE8xOLz35pMaHeNGMMDqy0Jn3x8SpbaEUmzOQk7Fppr' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36' -H 'Cookie: _ga=GA1.2.2131330908.1484113382; sessionid=nnxqi67j18tblt985vayyz4ssyhdnfjm; csrftoken=o6gjW1Sxb1X23hI9RurDIAXjSuEbbgbMQJtMQyS2gT1yTnCGF80rmmB8pwSOSKKj' -H 'Connection: keep-alive' -H 'Referer: https://tru-staging.com/68/school_landing/' --data-binary '{"order":4,"carousel":736}' —compressed

【问题讨论】:

    标签: python django csrf django-csrf


    【解决方案1】:

    X-CSRFToken 标头与上述命令行中的 csrftoken cookie 值不匹配。具体错误信息来自:

    https://github.com/django/django/blob/master/django/middleware/csrf.py#L313

    这表明 CSRF 令牌确实不匹配。

    【讨论】:

    • 是什么原因造成的?
    • 在进行 AJAX 调用之前如何设置 X-CSRFToken?我假设你有一个 getCookie() 函数可以抓取它?
    • 我愿意。我是这样的设置标题:gist.github.com/sachitad/793b96e56ca719f77bae687085bcd99a
    • 会缓存一些东西吗?在 Django 1.8 下令牌是否匹配?
    • 清除缓存。仍然是同样的错误。是的,它在 django 1.8 及更低版本上匹配。
    猜你喜欢
    • 2014-12-25
    • 2020-09-19
    • 2021-07-14
    • 2014-02-26
    • 2021-10-01
    • 2021-11-13
    • 2012-04-20
    • 2012-09-25
    • 1970-01-01
    相关资源
    最近更新 更多