从响应标头解析Django CSRF令牌

时间:2020-01-12 22:27:53

标签: csrf django-csrf csrf-token

首先,我知道有关CSRF令牌/ Django的许多问题,但是我还没有发现对我所处的场景有用的任何问题。

我正在尝试将Django的内置密码重置端点与React前端一起使用。我的目标是在通过React而不是使用Django模板显示相关表单时,使用后端功能(生成令牌,电子邮件响应等)。前端和后端托管在两个唯一的服务器上。

在我的前端代码中,当我的React组件挂载以获取CSRF令牌时,我对password_reset端点进行了调用。

    componentDidMount() {
        let url = "http://(raw ip address)/accounts/password_reset/"

        fetch(url, {
            credentials: 'include',
        })
    }

令牌在响应标头中的接收方式为

Set-Cookie: csrftoken=b...e; expires=Sun, 10 Jan 2021 21:50:20 GMT; Max-Age=31449600; Path=/; SameSite=Lax

这里是我的问题开始的地方-我无法检查“存储”标签中的令牌,并且document.cookie中没有令牌值。理想情况下,我想使用类似Django文档中演示的getCookie方法

function getCookie(name) {
    var cookieValue = null;
    if (document.cookie && document.cookie !== '') {
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length; i++) {
            var cookie = cookies[i].trim();
            // Does this cookie string begin with the name we want?
            if (cookie.substring(0, name.length + 1) === (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}

但这假设令牌值已正确存储在document.cookie中。

我相关的Django设置都是默认值,尽管我已经遍历了CSRF_COOKIE_SAMESITECSRF_USE_SESSIONS的有效选项,但无济于事。

另外要注意的是,如果在安装组件后发出POST请求,则令牌已在请求上成功设置-但我需要在主体中添加该令牌以获取默认的Django身份验证视图! / p>

任何建议或见解将不胜感激!

伊恩

1 个答案:

答案 0 :(得分:0)

根据Django文档,如果您的视图未呈现其中带有csrf_token标记的html模板,由于您未使用Django的内置模板进行输出,因此我想这是您的情况,将不会设置cookie。一种可能的解决方案是在urlpatterns中包装对ensure_csrf_token装饰器的视图调用。