Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Django Rest Framework Simple JWT TokenRefresh返回用户名和ID_Django_Authentication_Django Rest Framework_Jwt_Django Rest Framework Simplejwt - Fatal编程技术网

使用Django Rest Framework Simple JWT TokenRefresh返回用户名和ID

使用Django Rest Framework Simple JWT TokenRefresh返回用户名和ID,django,authentication,django-rest-framework,jwt,django-rest-framework-simplejwt,Django,Authentication,Django Rest Framework,Jwt,Django Rest Framework Simplejwt,我使用Django Rest框架和Django Rest框架simplejwt进行身份验证。react正在使用正在发送的数据 到目前为止,我已经能够对令牌获取PairSerializer进行子类化,以便在登录/获取新令牌时返回用户名和ID class MyTokenObtainPairSerializer(TokenObtainPairSerializer): def validate(self, attrs): data = super(MyTokenObtainPai

我使用Django Rest框架和Django Rest框架simplejwt进行身份验证。react正在使用正在发送的数据

到目前为止,我已经能够对
令牌获取PairSerializer
进行子类化,以便在登录/获取新令牌时返回用户名和ID

class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
    def validate(self, attrs):
        data = super(MyTokenObtainPairSerializer, self).validate(attrs)

        data.update({'user': self.user.username})
        data.update({'id': self.user.id})

        return data
我试图在刷新令牌时返回用户用户名和id。但是,这不起作用:

class MyTokenRefreshSerializer(TokenRefreshSerializer):

    def validate(self, attrs):
        data = super(MyTokenRefreshSerializer, self).validate(attrs)
        user = self.context['request'].user
        data.update({'user': user.username})
        data.update({'id': user.id})

        return data  
在这里,用户名总是以空字符串的形式返回,ID总是以null的形式返回

我尝试了许多不同的方法,包括尝试在视图本身中更新这些信息,但似乎无法使其正常工作。我注意到,
TokenRefreshSerializer
子类
Serializer.Serializer
而TokenActainPairSerializer子类
TokenActainSerializer
,它本身使用Django身份验证对用户进行身份验证。这似乎需要密码(如用户登录时),但很明显,在刷新令牌时不会提供密码

我的问题是,刷新令牌时,如何返回当前用户的用户名和id(或任意信息)

接下来的问题是,在用户首次登录时将该信息保存到前端的localStorage中,并在每次后续访问时重新填充该数据(直到用户注销或刷新令牌不再有效)是否更实际


请注意:这不是类似问题的复述,例如,因为我的目标是更新代币。初始的
TokenActainPairView
很容易子类化和实现。

因为刷新令牌端点没有设置经过身份验证的权限,所以您只剩下刷新令牌来获取用户信息。所以我不认为有任何其他方法,除了解码该令牌并获取数据。您可能可以在后端进行解码,这会自动回答您的后续问题(是的,您应该这样做)现在将设置是否应在localstorage上保存用户信息,并在随后点击使用access token作为request.user字段的受保护api时刷新该信息,并且您可以获取用户数据并刷新localstorage,以防发生某些用户更新

正如您在文章中提到的,重写
MyTokenRefreshSerializer
class@ArakkalAbu在链接的帖子中,它说答案已经过时,我们需要覆盖validate方法。这不对吗?我只是好奇,因为如果它过时了,我会远离它。@ArakkalAbu我认为在查看源代码和我看到的错误时,这是行不通的。特别是因为
MyTokenRefreshSerializer
上不会有
self.user
。试图访问它将导致错误。分配它只会返回一个空字符串(如果使用
request.user
来分配值)。为了解决这个问题,我只需使用我需要的信息创建一个自定义令牌声明,并在浏览器中对其进行解码。但是可能有一种方法可以直接在响应中发送数据?因为刷新令牌端点没有设置经过身份验证的权限,所以您只剩下刷新令牌来获取用户信息。所以我不认为有任何其他方法,除了解码该令牌并获取数据。您可能可以在后端进行解码,这会自动回答您的后续问题(是的,您应该这样做)现在将设置是否应在localstorage上保存用户信息,并在随后点击使用access token作为request.user字段的受保护api时刷新该信息,并且您可以获取用户数据并刷新localstorage,以防发生某些用户更新。