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 查询我从那时起做的都是未经授权的。
如果我重新加载页面,之后会话就会过期。我试图再次获取令牌,但它不起作用。
问题:
- 如何在更改密码后更新会话
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')
我通常不使用 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
我正在 React
中开发一个管理面板,其中 Django
用于用户管理,以及其他操作。
Django
负责 ORM 和用户登录。
当用户首次登录时,React
应用程序获取会话 id
和 csrf token
。该应用程序从文档 cookie 中请求 csrf 令牌,这是用于以后 REST 查询的令牌。
Issue/Challenge:
其中一个应用程序组件允许用户更改密码。
但是,在成功更改密码后,会话 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')
我通常不使用 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