首页 > 解决方案 > 跨域 POST 请求的 CSRF 验证在生产中失败

问题描述

HTTP_X_CSRFTOKEN 标头与 csrftoken cookie 中的内容不匹配。

如何检查 cookie?Set-Cookie 不会显示在跨域请求的响应标头中。

我已经按照以下说明进行操作:

使用 Django 的 CSRF,使用 Axios 的 React+Redux

有趣的是,我发现“X-CSRFTOKEN”在服务器请求标头上转换为“HTTP_X_CSRFTOKEN”。

在 localhost 下的开发环境中工作正常(尽管我使用 2 个不同的端口 - 一个用于 django,另一个用于我的前端)。

更新:

似乎没有为跨域请求正确设置 csrktoken cookie(尽管浏览器将其显示在请求标头中),因此不会发送 X-CSRFTOKEN。

我最终添加了一个 API 调用以使用 GET 请求返回当前的 csrftoken,然后使用 X-CSRFTOKEN 标头将其发回。

标签: djangocross-domaincsrf

解决方案


你一开始没有提到你是如何csrftoken从服务器获取的,所以我假设它已经存在于你的浏览器中。除了X-CSRFToken标头,还使用withCredentials: true​​. 我正在使用js-cookiecsrftoken从 cookie 中获取。

import Cookies from 'js-cookie';

axios({
    url: 'http://localhost:8000/graphql',
    method: 'post',
    withCredentials: true,
    data: {
        query: `
            {
                // Your query here
            }     
        `
    },
    headers: {
        "X-CSRFToken": Cookies.get('csrftoken')
    }
})

假设CORS_ALLOW_CREDENTIALS = Truesettings.py使用的是django-cors-headers. 否则,cookie 将不被接受。


推荐阅读