React,Django:用户更改密码后如何管理会话?

React, Django: How do I manage a session after a user changes their password?

我正在 React 中开发一个管理面板,其中 Django 用于用户管理,以及其他操作。

Django 负责 ORM 和用户登录。
当用户首次登录时,React 应用程序获取会话 id 和 csrf token。该应用程序从文档 cookie 中请求 csrf 令牌,这是用于以后 REST 查询的令牌。

Issue/Challenge:
其中一个应用程序组件允许用户更改密码。
但是,在成功更改密码后,会话 id 和 csrf token 过期并且 REST 查询我从那时起做的都是未经授权的。

如果我重新加载页面,之后会话就会过期。我试图再次获取令牌,但它不起作用。

问题:

我不知道这是否是通常的处理方式。

下面是我用来获取令牌的函数:

getCookie(name) {
    console.log(name);

    let cookieValue = null;
    if (document.cookie && document.cookie !== '') {
      const cookies = document.cookie.split(';');
      for (let i = 0; i < cookies.length; i += 1) {
        const cookie = jQuery.trim(cookies[i]);
        // 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;
        }
      }
    }
    console.log(cookieValue);
    this.setState({
      token: cookieValue,
    });

//getCookie('csrftoken')

我通常不使用 cookie,除了获取 csrf token,所以如果有任何帮助,我将不胜感激。

更新

我发现问题可能是由于 Django 引起的:https://docs.djangoproject.com/en/3.1/topics/auth/default/#session-invalidation-on-password-change

因为我正在使用 Django Rest Framework 更改密码——遵循本教程:https://medium.com/django-rest/django-rest-framework-change-password-and-update-profile-1db0c144c0a3——我在序列化程序中使用函数 update_session_auth_hash,如下所示:

## serializer
    def update(self, instance, validated_data):
        instance.set_password(validated_data['password'])
        instance.save()

        request = self.context['request']
        user = request.user
        update_session_auth_hash(request, user)
             
        return instance

我也不工作...

我终于设法通过使用 instance 而不是 user 使其工作:

## serializer
    def update(self, instance, validated_data):
        instance.set_password(validated_data['password'])
        instance.save()

        request = self.context['request']
        update_session_auth_hash(request, instance)
             
        return instance