0

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

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

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

    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. 理想情况下,我想使用类似于getCookieDjango 文档中演示的方法

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_SAMESITE无济于事CSRF_USE_SESSIONS

另请注意,如果我在POST安装组件后发出请求,则在请求上成功设置了令牌 - 但我需要在正文中添加默认 Django 身份验证视图的令牌!

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

伊恩

4

1 回答 1

0

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

于 2020-01-12T23:35:37.513 回答