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

Posted

技术标签:

【中文标题】React,Django:用户更改密码后如何管理会话?【英文标题】:React, Django: How do I manage a session after a user changes their password? 【发布时间】:2021-03-29 05:38:17 【问题描述】:

我正在ReactDjango 中开发一个管理面板,用于用户管理等操作。

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

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

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

问题:

更改密码后如何更新会话id? 我是否应该将用户发送到应用外让他们再次登录?

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

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

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')

除了获取 csrf token 之外,我通常不使用 cookie,因此我将不胜感激。

更新

我发现问题可能是由于 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

我也不上班……

【问题讨论】:

大多数网站在更改用户密码后都需要重新登录 【参考方案1】:

我终于设法通过使用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

【讨论】:

以上是关于React,Django:用户更改密码后如何管理会话?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 django 管理站点中删除更改密码链接?

升级为域控制器后如何更改域控管理员密码?

在Django Admin中更改密码

获取 Django 管理员密码

当他从所有浏览器(Django-rest-auth,JWT)更改密码时如何注销用户?

在 Django Admin 中更改密码